SEH, SAFESEH相關

來源:互聯網
上載者:User

標籤:style   http   color   使用   io   cti   代碼   ar   

 

SEH, SAFESEH相關

1,觸發seh異常
讓目標程式Read/Write無效地址,如果和棧底相鄰的記憶體唯讀,嘗試覆蓋超出棧底

2,如何找到(顯示)要覆蓋的SEH
od文法:dd fs:[0]
softice文法: dd fs:0

3,覆蓋SEH時需要填充的跳轉地址
需要找一個可以跳轉成功的
pop ?
pop ?
retn 
的代碼地址。
od文法:Ctrl+B/L 5? 5? c3
softice文法:s -a addr -L length 5? 5? c3
其中"5?"代表"58-5F"之間的任意值

4,ntdll!KiUserExceptionDispatcher()流程
VEH <-- winxp才有

SEH <-- win2000從這裡開始

UEF 當程式被調試時,UnhandledExceptionFilter() SetUnhandledExceptionFilter()

5,ntdll!KiUserExceptionDispatcher()檢查SEH handler過程
1) 檢查handler是否線上程TEB指定的Stack範圍內(fs:[4]~fs:[8]),如果在其中,拒絕執行.
2) 檢查handler是否在已載入模組列表(exe和dll), 如果handler不在這些模組位址範圍內,執行.
3) 如果handler在模組位址範圍內,開始檢查登入例外處理常式列表.
檢查過程:
--------------
a) if((DLLCharacteristics&0xFF00) == 0x0400), 拒絕執行(No SEH);否則,繼續檢查.
b) Load Configuration Directory地址為0(即不存在Load Configuration Directory結構,說明編譯時間沒有設定/safeseh選項),停止檢查,執行.
Load Configuration Directory結構存在,繼續檢查:
+00h directory_size // 目錄長度介於[0,0x48),停止檢查,執行.
...
+40h handlers[] // SEH handler數組指標(元素是SEH handler RVA地址),if(handlers[]==0),停止檢查,執行.
+44h handler_num // SEH handler數組元素個數,if(handler_num==0),停止檢查,執行.

c) 然後開始逐個匹配,發現匹配,調用;沒有發現匹配,拒絕調用.

6,關於DataDirectory[IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG]
這個是在winnt.h中的定義
typedef struct {
DWORD Size;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD GlobalFlagsClear;
DWORD GlobalFlagsSet;
DWORD CriticalSectionDefaultTimeout;
DWORD DeCommitFreeBlockThreshold;
DWORD DeCommitTotalFreeThreshold;
DWORD LockPrefixTable; // VA
DWORD MaximumAllocationSize;
DWORD VirtualMemoryThreshold;
DWORD ProcessHeapFlags;
DWORD ProcessAffinityMask;
WORD CSDVersion;
WORD Reserved1;
DWORD EditList; // VA
DWORD SecurityCookie; // VA
DWORD SEHandlerTable; // VA
DWORD SEHandlerCount;
} IMAGE_LOAD_CONFIG_DIRECTORY32, *PIMAGE_LOAD_CONFIG_DIRECTORY32;
SEHandlerTable 是指向一個Seh處理函數Rva的表格。SEHandlerCount是這個表格的長度。如果這個表格存在,那麼只有該表格中的Seh處理函數才是合法的處理函數。如果異常發生時,順序尋找並執行Fs:[0]中的處理函數時,如果認為當前函數非法,則Seh無法繼續執行,程式會中止。而且連 UnhandledExceptionFilter都無法執行到。除非PE在被調試,依靠調試器來恢複。
每個PE有一個單獨表格。如kernel32.dll和user32.dll有各自的表格。當PE被載入時,PE的基址,大小、 SEHandlerTable(表格的地址)、SEHandlerCount(長度)會被存在一個表格中。當一個異常發生時,系統每個PE的基址和大小檢查當前seh處理函數屬於哪一個PE,然後取出相應的表格地址和長度。由於是載入時就已經取出,載入後SEHandlerTable和 SEHandlerCount就沒什麼用處了,對它進行修改當然也沒什麼用了。但修改表格內容還是有效。
如果seh處於動態申請的記憶體中,因為不處於任何一個PE Image內,所以seh是沒有任何限制的,否則如果不在相應表格中,會導致PE中止。visual c++的try..catch等的seh處理函數會自動加入該表格。但如果使用inline asm對fs:[0]進行操作加seh是無效的,如果發生異常只會導致PE中止。
目前基本所有的殼軟體都是將loadconfig刪除,對該PE基本沒什麼影響。但如果要保留的話,則需要將Pe Image內的seh處理函數加入到該表格中。微軟稱這個表格中的處理函數為"safe handler",
關掉safe handler的開關在Liker|CommandLine 加入/SAFESEH:NO
嘗試動態修改記憶體中的SEHandlerTable,except_handler順利得到控制權.

7,針對Win2003/WinXP SP2對SEH handler(異常處理函數)地址的突破方法
1) 不在stack裡面, 在heap裡.
對IE等瀏覽器,用js等heapspray分配堆,用堆內地址覆蓋SEH handler.

2) 在已載入模組的範圍外.
用字碼頁的跳轉地址,比如0x7FFA1571(win2000/xp/2003 chs通用地址)

3) 在系統dll裡面,且是該dll註冊過的異常處理函數.
利用登入的SEH handler,利用性不大.

8,OD的safeseh外掛程式OllySSEH
用其分析已載入模組,查看哪些DLL是/SafeSEH OFF:
/Safeseh ON 只能選登入的SEH handler地址來跳.
/Safeseh OFF 可以選裡面的地址(pop/pop/ret地址)來跳.
No SEH (DLLCharacteristics&0xFF00) == 0x0400, 不能跳.
:http://www.openrce.org/downloads/details/244/OllySSEH

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.