用于 x64 的 Gargoyle 变体,内存逃逸技术——DeepSleep
作者:Sec-Labs | 发布时间:
项目介绍
一个用于x64的Gargoyle变体,只使用ROP和PIC来隐藏内存伪影。
非常感谢@waldoirc在他的博客上记录了这项技术的大部分内容。
这个实现的不同之处在于,它没有使用任何APC,而是完全以PIC的形式实现。
相关阅读
使用说明
我创建这个是为了更好地了解如何在x64上使用类似于Gargoyle的技术来规避内存伪影。我的想法是建立一个调用VirtualProtect() -> Sleep() -> VirtualProtect()的ROPChain,将我自己的页面在睡眠时标记为N/A。
与Gargoyle和其他类似Gargoyle的实现不同,我完全依靠ROP,不排队任何APC。DeepSleep本身被实现为完全的PIC,这使得它更容易列举出哪些内存页必须从扫描器中隐藏。
当线程处于活动状态时,一个MessageBox弹出,DeepSleep的页面被标记为可执行。当睡眠时,该页被标记为不适用。
如果DeepSleep被注入,并且执行线程的基址没有指向私有的commited内存,那么在编写本文时,这就有效地绕过了Moneta。
我已经用Earlybird注入技术验证了这一点,将DeepSleep.bin注入到notepad.exe。

用例
使用Mingw:
输入make,出现一个野生的DeepSleep.bin。
或者使用预先编译好的DeepSleep.bin :-)
检测
处于延迟执行状态的线程的调用栈包括未知/篡改的内存区域,另外还包括VirtualProtect()的地址。Hunt-Sleeping-Beacons可以检测到这一点。
可能有可能将该指标应用于其他C2,使用不同的技术在回调之间等待。

标签:工具分享, 内存逃逸技术