问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
逆向工程实战:通过硬件断点提取恶意软件中的shellcode并分析
如何通过硬件断点从恶意软件中提取Shellcode,使用不同的方法分析shellcode。
前言 == 在进行恶意软件分析的过程中,经常会遇到恶意软件在内存地址空间中加载Shellcode的行为。如何通过硬件断点来提取恶意软件中的shellcode并进行分析? 当标准的加载器解压文件时,通常会结合使用 `VirtualAlloc`、`VirtualProtect` 和 `CreateThread` 这些函数。这些函数允许恶意软件分配新的内存区域,用于存储和执行解压后的有效负载。 在大多数恶意软件中 - 我们可以在`VirtualAlloc`和`VirtualProtect`函数调用上设置断点,并使用硬件断点监视结果。当访问新分配的缓冲区时,这将发出警报,从那里通常很容易获得解码的有效载荷。 前置知识 ==== 硬件断点 ---- **硬件断点(Hardware Breakpoint)** 是一种由处理器提供的调试功能,用于在特定条件下暂停程序执行。与软件断点不同,硬件断点不依赖于在代码中插入特殊指令(如INT 3指令),而是利用处理器的内置机制来监控内存地址或数据访问。 处理器会提供几组特殊的寄存器,被称为**调试寄存器(Debug Registers)**,如x86架构中的`DR0`到`DR7`。这些寄存器课可以设置特定的内存地址或条件,同时,调试过程中可以设置的硬件断点的有限的。 硬件断点在实战过程中经常被用来检测内存地址的读写操作,是否被访问。 函数介绍 ---- **VirtualAlloc**: - Windows API函数,用于在进程的虚拟地址空间中分配内存。恶意软件使用它来创建新的内存区域,通常是为了解压后的代码或数据预留空间。 - 这个函数允许指定内存的大小和属性(如可读、可写、可执行),这对加载和执行恶意代码非常重要。  **VirtualProtect**: - 这个函数用于更改内存区域的保护属性。恶意软件在使用 `VirtualAlloc` 分配内存后,可能需要使用 `VirtualProtect` 来调整内存的权限。 - 解压缩后的代码可能首先以可写入的方式存储,然后在需要执行时将该内存区域的权限修改为可执行。这种动态更改内存权限的行为是很多恶意软件常用的手段,目的是绕过某些安全防护机制。 实战分析 ==== IOC --- | HASH | Value | |---|---| | SHA256 | 08ec3f13e8637a08dd763af6ccb46ff8516bc46efaacb1e5f052ada634a90c0e95cfc3dd3c9ac6713202be2fbc0ffd2d | | MD5 | 95cfc3dd3c9ac6713202be2fbc0ffd2d | | SHA1 | 66dc4ca8d51d03c729d70b888bc57fec44738f0d | 样本分析 ---- ```php (虚拟环境运行and打快照) ``` DIE查看:   64位的DLL文件,同时查看导出表,DllRegisterServer应该是载入shellcode的地方。 x64dbg分析 --------  断在了Entrypoint上,这里直接运行就可以发现。  这是一个DLL文件,如果直接运行越过EntryPoint将什么也不会发生,真正的实现应该在导出函数上。  因此我们应该让它在导出函数中运行,跳转到导出函数DllRegisterServer后,在这里设置新的RIP位置。  之后根据上面的思路先下个断点,`bp kernelbase.VirtualAlloc`  下完断点后F9运行,断下来后再Ctrl+F9,这将运行到函数结束:  如果成功VirtualAlloc将会返回一个指向RAX寄存器中空缓存区的地址,右键它选择在内存窗口中显示:  硬件断点设置 ------ 右键点击空缓冲区的第一个字节:  之后F9运行,程序会中断并开始填充空缓冲区:  接着Ctrl+F9运行到函数返回。填充完整个内存空间。  这样就得到了DLL中隐藏的shellcode了。 shellcode分析 =========== shellcode可以提取出来,也可以直接在dbg上调试 cyberchef --------- 选中所有的十六进制,复制:  打开CyberChef(一个加解密十分好用的网站)  speakeasy --------- 一个二进制模拟器:  github链接:<https://github.com/mandiant/speakeasy> 将shellcode复制到txt,重命名为shellcode.bin即可。 x64dbg ------ 选中第一处字节,跳转到反汇编窗口:  在shellcode中执行,将FC设置为新的RIP,然后进入第一个call:  对所有的call rbp都打上断点,F9运行。     几次之后,你就可以得到一个C2域了。 ### API哈希 可以搜索call rbp的上一条语句的hash:  可以快速知道哪一些哈希对应的API函数是什么。 同时可以选中F7进入call rbp中:  例如这里,遍历TEB/PEB表并计算ROT13哈希(0xD=13)
发表于 2024-08-19 10:09:23
阅读 ( 19851 )
分类:
漏洞分析
0 推荐
收藏
0 条评论
请先
登录
后评论
Sciurdae
16 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!