1.Security Cookie
- 在函數(shù)調(diào)用發(fā)生時,向棧幀內(nèi)壓入一個額外的隨機 DWORD,這個隨機數(shù)被稱做Security Cookie
- Security Cookie 位于 EBP 之前, 系統(tǒng)還將在.data的內(nèi)存區(qū)域中存放一個 Security Cookie的副本
- 在函數(shù)返回之前,系統(tǒng)將執(zhí)行一個額外的安全驗證操作,被稱做 Security check
- 在 Security Check 的過程中,系統(tǒng)將比較棧幀中原先存放的 Security Co okie 和.data 中副本的值,如果兩者不吻合,說明棧幀中的 Security Cookie 已被破壞,即棧中發(fā)生了溢出
- 當檢測到棧中發(fā)生溢出時,系統(tǒng)將進入異常處理流程,函數(shù)不會被正常返回, ret 指令也不會被執(zhí)行

2.DEP:Data Execution Prevention
溢出攻擊的根源在于現(xiàn)代計算機對數(shù)據(jù)和代碼沒有明確區(qū)分這一先天缺陷,DEP(數(shù)據(jù)執(zhí)行保護, Data Execution Prevention)就是用來彌補計算機對數(shù)據(jù)和代碼混淆這一天然缺陷的。
DEP 的基本原理是將數(shù)據(jù)所在內(nèi)存頁標識為不可執(zhí)行,當程序溢出成功轉(zhuǎn)入 shellcode 時,程序會嘗試在數(shù)據(jù)頁面上執(zhí)行指令,此時 CPU 就會拋出異常,而不是去執(zhí)行惡意指令。

ROP的全稱為Return-oriented Programming,主要思想是在棧緩沖區(qū)溢出的基礎(chǔ)上,利用程序中已有的小片段 (gadgets) 來改變某些寄存器或者變量的值,從而控制程序的執(zhí)行流程。
3.ASLR:地址隨機化
無論是 JMP ESP 等通用跳板指令還是 ROP使用的各指令,我們都要先確定這條指令的入口點。
ASLR( Address Space Layout Randomization)技術(shù)就是通過加載程序的時候不再使用固定的基址加載,從而干擾 shellcode 定位的一種保護機制。
a.映像隨機化
映像隨機化是在 PE 文件映射到內(nèi)存時,對其加載的虛擬地址進行隨機化處理,這個地址是在系統(tǒng)啟動時確定的,系統(tǒng)重啟后這個地址會變化。
b.堆棧隨機化
在程序運行時隨機的選擇堆棧的基址,與映像基址隨機化不同的是堆棧的基址不是在系統(tǒng)啟動的時候確定的,而是在打開程序的時候確定的,也就是說同一個程序任意兩次運行時的堆?;范际遣煌?,進而各變量在內(nèi)存中的位置也就是不確定的。
c.PEB 與 TEB 隨機化
PEB 與 TEB 隨機化在 Windows XP SP2 中就已經(jīng)引入了,微軟在 XP SP2 之后不再使用固定的 PEB 基址 0x7FFDF000 和 TEB 基址 0x7FFDE000,而是使用具有一定隨機性的基址,這就增加了攻擊 PEB 中的函數(shù)指針的難度。
Heap sp ray 本來就是為了應(yīng)對堆空間隨機分配的問題產(chǎn)生的, ASLR 本質(zhì)也是隨機化處理,所以直接使用 Heap spray 繞過 ASLR 也是可能的。