ThreadStackSpoofer是一种先进的内存规避技术,它可以帮助广大研究人员或红/蓝队人员更好地隐藏已注入的Shellcode的内存分配行为,以避免被扫描程序或分析工具所检测到。
ThreadStackSpoofer是线程堆栈欺骗技术的一个示例实现,旨在规避恶意软件分析、反病毒产品和EDR在检查的线程调用堆栈中查找Shellcode帧的引用。其思想是隐藏对线程调用堆栈上针对Shellcode的引用,从而伪装包含了恶意代码的内存分配行为。
在该工具的帮助下,可以帮助现有的商业C2产品安全性有更好的提升,并协助红队研究人员开发出更好的安全产品/工具。
ThreadStackSpoofer的大致运行机制和算法如下所示:
休眠结束之后,我们将恢复之前存储的原始函数返回地址并继续执行挂起的任务。
函数的返回地址会分散在线程的堆栈内存区域周围,由RBP/EBP寄存器存储其指向。为了在堆栈上找到它们,我们需要首先收集帧指针,然后取消对它们的引用以进行覆盖:
*(PULONG_PTR)(frameAddr + sizeof(void*)) = Fake_Return_Address;
工具下载
广大研究人员可以使用下列命令将该项目源码克隆至本地:
git clone https://github.com/mgeeky/ThreadStackSpoofer.git
工具使用
C:\> ThreadStackSpoofer.exe <shellcode> <spoof>
其中
<shellcode>:Shellcode的文件路径;
<spoof>:“1”或“true”代表启用线程栈内存欺骗,其他参数表示禁用该技术;
欺骗Beacon的线程调用栈示例
PS D:\dev2\ThreadStackSpoofer> .\x64\Release\ThreadStackSpoofer.exe .\tests\beacon64.bin 1
[ ] Reading shellcode bytes...
[ ] Hooking kernel32!Sleep...
[ ] Injecting shellcode...
[is now running. ] Shellcode
[return address: 0x1926747bd51. Finishing call stack... ] Original
===> MySleep(5000)
[return address... ] Restoring original
[return address: 0x1926747bd51. Finishing call stack... ] Original
===> MySleep(5000)
[return address... ] Restoring original
[return address: 0x1926747bd51. Finishing call stack... ] Original
下面的例子中,演示了没有执行欺骗技术时的堆栈调用情况:
开启线程堆栈欺骗之后的堆栈调用情况如下图所示:
上述例子中,我们可以看到调用栈中最新的帧为MySleep回调。我们可以通过搜索规则查找调用堆栈未展开到系统库中的线程入口点:
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21
上图所示为未修改的Total Commander x64线程。正如我们所看到的,它的调用堆栈在初始调用堆栈帧方面与我们自己的调用堆栈非常相似。
https://github.com/mgeeky/ThreadStackSpoofer
精彩推荐