14.1 SEHOP 的原理

  • 典型的SEH链图:

image.png

  • SEHOP(Structured Exception Handling Overwrite Protection)的核心任务就是检查这条 SEH链的完整性。SEHOP的检查机制是:

    • 在程序转入异常处理前 SEHOP 会检查SEH链上最后一个异常处理函数是否为系统固定的终极异常处理函数:
      • 如果是,则说明这条 S.E.H 链没有被破坏,程序可以去执行当前的异常处理函数;
      • 如果检测到最后一个异常处理函数不是终极 BOSS,则说明 S.E.H 链被破坏,可能发生了 S.E.H 覆盖攻击,程序将不会去执行当前的异常处理函数。

        14.5 伪造 S.E.H 链表

  • SEHOP 的原理就是检测 S.E.H 链中最后一个异常处理函数指针是否指向一个固定的终极异常处理函数,在溢出时伪造这样一个结构就可以绕过SEHOP。

  • 伪造SEH链表的思路:

(1)通过未启用 SafeSEH 的 SEH_NOSaeSEH_JUMP.dll 来绕过 SafeSEH。
(2)通过伪造 S.E.H 链,造成 S.E.H 链未被破坏的假象来绕过 SEHOP。
(3)SEH_NOSafeSEH 中的 test 函数存在一个典型的溢出,即通过向 str 复制超长字符串造成 str 溢出,进而覆盖程序的 S.E.H 信息。
(4)使用 SEH_NOSafeSEH_JUMP.DLL 中的“pop pop retn”指令地址覆盖异常处理函数地址,然后通过制造除 0 异常,将程序转入异常处理。通过劫持异常处理流程,程序转入SEH_NOSaeSEH_JUMP.DLL 中执行“pop pop retn”指令,在执行 retn 后程序转入 shellcode 执行。