1. 程式人生 > >0day --第11.1章:SafeSEH保護原理

0day --第11.1章:SafeSEH保護原理

@TOC

1、SafeSEH原理很簡單:

在程式呼叫異常處理函式之前,對要呼叫的異常處理函式進行校驗,當發現異常處理函式不可靠時停止對異常處理函式的呼叫。 編譯器在編譯程式時將程式所有的異常處理函式地址提取出來,編入一張安全的SHE表,並將這張表放到程式的映像裡面。當程式呼叫異常處理函式時將函式地址與安全SHE表進行匹配,檢查呼叫的異常處理函式是否在安全的SHE表中。

2、SafeSEH機制的執行機理:

(1)首先會檢查異常處理鏈是否在當前程式棧中,如果不在,將停止對異常處理函式的呼叫。
(2)檢查異常處理函式指標是否指向當前程式棧,如果是,將停止對異常處理函式的呼叫。

在這裡插入圖片描述 (3)當前兩項檢查都通過後,程式呼叫一個全新的函式RtlIsValidHandler(),來對異常處理函式進行有效性驗證。 在這裡插入圖片描述

RtlIsValidHandler()函式對以下3種情況允許異常處理函式執行。 (1) 異常處理函式位於載入模組記憶體範圍外,DEP關閉。 (2) 異常處理函式位於載入模組記憶體範圍內,相應模組未啟用SafeSEH(不存在SHE表),同時相應模組不是純IL。 (3) 異常處理函式位於載入模組記憶體範圍內,相應模組啟用SafeSEH,異常處理函式在SHE表中。

3、繞過方法

針對這3中情況,我們採取如下3種方法進行繞過

(1) 在載入模組記憶體範圍外找到一個跳板指令就可以轉入shellcode執行。 (2) 利用未啟用SafeSEH模組中的指令作為跳板,轉入shellcode執行。 (3) 兩種思路:情況SHE表造成未啟用SafeSEH的假象;將指令註冊到安全SHE表中,但由於安全SHE表資訊在記憶體中是加密存放的,因此此路不同。 (4) 還有一個思路:如果SHE中的異常函式指標指向堆區,即使安全校驗發現異常處理函式不可信,仍會呼叫被修改過的異常處理函式!WHY???