SEH溢出利用流程
- 控制 EIP
调试发现是在程序异常后,接着执行,EIP才会被覆盖。事实上,EIP的值之所以被覆盖,是因为异常处理程序的地址被我们覆盖了,EIP实际上指向的是异常处理程序函数的地址。 - 确定 EIP 溢出偏移量
 - 检测坏字符
在开始搜索 P/P/R 指令序列和生成shellcode之前,应该检查是否有坏字符,从而确定 P/P/R 序列地址和 shellcode 中要避免哪些字节。 - 将 EIP 覆盖为 P/P/R 指令地址
找到shellcode位置是在异常处理函数地址处,异常处理函数地址为ESP 地址后的第三个位置,即函数第二个参数(函数第二个参数指向的异常处理结构的地址)poi(esp+8)。因此要把 EIP 的地址替换成 P/P/R 指令的地址,这样才能成功将ESP后的第三个位置的内容压入 EIP 寄存器,即将异常处理函数地址压入 EIP。之后 EIP 便指向了异常函数处的内容,而异常函数处的内容又能被我们覆盖。 - 找堆栈中shellcode偏移量
因为异常函数处被覆盖内容的长度太短,不足够放shellcode,所以要找剩余的字段被填充到了哪里,这个环境中刚好是在堆栈中,因此jmp一下就好了,如果不在堆栈中就需要用到后面课程中的知识点了。 add esp+njmp esp
找到偏移量后修改esp的值,然后jmp跳到shellcode所在位置- MSF生成Payload,然后GetShell
 
常见shellcode编写
填充 + nseh + seh + nop + shellcode
# nseh 为短跳转 \xeb\x06\x09\x09
# seh 为 P/P/R 指令地址SEH 机制的作用

			本文由 Meedo 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Feb 26, 2024 at 02:50 pm