Windows内存保护机制及绕过方法
0 目錄
-
GS編譯
-
SafeSEH機制
-
SEH覆蓋保護
-
數據執行保護(DEP)
-
地址隨機化(ASLR)
1 GS編譯
1.1 基本原理
? ? ? ?Windows操作系統為解決棧溢出漏洞的問題引入了一個對策——GS編譯保護技術。
? ? ? ??GS編譯保護技術是通過編譯時添加相關代碼而實現的,開啟GS 編譯選項后會在函數的開頭和結尾添加代碼來阻止棧溢出漏洞的利用。當應用程序啟動時,程序的cookie被計算出來(偽隨機數)并保存在.data 節段中,在函數的開頭這個 cookie 被拷貝到棧中,位于返回地址和局部變量的中間。
? ? ? ??函數調用完后系統檢測cookie值是否被修改。
1.2 繞過方法
- 計算/猜測cookie值
- 覆蓋虛函數表
? ? ? ??堆棧布局:[局部變量][cookie][入棧寄存器][返回地址][參數][虛表指針]。
? ? ? ?覆蓋對象和虛函表指針,如果你把這個指針指向一個用于欺騙的虛函數表,你就可以重定向這個虛函數的調用,并執行惡意的代碼。
- 覆蓋SHE
? ? ? ??SEH句柄用于指向異常處理函數,這個句柄被存在SecurityCookie的上方,這使得攻擊者不需要覆蓋到SecurityCookie就可以修改SEH句柄指向的位置。
- 同時替換掉棧中和.data段中的cookie值
? ? ? ?通過替換加載模塊.data 節中的cookie 值(可寫)來繞過棧上的 cookie 保護,并用相同的值替換棧中的cookie。
2?SafeSEH機制
2.1 基本原理
? ? ? ?通過覆蓋SEH可以繞過GS編譯保護,所以微軟又引入了一種SEH的安全校驗機制——SafeSEH。
???????通過啟用/SafeSEH編譯選項來把這種機制應用到所有的執行模塊上,當異常處理器被執行前,SafeSEH會驗證異常處理鏈是否被修改過。系統會從頭到尾遍歷異常處理鏈表,并逐個驗證它們的有效性。
???????如果覆蓋SEH,這將破壞鏈表并觸發SafeSEH機制。
2.2 繞過方法
- 利用未開啟SafeSEH保護的模塊
?? ? ?尋找程序中加載的未開啟SafeSEH保護的模塊來繞過,比如軟件本身自帶的dll文件。
- 利用堆繞過
? ? ? ?SafeSEH允許其異常處理句柄位于除棧空間之外的非映像頁面。如果你將shellcode寫在堆空間中 ,再覆蓋SEH鏈表的地址。使程序異常處理句柄指向堆空間,就可以繞過SafeSEH的檢測了。
- 覆蓋虛函數表(同上)
3?SEH覆蓋保護
3.1 基本原理
???????SEH覆蓋保護(SEHOP)可作為SEH的擴展,用于檢測SEH是否被覆寫。
???????SEHOP的核心特性是用于檢測程序棧中的所有SEH結構鏈表的完整性,特別是對最后一個SHE結構的檢測。在最后一個SEH結構中擁有一個特殊的異常處理函數指針,指向一個位于ntdll中的函數ntdll!FinalExceptHandler()。
3.2 繞過方法
- 利用未開啟SEHOP保護的模塊
- 覆蓋虛函數表
- 偽造SEH鏈表
4?數據執行保護(DEP)
4.1 基本原理
???????數據執行保護 (DEP) 是一套軟硬件技術,能夠在內存上執行額外檢查以防止在不可運行的內存區域上執行代碼。
???????DEP 有兩種模式,如果 CPU 支持內存頁 NX 屬性, 就是硬件支持的 DEP。如果 CPU 不支持, 那就是軟件支持的 DEP 模式,這種 DEP 不能阻止在數據頁上執行代碼,但可以防止其他的 exploit(如SEH覆蓋)。
4.2 繞過方法
- ret2libc
? ? ? ?ret2libc是一種通過retn指令在庫函數中尋找可用代碼的攻擊方式。由于其所有代碼都是從libc中找到的,所以不存在不可執行的問題。
- 關閉進程的DEP (NtSetInformationProcess)
? ? ? ?因為 DEP 可以設置不同的模式,操作系統需要能動態關閉DEP,因此系統肯定有API來啟用或關閉NX,如果黑客可以找到這個NTDLL中的 API,就能繞過硬件DEP保護。一個進程的DEP設置標志保存在內核結構中(KPROCESS結構),這個標志可以用函數NtQueryInformationProcess和NtSetInformationProcess通過設置ProcessExecuteFlags類來查詢和修改,用內核調試器也可以達到同樣的目的。
- 利用可寫可執行內存
? ? ? ?有些程序可能由于配置的問題或者其他原因,在進程中存在可讀可寫可執行的區域。如果攻擊者可以將shellcode寫入這部分空間中并劫持流程,就可以繞過DEP。
- 利用TEB突破DEP(局限于XP?SP2以下的版本)
-
利用WPN與ROP技術
-
利用SEH?
5?地址隨機化(ASLR)
5.1 基本原理
???????ASLR(地址空間布局隨機化)技術的主要功能是通過對系統關鍵地址的隨機化,防止攻擊者在堆棧溢出后利用固定的地址定位到惡意代碼并加以運行。它主要對以下四類地址進行隨機化:堆地址、棧基址、PE文件映像基址、PEB地址。
??????適用范圍:Windows Vista,Windows 2008 server,Windows 7下是默認啟用。
5.2 繞過方法
-
覆蓋部分返回地址
? ? ? ?雖然模塊加載基地址發生變化,但是各模塊的入口點地址的低字節不變,只有高位變化。部分返回地址覆蓋,可以使得覆蓋后的地址相對于基地址的距離是固定的,可以從基地址附近找可以利用的跳轉指令。這種方法的通用性不是很強,因為覆蓋返回地址時棧上的Cookie會被破壞。不過具體問題具體分析,為了繞過操作系統的安全保護機制需要考慮各種各樣的情況。
-
利用未開啟ASLR的模塊
? ? ? ?在未受ASLR保護的模塊中查找跳轉指令的地址來覆蓋返回地址或者SEH結構,可以通過Process Explorer或者ImmDbg命令插件來查看哪些可執行模塊未受ASDL保護。
- HeapSpray技術
總結
以上是生活随笔為你收集整理的Windows内存保护机制及绕过方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python 检测字符串开始值Strin
- 下一篇: Lynis 检测自身安全漏洞工具(本机)