汇编中的简单线程堆栈欺骗

admin 2024年8月2日08:36:22评论13 views字数 1377阅读4分35秒阅读模式
免责声明:



本文所涉及的任何技术、信息或工具,仅供学习和参考之用。请勿利用本文提供的信息从事任何违法活动或不当行为。任何因使用本文所提供的信息或工具而导致的损失、后果或不良影响,均由使用者个人承担责任,与本文作者无关。作者不对任何因使用本文信息或工具而产生的损失或后果承担任何责任。使用本文所提供的信息或工具即视为同意本免责声明,并承诺遵守相关法律法规和道德规范。

不久前,我偶然发现了 Mariusz Banach佬的

https://github.com/mgeeky/ThreadStackSpoofer

的线程堆栈欺骗技术。我想看看是否可以使用汇编 (MASM) 复制该技术,因此我开始着手进行这项工作。对于那些不了解该技术的人,可以使用以下代码从 C 中演示该技术:

void WINAPI MySleep(DWORD _dwMilliseconds)             {                 [...]                 auto overwrite = (PULONG_PTR)_AddressOfReturnAddress();                 const auto origReturnAddress = *overwrite;                 *overwrite = 0;                              [...]                 *overwrite = origReturnAddress;             }

它将获取当前函数的返回地址并用零覆盖该值,然后在返回之前用其原始值恢复它。这有效地隐藏了上例中函数MySleep之后的任何内容的堆栈框架,并使调用堆栈看起来好像在**MySleep点被截断了。查看 C 代码,我们很可能可以用最少的努力使用汇编来复制它。但首先,我们应该对 64 位 Windows 上的堆栈有所了解。这是一张 64 位 Windows 上标准函数调用的照片。

汇编中的简单线程堆栈欺骗

【64 位 Windows 调用堆栈】

如你所见,在函数开始时,返回地址将位于 RSP 寄存器中。这是 上一个 C 示例中 intrin.h中_AddressOfReturnAddress()*返回的值。现在我们有了要覆盖的目标地址,我们还必须了解,在函数启动后对堆栈所做的任何更改都会使我们离堆栈上的返回地址越来越远。在函数继续执行时,它不会保留在 RSP 寄存器中,因此在汇编函数结束时恢复返回地址值时,必须牢记这个距离。如果我们没有正确地用其原始值恢复返回地址,我们将导致程序崩溃,因此正确的恢复是必要的。实际的实现可能有所不同,但一种方便的方法是将函数开头的 RSP 值复制到非易失性寄存器中以供稍后恢复,用零覆盖 RSP 的值(此时的返回地址),然后在最后从保存寄存器恢复该值。让我们演示一个例子。假设我们的汇编函数将占用 40 字节的堆栈空间,即十六进制的 28 字节。以下是我们的示例:

.CODE                          Spoof PROC                 mov r12, qword ptr [rsp]       ; Preserve the return address in r12                 mov qword ptr [rsp], 0         ; Overwrite return address with zero                 ...                 40 byte function                 ...                 mov qword ptr [rsp + 28h], r12 ; Restore the original value of the return address from r12 before returning                 ret             Spoof ENDP                          END

就是这样!这是一种执行线程堆栈欺骗的简单方法,您可以将其合并到用汇编语言编写的函数中。

原文始发于微信公众号(影域实验室):汇编中的简单线程堆栈欺骗

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月2日08:36:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   汇编中的简单线程堆栈欺骗https://cn-sec.com/archives/2985608.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息