SEH溢出总结

in OSED with 0 comment

SEH溢出利用流程

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


常见shellcode编写

填充 + nseh + seh + nop + shellcode

# nseh 为短跳转 \xeb\x06\x09\x09
# seh 为 P/P/R 指令地址


SEH 机制的作用

2023-12-13T11:29:17.png

Comments are closed.