利用未开启SafeSEH的模块绕过SafeSEH机制的细节问题

SafeSEH机制及绕过方式简介
1.SafeSEH会在程序编译的时候保存一份程序所使用的所有异常处理函数的地址
如列表
table[0]:0x40000100 handler1
table[1]:0x40000200 handler2
table[2]:0x40000300 handler3
2.且在进行异常处理的时候会检测handle地址所在的PE文件的异常处理函数的地址表
因为只有开启了SafeSEH选项编译的PE文件才会有这个安全地址表,那么当1.exe中的的handler指向其他2.dll空间地址的时候
不可能说系统在1.exe的地址表中查询这个地址,因为1.exe肯定不会写2.dll空间的地址,所以系统会查询handler指向的PE文件的地址表(及若handler指向2.dll空间,系统查询2.dll未开启SafeSEH,则放行),以此绕过SafeSEH机制

使用SEH攻击执行Shellcode时候通常使用 "jmp 06 pop pop ret"覆盖SEH结构,网上说明不太详细

SEH在栈中的结构:
xxx
NEXT指针------->下一个此结构
handler指针------>处理函数地址
xxx

若我们有机会溢出攻击覆盖从next指针向上(栈向下生长)的区域,那么直接覆盖handler指向他的下一句,此时栈结构为
xxx
被破坏的NEXT指针------->???
handler指针------>Shellcode开始位置
Shellcode开始位置

那么此时遇到异常会直接执行到Shellcode开始位置,但是由于SafeSEH机制,Shellcode开始位置所在的空间为1.exe空间,查询1.exe安全异常处理函数地址表发现此地址不在其中,拒绝执行

所以我们的攻击方式需要转换为 jmp 06 pop pop ret的方式,栈空间覆盖为:
xxx
EB 06------>jmp Shellcode开始位置
handler指针------>2.dll中的pop pop ret指令串位置
Shellcode开始位置

假设2.dll中含有此指令串
pop eax
pop ecx
ret
那么handler指针指向的2.dll未开启SafeSEH,成功绕过SafeSEH机制,然后问题就是如何控制EIP转到原NEXT指针(现EB 06处)从而进入Shellcode

利用的就是pop pop ret

首先需要知道异常处理函数形式:
EXCEPTION_DISPOSITION __cdecl _except_handler (
EXCEPTION_RECORD *ExceptionRecord,
EXCEPTION_REGISTRATION_RECORD *EstablisherFrame,
CONTEXT *pContext,
PVOID pValue
);
返回值EXCEPTION_DISPOSITION 是个枚举类型(0/1/2/3)
异常分发函数负责调用异常处理函数
push pValue
push *pContext
push *EstablisherFrame
push *ExceptionRecord
call _except_handler
进入_except_handler函数后会使得栈空间布局如下
call产生的返回EIP
*ExceptionRecord
*EstablisherFrame------>指向SEH链的原NEXT指针(现EB 06处)
*pContext
pValue
所以两个pop一个ret就完成转入shellcode工作了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值