Windows SafeSEH 机制如何工作?
我了解覆盖 SEH 开发技术的工作原理。我不太明白 SafeSEH 机制是如何阻止这种技术工作的。这个问题是关于 SafeSEH 机制的内部运作的。
Windows SafeSEH 机制如何工作?
我了解覆盖 SEH 开发技术的工作原理。我不太明白 SafeSEH 机制是如何阻止这种技术工作的。这个问题是关于 SafeSEH 机制的内部运作的。
关于您的原始问题:在 ntdll.dll 加载每个 PE 映像时,PE 映像中的异常处理程序地址列表将被解析,并将每个地址插入到 ntdll.dll 内部使用的排序列表中。当异常命中时,ntdll.dll!KiUserExceptionDispatcher 将尝试找出使用 SEH 链中的哪个异常。依次在此列表中扫描每个异常处理程序地址(通过 ntdll.dll)。如果找到,则允许异常过滤器运行。如果不是,那么 ntdll.dll 将抛出异常并且本质上通过 0xC00001A5 使线程快速失败:检测到无效的异常处理程序例程。
如果您想自己浏览“代码”,请在 KiUserExceptionDispatcher 上中断,在虚拟程序中抛出异常,然后单步执行。您还可以在 IDA 中扫描 ntdll 中的 0xC00001A5(不应该经常出现),当您看到使用的那个时,这就是 ntdll 决定使您的线程快速失败的点(由于代码路径局部性优化,可能很难后退)。
我根据自己的研究发布自己的答案。我不确定粗体部分的正确性。欢迎评论更正我的答案或更全面更好的答案。在我收到确认或反驳我的假设的评论后,我将编辑掉粗体。
假设您的恶意缓冲区覆盖了_EXCEPTION_REGISTRATION_RECORD
并且您找到了它的偏移量。现在,作为 SEH 开发的第一步,您需要PEXCEPTION_ROUTINE
使用pop pop ret
指令序列的地址覆盖记录的第二个字段。此时,如果不尝试在被利用的 .exe 模块中找到这个序列,那么它是否是用/SAFESEH
.
接下来,您转向pop pop ret
从易受攻击的可执行文件加载的 DLL 之一中选择指令序列地址。在您选择该地址并PEXCEPTION_ROUTINE
用它覆盖该字段后,在发生异常时,操作系统采用该地址,确定该地址所属的 .dll 模块,如果 .dll 是用 编译的/SAFESEH
,则检查该 .dll 的模块是否安全异常处理程序表包含给定的地址。如果 .dll 是用构建的,/SAFESEH
并且表中不存在您使用的地址,则执行流程不会传递到该地址并且漏洞利用失败。如果 .dll 是在没有 .dll 的情况下构建的/SAFESEH
,那么操作系统就没有什么可检查的,这一步的利用是有效的。