深入浅出Angr(一)
字数 1257 2025-08-06 08:35:16

深入浅出Angr符号执行框架教学文档

一、Angr简介

Angr是一个强大的二进制分析框架,主要用于符号执行和二进制分析。它能够:

  • 自动化逆向工程
  • 漏洞挖掘
  • CTF解题
  • 程序分析

二、核心概念

1. 符号执行

符号执行是一种程序分析技术,它使用符号值而非具体值作为输入,通过约束求解器跟踪程序执行路径。

2. 主要组件

  • Claripy: 约束求解引擎
  • SimuVEX: 中间语言和模拟器
  • CLE: 二进制加载器
  • PyVEX: VEX IR转换器

三、环境搭建

pip install angr

四、基本使用

1. 加载二进制文件

import angr
project = angr.Project("binary_file", auto_load_libs=False)

auto_load_libs参数说明:

  • True: 自动加载依赖库,分析更精确但速度慢
  • False: 不加载依赖库,遇到库函数返回符号值

2. 创建初始状态

三种创建状态的方法:

# 1. 空白状态
state = project.factory.blank_state(addr=0x400000)

# 2. 入口状态
state = project.factory.entry_state()

# 3. 完全初始化状态
state = project.factory.full_init_state()

3. 创建模拟管理器

simgr = project.factory.simulation_manager(state)

4. 执行探索

simgr.explore(find=0x400844, avoid=0x400855)

五、输入约束

1. 旧版(7.x.x.x)约束方法

for _ in xrange(28):
    k = st.posix.files[0].read_from(1)
    st.solver.add(k != 0)
    st.solver.add(k != 10)

2. 新版(8.18.10.25+)约束方法

import claripy

# 创建符号变量
flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(28)]
flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])

# 添加约束
for k in flag_chars:
    st.solver.add(k != 0)
    st.solver.add(k != 10)

六、获取结果

# 获取标准输入内容
input_data = simgr.found[0].posix.dumps(0)

# 获取标准输出内容
output_data = simgr.found[0].posix.dumps(1)

七、实战案例

1. Whitehat CTF 2015 - Crypto 400

def main():
    p = angr.Project('wyvern')
    flag_chars = [claripy.BVS('flag_%d' % i, 8) for i in range(28)]
    flag = claripy.Concat(*flag_chars + [claripy.BVV(b'\n')])
    
    st = p.factory.full_init_state(
        args=['./wyvern'],
        add_options=angr.options.unicorn,
        stdin=flag,
    )
    
    for k in flag_chars:
        st.solver.add(k != 0)
        st.solver.add(k != 10)
    
    sm = p.factory.simulation_manager(st)
    sm.run()
    
    for pp in sm.deadended:
        out = pp.posix.dumps(1)
        if b'flag{' in out:
            return next(filter(lambda s: b'flag{' in s, out.split()))

2. defcamp_r100

def main():
    p = angr.Project("r100", auto_load_libs=True)
    simgr = p.factory.simulation_manager(p.factory.full_init_state())
    simgr.explore(find=0x400844, avoid=0x400855)
    return simgr.found[0].posix.dumps(0).strip(b'\0\n')

八、版本差异

特性 旧版(7.x.x.x) 新版(8.18.10.25+)
输入约束 st.posix.files[0].read_from(1) claripy.BVS创建符号变量
状态管理 直接使用SimState 更结构化的API
输出处理 字符串处理 字节串处理(b前缀)

九、最佳实践

  1. 合理设置auto_load_libs:根据需求平衡精度和性能
  2. 使用unicorn引擎:提高执行效率
    st = p.factory.full_init_state(add_options=angr.options.unicorn)
    
  3. 明确约束条件:尽可能缩小解空间
  4. 合理设置findavoid:提高搜索效率
  5. 处理多路径:检查simgr.foundsimgr.deadended

十、常见问题

  1. API变动问题:Angr API变动频繁,建议:

    • 查看官方文档
    • 使用稳定版本
    • 参考最新示例代码
  2. 性能优化

    • 限制执行时间
    • 使用explore()num_find参数限制找到的路径数量
    • 使用step()逐步执行而非一次性run()
  3. 约束求解失败

    • 检查约束是否冲突
    • 尝试简化约束条件
    • 增加求解器超时时间

十一、进阶主题

  1. Hook技术:替换或修改特定函数的行为
  2. 路径爆炸处理:使用各种策略限制路径数量
  3. 自定义插件:扩展Angr功能
  4. 与IDA Pro集成:结合静态分析

十二、学习资源

  1. 官方文档: https://angr.io/
  2. API参考: https://api.angr.io/
  3. 示例仓库: https://github.com/angr/angr-examples

通过本教程,您应该已经掌握了Angr的基本用法和核心概念,能够开始使用Angr进行二进制分析和CTF解题。

深入浅出Angr符号执行框架教学文档 一、Angr简介 Angr是一个强大的二进制分析框架,主要用于符号执行和二进制分析。它能够: 自动化逆向工程 漏洞挖掘 CTF解题 程序分析 二、核心概念 1. 符号执行 符号执行是一种程序分析技术,它使用符号值而非具体值作为输入,通过约束求解器跟踪程序执行路径。 2. 主要组件 Claripy : 约束求解引擎 SimuVEX : 中间语言和模拟器 CLE : 二进制加载器 PyVEX : VEX IR转换器 三、环境搭建 四、基本使用 1. 加载二进制文件 auto_load_libs 参数说明: True : 自动加载依赖库,分析更精确但速度慢 False : 不加载依赖库,遇到库函数返回符号值 2. 创建初始状态 三种创建状态的方法: 3. 创建模拟管理器 4. 执行探索 五、输入约束 1. 旧版(7.x.x.x)约束方法 2. 新版(8.18.10.25+)约束方法 六、获取结果 七、实战案例 1. Whitehat CTF 2015 - Crypto 400 2. defcamp_ r100 八、版本差异 | 特性 | 旧版(7.x.x.x) | 新版(8.18.10.25+) | |------|--------------|------------------| | 输入约束 | st.posix.files[0].read_from(1) | claripy.BVS 创建符号变量 | | 状态管理 | 直接使用SimState | 更结构化的API | | 输出处理 | 字符串处理 | 字节串处理(b前缀) | 九、最佳实践 合理设置 auto_load_libs :根据需求平衡精度和性能 使用 unicorn 引擎 :提高执行效率 明确约束条件 :尽可能缩小解空间 合理设置 find 和 avoid :提高搜索效率 处理多路径 :检查 simgr.found 和 simgr.deadended 十、常见问题 API变动问题 :Angr API变动频繁,建议: 查看官方文档 使用稳定版本 参考最新示例代码 性能优化 : 限制执行时间 使用 explore() 的 num_find 参数限制找到的路径数量 使用 step() 逐步执行而非一次性 run() 约束求解失败 : 检查约束是否冲突 尝试简化约束条件 增加求解器超时时间 十一、进阶主题 Hook技术 :替换或修改特定函数的行为 路径爆炸处理 :使用各种策略限制路径数量 自定义插件 :扩展Angr功能 与IDA Pro集成 :结合静态分析 十二、学习资源 官方文档: https://angr.io/ API参考: https://api.angr.io/ 示例仓库: https://github.com/angr/angr-examples 通过本教程,您应该已经掌握了Angr的基本用法和核心概念,能够开始使用Angr进行二进制分析和CTF解题。