0day --第11.1章:SafeSEH保護原理
阿新 • • 發佈:2018-12-18
@TOC
1、SafeSEH原理很簡單:
在程式呼叫異常處理函式之前,對要呼叫的異常處理函式進行校驗,當發現異常處理函式不可靠時停止對異常處理函式的呼叫。 編譯器在編譯程式時將程式所有的異常處理函式地址提取出來,編入一張安全的SHE表,並將這張表放到程式的映像裡面。當程式呼叫異常處理函式時將函式地址與安全SHE表進行匹配,檢查呼叫的異常處理函式是否在安全的SHE表中。
2、SafeSEH機制的執行機理:
(1)首先會檢查異常處理鏈是否在當前程式棧中,如果不在,將停止對異常處理函式的呼叫。
(2)檢查異常處理函式指標是否指向當前程式棧,如果是,將停止對異常處理函式的呼叫。
(3)當前兩項檢查都通過後,程式呼叫一個全新的函式RtlIsValidHandler(),來對異常處理函式進行有效性驗證。
3、繞過方法
針對這3中情況,我們採取如下3種方法進行繞過
(1) 在載入模組記憶體範圍外找到一個跳板指令就可以轉入shellcode執行。 (2) 利用未啟用SafeSEH模組中的指令作為跳板,轉入shellcode執行。 (3) 兩種思路:情況SHE表造成未啟用SafeSEH的假象;將指令註冊到安全SHE表中,但由於安全SHE表資訊在記憶體中是加密存放的,因此此路不同。 (4) 還有一個思路:如果SHE中的異常函式指標指向堆區,即使安全校驗發現異常處理函式不可信,仍會呼叫被修改過的異常處理函式!WHY???