0%

SEH Overflow Introduction

做一点小笔记,加深印象。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
2
3
4
5
6
7
EXCEPTION_DISPOSITION
__cdecl _except_handler(
struct _EXCEPTION_RECORD *ExceptionRecord,
void * EstablisherFrame,
struct _CONTEXT *ContextRecord,
void * DispatcherContext
);

shellcode结构如下所示:

参考:Exploit writing tutorial part 3 : SEH Based Exploits

seh

在这里解释一下:

(1)当异常发生的时候,首先调到SEH链中第一个异常处理的SE Handler部分进行异常处理,在这里需要覆盖一个地址,使其指向POP/POP/RET指令所在的位置。至于为什么要用P/P/R指令,可以参照如下所示:

seh当异常发生的时候,ESP的位置,现在需要使用P/P/R指令让EIP指向EstablisherFrame所在的地址,这样就可以指向SEH调用链了。

(2)第一步完成之后,EIP指向SEH调用链第一个异常处理结构的Next SEH部分。这里存放一个跳转指定,让其跳过其后面紧跟的SEH Handler部分,JMP指令占两个字节,需要跳过六个字节,这里可以使用\xEB\x06\x90\x90来覆盖Next SEH部分的内容

(3)第二步的跳转执行完之后,直接来到的shellcode所在的部分,进而完成利用。