完全动态调用栈欺骗器的 PoC 实现
SilentMoonwalk 是一个完全动态调用栈欺骗器的 PoC 实现,它实现了一种技术,用于从调用栈中移除原始调用者, 并使用 ROP 使栈展开与控制流不同步。
本 PoC 是有关栈欺骗主题的联合研究成果。该研究的作者是:
我想强调,如果没有 Waldo-IRC 和 Trickster0 的工作,这项工作将不可能完成,他们两人都 为 PoC 的早期阶段以及背后的研究做出了贡献。
该仓库演示了一个 PoC 实现,用于在调用任意 Windows API 时欺骗调用栈。
此尝试受到 这条 Twitter 帖子 和 这条 Twitter 帖子 的启发,大师 namazso 在其中展示并建议 使用 ROP 链扩展栈展开方法,从而使展开与实际控制流不同步,并在之后恢复原始栈。
本 PoC 尝试实现与上述类似的功能,并使用一个不同步栈来完全隐藏原始 调用栈,同时从中移除 EXE 映像基址。返回时,会调用一个 ROP gadget 来恢复原始栈。 在代码中,此过程在循环中重复 10 次,每次迭代使用不同的帧,以证明稳定性。
该工具当前支持两种模式,其中一种实际上是对已识别出的无法工作的 pop RBP 帧的错误修补,它通过偏移当前 RSP 并向调用栈添加两个虚假帧来工作。由于它使用合成帧操作,我将这种模式称为“合成(SYNTHETIC)”模式。
当选择通过从栈中弹出 RBP 寄存器来展开的帧时,工具可能会选择一个不合适的帧,导致调用栈被 突然截断,如下所示。

针对该问题的一个简单解决方案是创建两个虚假帧,并将它们链接回被截断的调用栈。这将创建一种看似合法的调用栈, 即使没有合适的通过调用 POP RBP 来展开的帧,但:
_合成欺骗的结果如下图所示:

图 1:Windows 10 - 看似合法、不可展开的调用栈,其中 EXE 模块已被完全移除(调用无参数的函数 getchar)
注意:此操作模式默认禁用。要启用此模式,请将 CALLSTACK_TYPE 更改为 1
该模式是上述问题的正确解决方案,即不合适的帧被另一个合适的帧替换。

图 2:Windows 10 - 合法、可展开的调用栈,其中 EXE 模块已被完全移除(调用带 4 个参数的函数 MessageBoxA)
在仓库中,您还可以找到一个检查运行时函数的小工具,它可能对分析运行时函数条目有用。
UnwindInspector.exe -h
Unwind Inspector v0.100000
必需参数:
-m <模块>: 目标 DLL
-f <函数>: 目标函数
-a <函数地址>: 目标函数地址
示例输出:
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] 使用函数地址 0x7ffaae12182c
运行时函数 (0x000000000000182C, 0x00000000000019ED)
展开信息地址: 0x000000000026AA88
版本: 0
版本 + 标志: 00000000
SizeOfProlog: 0x1f
CountOfCodes: 0xc
FrameRegister: 0x0
FrameOffset: 0x0
展开码:
[00h] 帧: 0x741f - 0x04 - UWOP_SAVE_NONVOL (RDI, 0x001f)
[01h] 帧: 0x0015 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0015)
[02h] 帧: 0x641f - 0x04 - UWOP_SAVE_NONVOL (RSI, 0x001f)
[03h] 帧: 0x0014 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0014)
[04h] 帧: 0x341f - 0x04 - UWOP_SAVE_NONVOL (RBX, 0x001f)
[05h] 帧: 0x0012 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0012)
[06h] 帧: 0xb21f - 0x02 - UWOP_ALLOC_SMALL (R11, 0x001f)
[07h] 帧: 0xf018 - 0x00 - UWOP_PUSH_NONVOL (R15, 0x0018)
[08h] 帧: 0xe016 - 0x00 - UWOP_PUSH_NONVOL (R14, 0x0016)
[09h] 帧: 0xd014 - 0x00 - UWOP_PUSH_NONVOL (R13, 0x0014)
[0ah] 帧: 0xc012 - 0x00 - UWOP_PUSH_NONVOL (R12, 0x0012)
[0bh] 帧: 0x5010 - 0x00 - UWOP_PUSH_NONVOL (RBP, 0x0010)
为了构建 PoC 并观察到与图片中类似的行为,请确保:
/GS-)/Od)/GL)/Os、/Ot)/Oi)值得提及在此主题上的先前工作,这些工作奠定了本项目的基础。