0x01 SEH概念及原理
windows系统的结构化异常处理机制(structured exception handing SEH),常见的try/except 或者try/catch就是异常处理代码。
当程序产生异常之后,就会从栈中加载catch块的地址并调用catch块。目前的操作系统安全性很强,可执行的代码和不可执行代码的数据是分开的。因为异常处理程序的地址依然在可执行代码区域,所以可以利用它来执行shellcode.
0x02基于seh的渗透步骤
1)引起应用程序异常,调用异常处理程序。
2)使用POP/POP/RET指令的地址改写异常处理程序的地址,调用catch块的内存地址保存在栈中,指向下个异常处理程序指针的地址是ESP+8,因此需要两个POP操作将执行重定向到下条SEH记录的地址。
注意:每个SEH记录有8个字节组成,前4个字节是它后面的SEH异常处理程序的地址,可用来保存下条SEH记录的地址,后4个字节是catch块的地址。
3)步骤1)将下条SEH记录的地址替换成跳转到攻击载荷JMP指令的地址,在步骤2)操作完成后,程序会跳过指定数量的字节去执行shellcode。
4)成功跳转到shellcode之后,执行载荷。
0x03常见shellcode编写
填充+nseh+seh+nop+shellcode
各部分含义如下:
填充:数据覆盖直到函数返回地址
nseh : next seh
指示下一个seh结构的位置,在这里使用"\xeb\x06\x90\x90"填充是一个通用的填充方法,这四个字节反汇编的结果是 jmp 6
nop nop这样三条指令,原因是jmp
6个字节刚好绕过两个nop指令和一个4字节的seh处理程序的地址,落入nop指令区,然后滑行进入shellcode
seh : seh处理程序地址部分填入的是一个指向pop pop ret
这样连续三条指令的一个地址,这样填充原因是,在异常出现时,先保存当前栈定,然后系统会在栈里面压入两个参数,所以两个pop是pop出来系统压的参数,然后ret到nseh的位置,接着开始执行指令,然后参考上面nseh的数据介绍就可以。
原文链接:一个缓冲区溢出覆盖SEH漏洞分析
https://www.52pojie.cn/thread-456209-1-1.html
(出处: 吾爱破解论坛)