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

相关文章
相关标签/搜索