利用Angr分析恶意软件的通信协议
字数 1180 2025-08-25 22:59:09

利用Angr分析恶意软件通信协议的教学文档

1. 背景与概述

在恶意软件分析中,理解恶意程序与C&C服务器的通信协议是一项关键但困难的任务。传统方法(如动态分析和调试)存在以下局限性:

  • 恶意软件基础设施可能已崩溃
  • 样本可能被隔离无法连接C&C
  • 需要创建伪装的服务器或不断修补样本代码

Angr是一个强大的二进制分析框架,通过符号执行技术可以:

  • 静态分析二进制文件
  • 确定执行不同代码分支的条件
  • 无需实际执行程序即可理解通信协议

2. Angr核心概念

2.1 符号执行

  • 使用符号变量代替具体值
  • 跟踪程序执行路径
  • 记录路径约束条件
  • 求解满足特定分支的输入值

2.2 关键地址识别

使用Angr前需要确定四个关键内存地址:

  1. 起始地址(START_ADDR):分析开始的代码位置
  2. 结束地址(STOP_ADDR):分析结束的位置
  3. 目标地址(FIND_ADDRS):需要到达的特定代码位置
  4. 缓冲区地址(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. 应用场景

  1. IOC提取:识别C&C通信特征
  2. 模拟服务器:构建伪C&C服务器与样本交互
  3. 功能分析:理解恶意软件完整功能集
  4. 漏洞挖掘:发现协议解析中的潜在漏洞

7. 总结

Angr的符号执行技术为恶意软件通信协议分析提供了强大工具,能够:

  • 系统性地探索所有可能的执行路径
  • 精确识别触发特定功能的输入条件
  • 无需实际执行样本即可理解协议格式
  • 显著提高逆向工程效率

通过合理配置关键地址和约束条件,分析人员可以快速重建复杂的恶意软件通信协议,为后续分析提供坚实基础。

利用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 函数汇编代码结构如下: 3.3 Angr配置 3.4 符号执行与分析 3.5 输出解析示例 Angr可能输出如下结果: 4. 协议逆向工程 4.1 协议结构推断 通过分析多个分支的约束条件,可以重建协议格式: 4.2 命令类型识别 通过约束条件识别命令类型: 文件系统操作: buffer[0:4] == 0x64bbe900 创建文件: buffer[4:8] == 0xaff80c17 写入文件: buffer[4:8] == 0xc6e6ef6b 删除文件: buffer[4:8] == 0x1f01d4d4 5. 高级技巧 5.1 避免路径爆炸 设置合理的 STOP_ADDR 使用 avoid 参数排除不相关的分支 5.2 约束优化 合并相似的约束条件 消除冗余约束(如示例中的前两个约束可以省略) 5.3 处理混淆代码 识别并绕过反分析技术 使用Angr的hook功能替换复杂函数 6. 应用场景 IOC提取 :识别C&C通信特征 模拟服务器 :构建伪C&C服务器与样本交互 功能分析 :理解恶意软件完整功能集 漏洞挖掘 :发现协议解析中的潜在漏洞 7. 总结 Angr的符号执行技术为恶意软件通信协议分析提供了强大工具,能够: 系统性地探索所有可能的执行路径 精确识别触发特定功能的输入条件 无需实际执行样本即可理解协议格式 显著提高逆向工程效率 通过合理配置关键地址和约束条件,分析人员可以快速重建复杂的恶意软件通信协议,为后续分析提供坚实基础。