做一点小笔记,加深印象。SEH Stack Overflow
的利用,需要理解SEH
的原理,理解原理之后,才会明白POP/POP/RET
结构的必要性。
SEH Introduction
Structured Exception Handler EXPLOITATION
POP POP RET
The need for a POP POP RET instruction sequence上文提到POP/POP/RET
的必要性,其中解释的时候Figure3所显示栈空间布局,ESP
所指地址空间为何是那样的,主要涉及到返回值为EXCEPTION_DISPOSITION
的回调函数在在栈空间的分布的问题。异常发生后,会在栈上划出一块区域,分配给如下所示的回调函数,ESP
指向回调函数所分配栈空间的最上面。回调函数如下所示:可参考
A Crash Course on the Depths of Win32 Structured Exception Handling 翻译版
A Crash Course on the Depths of Win32 Structured Exception Handling
1 | EXCEPTION_DISPOSITION |
shellcode
结构如下所示:
参考:Exploit writing tutorial part 3 : SEH Based Exploits
在这里解释一下:
(1)当异常发生的时候,首先调到SEH
链中第一个异常处理的SE Handler
部分进行异常处理,在这里需要覆盖一个地址,使其指向POP/POP/RET
指令所在的位置。至于为什么要用P/P/R
指令,可以参照如下所示:
当异常发生的时候,ESP
的位置,现在需要使用P/P/R
指令让EIP
指向EstablisherFrame
所在的地址,这样就可以指向SEH
调用链了。
(2)第一步完成之后,EIP
指向SEH
调用链第一个异常处理结构的Next SEH
部分。这里存放一个跳转指定,让其跳过其后面紧跟的SEH Handler
部分,JMP
指令占两个字节,需要跳过六个字节,这里可以使用\xEB\x06\x90\x90
来覆盖Next SEH
部分的内容
(3)第二步的跳转执行完之后,直接来到的shellcode
所在的部分,进而完成利用。