利用Angr分析恶意软件的通信协议
字数 1180 2025-08-25 22:59:09
利用Angr分析恶意软件通信协议的教学文档
1. 背景与概述
在恶意软件分析中,理解恶意程序与C&C服务器的通信协议是一项关键但困难的任务。传统方法(如动态分析和调试)存在以下局限性:
- 恶意软件基础设施可能已崩溃
- 样本可能被隔离无法连接C&C
- 需要创建伪装的服务器或不断修补样本代码
Angr是一个强大的二进制分析框架,通过符号执行技术可以:
- 静态分析二进制文件
- 确定执行不同代码分支的条件
- 无需实际执行程序即可理解通信协议
2. Angr核心概念
2.1 符号执行
- 使用符号变量代替具体值
- 跟踪程序执行路径
- 记录路径约束条件
- 求解满足特定分支的输入值
2.2 关键地址识别
使用Angr前需要确定四个关键内存地址:
- 起始地址(START_ADDR):分析开始的代码位置
- 结束地址(STOP_ADDR):分析结束的位置
- 目标地址(FIND_ADDRS):需要到达的特定代码位置
- 缓冲区地址(BUFF_ADDR):存放服务器响应数据的变量位置
3. 实战分析步骤
3.1 示例恶意软件分析
以一个虚构的RAT为例,其关键函数为:
call_home():接收C&C命令exec_order():根据命令执行相应操作
3.2 反汇编代码分析
编译后的exec_order函数汇编代码结构如下:
初始化
比较命令类型
分支1: 文件系统操作
分支1.1: 创建文件
分支1.2: 写入文件
分支1.3: 删除文件
分支2: 系统操作
分支3: 网络操作
...
3.3 Angr配置
import angr
# 关键地址配置
START_ADDR = 0x0804844d # exec_order函数开始
FIND_ADDRS = [0x8048483] # 创建文件分支的特定指令
BUFF_ADDR = 0xABCD1234 # 存放C&C响应的缓冲区
STOP_ADDR = 0x08048500 # 分析结束地址
# 初始化项目
proj = angr.Project("malware.bin", auto_load_libs=False)
# 创建初始状态
state = proj.factory.blank_state(addr=START_ADDR)
# 设置符号变量
buffer = state.memory.load(BUFF_ADDR, 20) # 假设缓冲区20字节
state.regs.ebx = BUFF_ADDR # 假设ebx指向缓冲区
3.4 符号执行与分析
# 创建模拟管理器
simgr = proj.factory.simulation_manager(state)
# 探索到目标地址的路径
simgr.explore(find=FIND_ADDRS)
# 分析结果
for found in simgr.found:
print("Found path to target:")
print(found.solver.constraints)
# 获取满足条件的缓冲区值
solution = found.solver.eval(buffer, cast_to=bytes)
print("Required buffer:", solution.hex())
3.5 输出解析示例
Angr可能输出如下结果:
Found path to 0x8048483 (文件创建分支)
约束条件:
1. buffer[3:0] == 0x64bbe900 (T_FILESYSTEM)
2. buffer[7:4] != 0xaff80c17 (FSO_CREATE)
3. buffer[7:4] != 0xc6e6ef6b (FSO_WRITE)
4. buffer[7:4] == 0x1f01d4d4 (FSO_DELETE)
满足条件的缓冲区示例:
00e9bb64 d4d4011f af78096e 00000000 00000000
4. 协议逆向工程
4.1 协议结构推断
通过分析多个分支的约束条件,可以重建协议格式:
Offset Length Field Description
0x00 4 Magic Constant value 0x00e9bb64
0x04 4 Command FSO_DELETE=0x1f01d4d4, etc.
0x08 12 Parameters Command-specific data
4.2 命令类型识别
通过约束条件识别命令类型:
- 文件系统操作:
buffer[0:4] == 0x64bbe900- 创建文件:
buffer[4:8] == 0xaff80c17 - 写入文件:
buffer[4:8] == 0xc6e6ef6b - 删除文件:
buffer[4:8] == 0x1f01d4d4
- 创建文件:
5. 高级技巧
5.1 避免路径爆炸
- 设置合理的
STOP_ADDR - 使用
avoid参数排除不相关的分支
simgr.explore(find=FIND_ADDRS, avoid=[0xdeadbeef])
5.2 约束优化
- 合并相似的约束条件
- 消除冗余约束(如示例中的前两个约束可以省略)
5.3 处理混淆代码
- 识别并绕过反分析技术
- 使用Angr的hook功能替换复杂函数
6. 应用场景
- IOC提取:识别C&C通信特征
- 模拟服务器:构建伪C&C服务器与样本交互
- 功能分析:理解恶意软件完整功能集
- 漏洞挖掘:发现协议解析中的潜在漏洞
7. 总结
Angr的符号执行技术为恶意软件通信协议分析提供了强大工具,能够:
- 系统性地探索所有可能的执行路径
- 精确识别触发特定功能的输入条件
- 无需实际执行样本即可理解协议格式
- 显著提高逆向工程效率
通过合理配置关键地址和约束条件,分析人员可以快速重建复杂的恶意软件通信协议,为后续分析提供坚实基础。