深入浅出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前缀) |
九、最佳实践
- 合理设置
auto_load_libs:根据需求平衡精度和性能 - 使用
unicorn引擎:提高执行效率st = p.factory.full_init_state(add_options=angr.options.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解题。