声明:本公众号分享的安全工具和项目均来自互联网,仅提供安全研究和学习使用。若用于其他目的,使用者需要承包所有法律责任及相关连带责任,与本公众号和工具作者无关。特在此声明。
简介
SilentMoonwalk 是一个完全动态调用堆栈欺骗的 PoC 实现,实现了一种从调用堆栈中删除原始调用者的技术,使用 ROP 使控制流的展开不同步。
概述
此存储库演示了一个 PoC 实现,用于在调用任意 Windows API 时欺骗调用堆栈。
这一尝试的灵感来自于这个 Twitter 线程,以及这个 Twitter 线程,sensei namazso在其中展示并建议使用 ROP 链扩展堆栈展开方法,以使展开与实际控制流去同步并在之后恢复原始堆栈。
此 PoC 尝试做与上述类似的事情,并使用异步堆栈来完全隐藏原始调用堆栈,同时从中删除 EXE 映像库。返回时,将调用 ROP 小工具来恢复原始堆栈。在代码中,这个过程循环重复 10 次,每次迭代使用不同的帧,以证明稳定性。
支持模式
该工具目前支持 2 种模式,其中一种实际上是对已识别的非工作弹出 RBP 帧的错误补丁,它通过移动当前 RSP 并将两个假帧添加到调用堆栈来运行。由于它使用合成帧运行,我将此模式称为“SYNTHETIC”。
当选择通过从堆栈中弹出 RBP 寄存器来展开的帧时,该工具可能会选择一个不合适的帧,最终导致调用堆栈突然被切断,如下所示。
综合调用堆栈模式
这个问题的一个愚蠢的解决方案是创建两个假帧并将它们链接回 cut 调用堆栈。这将创建一种明显合法的调用堆栈,即使没有合适的框架来展开调用 POP RBP,但是:
-
您将失去异步技术的优势 -
堆栈仍然无法展开 -
生成的调用堆栈乍一看似乎是合法的,但它可能无法通过严格的检查 _synthetic 欺骗的结果可以在下图中观察到:
图 1:Windows 10 – 显然是合法的、不可取消的调用堆栈,EXE 模块被完全删除(调用无参数函数 getchar)
注意:默认情况下禁用此操作模式。要启用此模式,请将 CALLSTACK_TYPE 更改为 1
异步堆栈模式
这种模式是对上述问题的正确解决方案,其中不合适的框架被简单地替换为另一个合适的框架。
图 2:Windows 10 – 合法的、不可修复的调用堆栈,EXE 模块被完全删除(调用 4 个参数函数 MessageBoxA)
实用工具 在存储库中,您还可以找到一个小工具来检查运行时函数,这可能对分析运行时函数条目很有用。
UnwindInspector.exe -h
Unwind Inspector v0.100000
Mandatory args:
-m <module>: Target DLL
-f <function>: Target Function
-a <function-address>: Target Function Address
示例输出:
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] Using function address 0x7ffaae12182c
Runtime Function (0x000000000000182C, 0x00000000000019ED)
Unwind Info Address: 0x000000000026AA88
Version: 0
Ver + Flags: 00000000
SizeOfProlog: 0x1f
CountOfCodes: 0xc
FrameRegister: 0x0
FrameOffset: 0x0
UnwindCodes:
[00h] Frame: 0x741f - 0x04 - UWOP_SAVE_NONVOL (RDI, 0x001f)
[01h] Frame: 0x0015 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0015)
[02h] Frame: 0x641f - 0x04 - UWOP_SAVE_NONVOL (RSI, 0x001f)
[03h] Frame: 0x0014 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0014)
[04h] Frame: 0x341f - 0x04 - UWOP_SAVE_NONVOL (RBX, 0x001f)
[05h] Frame: 0x0012 - 0x00 - UWOP_PUSH_NONVOL (RAX, 0x0012)
[06h] Frame: 0xb21f - 0x02 - UWOP_ALLOC_SMALL (R11, 0x001f)
[07h] Frame: 0xf018 - 0x00 - UWOP_PUSH_NONVOL (R15, 0x0018)
[08h] Frame: 0xe016 - 0x00 - UWOP_PUSH_NONVOL (R14, 0x0016)
[09h] Frame: 0xd014 - 0x00 - UWOP_PUSH_NONVOL (R13, 0x0014)
[0ah] Frame: 0xc012 - 0x00 - UWOP_PUSH_NONVOL (R12, 0x0012)
[0bh] Frame: 0x5010 - 0x00 - UWOP_PUSH_NONVOL (RBP, 0x0010)
搭建
为了构建 POC 并观察与图片中类似的行为,请确保:
-
禁用 GS ( /GS-
) -
禁用代码优化 ( /Od
) -
禁用整个程序优化(删除 /GL
) -
禁用大小和速度首选项(删除 /Os
,/Ot
) -
如果未启用,则启用 /Oi
内部 ( )
下载地址
点击下方名称进入公众号
回复关键字【230613】获取下载链接
技术交流加下方vx
原文始发于微信公众号(红蓝公鸡队):使用SilentMoonwalk实现完整动态调用栈欺骗