使用ROP和硬件断点隐藏内存痕迹。

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

项目地址

https://github.com/Kudaes/RustChain

描述

该工具是使用ROP链和硬件断点来隐藏内存痕迹的简单概念验证。ROP链将在睡眠期间(即调用Sleep函数时)更改主模块内存页面的保护级别为N/A。有关此内存扫描逃避技术的更详细信息,请查看原始项目Gargoyle仅适用于x64架构

其思想是在kernel32!Sleep中设置硬件断点并添加一个新的顶级过滤器来处理异常。当调用Sleep时,之前设置的异常过滤器函数将被触发,允许我们调用ROP链,而无需使用传统的函数钩子。这样,我们避免在与众所周知的dll相关的进程中留下奇怪和不寻常的私有内存区域。

ROP链简单地调用VirtualProtect()将当前内存页面设置为N/A,然后调用SleepEx,最后恢复RX内存保护。

该过程的概述如下:

  • 我们使用SetUnhandledExceptionFilter来设置一个新的异常过滤器函数。
  • 使用SetThreadContext来在kernel32!Sleep上设置硬件断点。
  • 我们调用Sleep,触发硬件断点并将执行流程引导到我们的异常过滤器函数。
  • ROP链从异常过滤器函数中调用,允许将当前内存页面保护级别更改为N/A。然后调用SleepEx。最后,ROP链恢复RX内存保护,正常执行继续进行。

这个过程无限循环重复。

如图所示,主模块的内存保护在睡眠时更改为N/A,从而避免了寻找具有执行权限页面的内存扫描。

ad1a1b7183001125

 

 

编译

由于我们使用LITCRYPT插件来混淆字符串字面值,因此在编译代码之前需要设置环境变量LITCRYPT_ENCRYPT_KEY:

C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="你的超级秘密密钥"

之后,只需编译代码并运行工具:

C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe

限制

该工具只是一个概念验证,为了完全实用,还应该实现一些额外的功能。该项目的主要目的是学习如何实现ROP链并将其集成到Rust中。因此,只有在按照原样使用时,该工具才能正常工作,如果尝试以其他方式使用(例如将其编译为dll并尝试反射加载和执行),则可能会出现故障。

致谢

标签:工具分享, 思路分享, 学习笔记, 主机安全