使用SilentMoonwalk实现完整动态调用栈欺骗

渗透技巧 1年前 (2023) admin
334 0 0

声明公众分享安全工具项目来自互联网仅提供安全研究学习使用用于其他目的使用者需要承包所有法律责任相关连带责任公众工具作者无关声明

简介

SilentMoonwalk 是一个完全动态调用堆栈欺骗的 PoC 实现,实现了一种从调用堆栈中删除原始调用者的技术,使用 ROP 使控制流的展开不同步。

概述

此存储库演示了一个 PoC 实现,用于在调用任意 Windows API 时欺骗调用堆栈。

这一尝试的灵感来自于这个 Twitter 线程,以及这个 Twitter 线程,sensei namazso在其中展示并建议使用 ROP 链扩展堆栈展开方法,以使展开与实际控制流去同步并在之后恢复原始堆栈。

此 PoC 尝试做与上述类似的事情,并使用异步堆栈来完全隐藏原始调用堆栈,同时从中删除 EXE 映像库。返回时,将调用 ROP 小工具来恢复原始堆栈。在代码中,这个过程循环重复 10 次,每次迭代使用不同的帧,以证明稳定性。

支持模式

该工具目前支持 2 种模式,其中一种实际上是对已识别的非工作弹出 RBP 帧的错误补丁,它通过移动当前 RSP 并将两个假帧添加到调用堆栈来运行。由于它使用合成帧运行,我将此模式称为“SYNTHETIC”。

当选择通过从堆栈中弹出 RBP 寄存器来展开的帧时,该工具可能会选择一个不合适的帧,最终导致调用堆栈突然被切断,如下所示。

使用SilentMoonwalk实现完整动态调用栈欺骗

综合调用堆栈模式

这个问题的一个愚蠢的解决方案是创建两个假帧并将它们链接回 cut 调用堆栈。这将创建一种明显合法的调用堆栈,即使没有合适的框架来展开调用 POP RBP,但是:

  • 您将失去异步技术的优势
  • 堆栈仍然无法展开
  • 生成的调用堆栈乍一看似乎是合法的,但它可能无法通过严格的检查 _synthetic 欺骗的结果可以在下图中观察到:
使用SilentMoonwalk实现完整动态调用栈欺骗

图 1:Windows 10 – 显然是合法的、不可取消的调用堆栈,EXE 模块被完全删除(调用无参数函数 getchar)

注意:默认情况下禁用此操作模式。要启用此模式,请将 CALLSTACK_TYPE 更改为 1

异步堆栈模式

这种模式是对上述问题的正确解决方案,其中不合适的框架被简单地替换为另一个合适的框架。

使用SilentMoonwalk实现完整动态调用栈欺骗

图 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实现完整动态调用栈欺骗


原文始发于微信公众号(红蓝公鸡队):使用SilentMoonwalk实现完整动态调用栈欺骗

版权声明:admin 发表于 2023年6月13日 上午10:39。
转载请注明:使用SilentMoonwalk实现完整动态调用栈欺骗 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...