在进行系统调用时欺骗任意调用堆栈的PoC实现

作者:Sec-Labs | 发布时间:

CallStackSpoofer

本项目展示了一个PoC实现,在进行系统调用时欺骗任意的调用栈。关于完整的技术演练,请看相应的博文:https://labs.withsecure.com/blog/spoofing-call-stacks-to-confuse-edrs

默认情况下,它包含三个模仿的调用栈样本,可以通过提供-wmi-rpc-svchost来选择,如下图所示。

65cf6faa91173858

这些调用栈是通过在启用进程访问事件的情况下运行SysMon并搜索lsass是句柄操作目标的事件而获得的。

NB 作为警告,本PoC在以下Windows版本上测试。

  • 10.0.19044.1706 (21h2)

它没有在任何其他版本上进行过测试,而且在不同的Windows版本上,偏移量显然会有所不同(因此会出现故障)。

如果你有问题,调试错误的一个技巧是在SysMon中找到产生OpenProcess事件的进程并在WinDbg中附加到它。一旦附着,运行bp ntdll!NtOpenProcess,当bp被击中时,运行knf

这将显示类似于下面的输出,它将包含完整的符号分辨率和正确的堆栈利用空间(由 "内存 "列表示)。

0:003> knf
 #   Memory  Child-SP          RetAddr               Call Site
00           00000037`f01fe300 00007ffd`221d2ea6     ntdll!NtOpenProcess+0x12
01         8 00000037`f01fe308 00007ffd`1ffee959     KERNELBASE!ProcessIdToSessionId+0x96
02        80 00000037`f01fe388 00007ffd`23b99633     lsm!RpcOpenEnum+0x129
03       430 00000037`f01fe7b8 00007ffd`23b33711     RPCRT4!Invoke+0x73
04        40 00000037`f01fe7f8 00007ffd`23bfd77b     RPCRT4!Ndr64UnmarshallHandle+0xe1
05        70 00000037`f01fe868 00007ffd`23b7d2ac     RPCRT4!Ndr64StubWorker+0xb0b
06       6c0 00000037`f01fef28 00007ffd`23b7a408     RPCRT4!NdrServerCallAll+0x3c
07        50 00000037`f01fef78 00007ffd`23b5a266     RPCRT4!DispatchToStubInCNoAvrf+0x18
08        50 00000037`f01fefc8 00007ffd`23b59bb8     RPCRT4!RPC_INTERFACE::DispatchToStubWorker+0x1a6
09        e0 00000037`f01ff0a8 00007ffd`23b68a0f     RPCRT4!RPC_INTERFACE::DispatchToStub+0xf8
0a        70 00000037`f01ff118 00007ffd`23b67e18     RPCRT4!LRPC_SCALL::DispatchRequest+0x31f
0b        d0 00000037`f01ff1e8 00007ffd`23b67401     RPCRT4!LRPC_SCALL::HandleRequest+0x7f8
0c       110 00000037`f01ff2f8 00007ffd`23b66e6e     RPCRT4!LRPC_ADDRESS::HandleRequest+0x341
0d        a0 00000037`f01ff398 00007ffd`23b6b542     RPCRT4!LRPC_ADDRESS::ProcessIO+0x89e
0e       140 00000037`f01ff4d8 00007ffd`24ab0330     RPCRT4!LrpcIoComplete+0xc2
0f        a0 00000037`f01ff578 00007ffd`24ae2f26     ntdll!TppAlpcpExecuteCallback+0x260
10        80 00000037`f01ff5f8 00007ffd`23387034     ntdll!TppWorkerThread+0x456
11       300 00000037`f01ff8f8 00007ffd`24ae2651     KERNEL32!BaseThreadInitThunk+0x14
12        30 00000037`f01ff928 00000000`00000000     ntdll!RtlUserThreadStart+0x21

值得注意的是,当前调用站点使用的总堆栈空间在下面一行中标明(例如,ntdll!NtOpenProcess只占用了8个字节)。如前所述,本读物开头链接的博客中涵盖了完整的技术演练,它将更详细地解释这一点(以及Child-SP等概念)。由windbg生成的值可以用来与CalculateFunctionStackSize()返回的值相关联,以应对任何问题。

 

项目地址

https://github.com/WithSecureLabs/CallStackSpoofer

 

标签:工具分享