學習《Exploit編寫系列教程時候》第三篇時候,發現幾個問題,我以前一直困惑ROP爲何會有用,由於事發地點的ESP距離覆蓋掉的SEH這麼遠;還有我用了一個在SafeSEH模塊中的handler,這也致使Exploit失敗。node
由此看出SEH這裏關鍵點有兩處:ide
//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中
有關SEH分發和SafeSEH具體參考可見:函數