在进行恶意软件分析的过程中,经常会遇到恶意软件在内存地址空间中加载Shellcode的行为。如何通过硬件断点来提取恶意软件中的shellcode并进行分析?
当标准的加载器解压文件时,通常会结合使用 VirtualAlloc
、VirtualProtect
和 CreateThread
这些函数。这些函数允许恶意软件分配新的内存区域,用于存储和执行解压后的有效负载。
在大多数恶意软件中 - 我们可以在VirtualAlloc
和VirtualProtect
函数调用上设置断点,并使用硬件断点监视结果。当访问新分配的缓冲区时,这将发出警报,从那里通常很容易获得解码的有效载荷。
硬件断点(Hardware Breakpoint) 是一种由处理器提供的调试功能,用于在特定条件下暂停程序执行。与软件断点不同,硬件断点不依赖于在代码中插入特殊指令(如INT 3指令),而是利用处理器的内置机制来监控内存地址或数据访问。
处理器会提供几组特殊的寄存器,被称为调试寄存器(Debug Registers),如x86架构中的DR0
到DR7
。这些寄存器课可以设置特定的内存地址或条件,同时,调试过程中可以设置的硬件断点的有限的。
硬件断点在实战过程中经常被用来检测内存地址的读写操作,是否被访问。
VirtualAlloc:
VirtualProtect:
VirtualAlloc
分配内存后,可能需要使用 VirtualProtect
来调整内存的权限。HASH | Value |
---|---|
SHA256 | 08ec3f13e8637a08dd763af6ccb46ff8516bc46efaacb1e5f052ada634a90c0e95cfc3dd3c9ac6713202be2fbc0ffd2d |
MD5 | 95cfc3dd3c9ac6713202be2fbc0ffd2d |
SHA1 | 66dc4ca8d51d03c729d70b888bc57fec44738f0d |
(虚拟环境运行and打快照)
DIE查看:
64位的DLL文件,同时查看导出表,DllRegisterServer应该是载入shellcode的地方。
断在了Entrypoint上,这里直接运行就可以发现。
这是一个DLL文件,如果直接运行越过EntryPoint将什么也不会发生,真正的实现应该在导出函数上。
因此我们应该让它在导出函数中运行,跳转到导出函数DllRegisterServer后,在这里设置新的RIP位置。
之后根据上面的思路先下个断点,bp kernelbase.VirtualAlloc
下完断点后F9运行,断下来后再Ctrl+F9,这将运行到函数结束:
如果成功VirtualAlloc将会返回一个指向RAX寄存器中空缓存区的地址,右键它选择在内存窗口中显示:
右键点击空缓冲区的第一个字节:
之后F9运行,程序会中断并开始填充空缓冲区:
接着Ctrl+F9运行到函数返回。填充完整个内存空间。
这样就得到了DLL中隐藏的shellcode了。
shellcode可以提取出来,也可以直接在dbg上调试
选中所有的十六进制,复制:
打开CyberChef(一个加解密十分好用的网站)
一个二进制模拟器:
github链接:https://github.com/mandiant/speakeasy
将shellcode复制到txt,重命名为shellcode.bin即可。
选中第一处字节,跳转到反汇编窗口:
在shellcode中执行,将FC设置为新的RIP,然后进入第一个call:
对所有的call rbp都打上断点,F9运行。
几次之后,你就可以得到一个C2域了。
可以搜索call rbp的上一条语句的hash:
可以快速知道哪一些哈希对应的API函数是什么。
同时可以选中F7进入call rbp中:
例如这里,遍历TEB/PEB表并计算ROT13哈希(0xD=13)
16 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!