Exploit SEH小結

    學習《Exploit編寫系列教程時候》第三篇時候,發現幾個問題,我以前一直困惑ROP爲何會有用,由於事發地點的ESP距離覆蓋掉的SEH這麼遠;還有我用了一個在SafeSEH模塊中的handler,這也致使Exploit失敗。node

    由此看出SEH這裏關鍵點有兩處:ide

  1. 當異常發生時,異常分發器會建立本身的棧楨。
    //SEH回調函數原型
    EXCEPTION_DISPOSITION __cdecl _except_handler(
    
         struct _EXCEPTION_RECORD *ExceptionRecord,//指向包含異常信息的EXCEPTION_RECORD結構
         void* EstablisherFrame,//指向該異常相關的EXCEPTION_REGISTRATION結構
         struct _CONTEXT *ContextRecord,//指向線程環境CONTEXT結構的指針
         void* DispatcherContext){ //該域暫無心義
    
         ……
    
        //4種返回值及含義
        //1.ExceptionContinueExecution(0):回調函數處理了異常,能夠從異常發生的指令處從新執行。
        //2.ExceptionContinueSearch(1):回調函數不能處理該異常,須要要SEH鏈中的其餘回調函數處理。
        //3.ExceptionNestedException(2):回調函數在執行中又發生了新的異常,即發生了嵌套異常
        //4.ExceptionCollidedUnwind(3):發生了嵌套的展開操做
    
        return …
    }
    它會把SEH handler成員壓入新建立的棧楨中,而在SEH結構中有一個域是EstablisherFrame,這個成員指向異常註冊記錄(當前SEH)的地址。當一個異常handler被調用時,它老是在ESP+8的位置。即ROP第一個pop彈出棧頂4字節,第二個pop繼續彈出棧中的4字節,ret把此時的ESP(當前SEH的地址)放到EIP中
  2. SafeSEH中,調用了RtIsValidHandler(),函數會查找handler所在模塊,而後對比handler和所在模塊的SEH表,因此handler的所在模塊必須找一個未開啓SafeSEH的

    有關SEH分發和SafeSEH具體參考可見:函數

                            https://bbs.pediy.com/thread-189297.htm學習

                            https://www.kanxue.com/chm.htm?id=727&pid=node1000163spa

相關文章
相關標籤/搜索