1. angr初探:angr是什么?为什么选择angr做漏洞挖掘?angr的安装与验证
1.1 初见angr:它到底是个什么玩意儿?
先说说angr这个名字。它其实是个缩写——ANalysis of GRaph of binaries。说白了,就是一个二进制程序分析框架。
我最早接触angr是在2016年,那时候它还是个学生项目。嗯,现在已经是安全圈里响当当的工具了。你想想看,一个能自动分析二进制程序、能模拟执行、能符号执行、能找漏洞的工具,谁不爱?
angr的核心能力,我总结成三点:
- 符号执行:把程序输入当成符号变量,而不是具体数值。程序跑起来,angr自动探索所有可能的路径。
- 模拟执行:不需要CPU,不需要操作系统,angr自己模拟一个微型CPU来跑二进制。
- 程序分析:控制流图、数据依赖、调用图……这些静态分析能力它都有。
我个人习惯把angr比喻成一个二进制世界的调试器+反编译器+漏洞扫描器的合体。你给它一个二进制文件,它能帮你做很多事情。
核心观点:angr不是万能的,但它是目前开源社区里最强大的二进制分析框架之一。尤其适合做自动化漏洞挖掘。
1.2 为什么选angr做漏洞挖掘?
市面上做二进制分析的工具不少。IDA Pro、Ghidra、Radare2……为什么我偏偏推荐angr?
原因其实很简单——自动化。
你想想看,传统漏洞挖掘靠什么?靠人工逆向、靠Fuzzing、靠代码审计。这些方法各有各的痛点:
- 人工逆向:太慢。一个函数看半天,遇到混淆直接崩溃。
- Fuzzing:覆盖率上不去,路径爆炸,crash复现困难。
- 代码审计:得有源码,很多场景下你只有二进制。
angr的符号执行正好补上了这些短板。它能自动探索路径,自动生成触发crash的输入,自动分析约束条件。我在项目中遇到过好几次,用Fuzzer跑了三天没跑出来的漏洞,angr几分钟就找到了。
当然,angr也有它的局限性。比如符号执行本身存在路径爆炸问题,遇到循环多的程序会卡死。但这些问题,我们后面章节会讲怎么规避。
我的建议:angr最适合的场景是小规模、高精度的漏洞挖掘。比如分析一个库函数、一个协议解析器、一个文件格式解析器。大规模程序建议先用Fuzzing打底,再用angr做精准分析。
1.3 angr的安装:别踩这些坑
安装angr其实不难,但有几个坑我得提前说。我曾经在安装上浪费了整整一个下午,就是因为Python版本没选对。
环境要求
| 项目 | 推荐配置 | 备注 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 | Windows也能用,但坑更多 |
| Python版本 | 3.8 - 3.11 | 3.12及以上可能不兼容 |
| 内存 | 至少8GB | 符号执行很吃内存 |
| 磁盘 | 至少10GB空闲 | angr依赖的库比较多 |
安装步骤
我个人习惯用虚拟环境安装,避免污染系统Python。具体操作如下:
# 1. 创建虚拟环境
python3 -m venv angr_env
# 2. 激活虚拟环境
source angr_env/bin/activate
# 3. 安装angr
pip install angr
# 4. 验证安装
python -c "import angr; print(angr.__version__)"
如果看到输出版本号,比如9.2.xxx,那就说明安装成功了。
避坑指南:我曾经在Windows上装angr,结果编译依赖的C库报了一堆错。后来老老实实换到WSL2(Windows Subsystem for Linux)上,一次成功。如果你用Windows,强烈建议用WSL2或者Docker。
常见安装问题
- pip安装超时:换国内镜像源,比如
pip install angr -i https://pypi.tuna.tsinghua.edu.cn/simple - 编译错误:确保系统装了
build-essential、cmake、libffi-dev等依赖 - 版本冲突:建议用全新的虚拟环境,不要和已有项目混用
1.4 验证安装:写个简单demo跑一跑
装完了,总得验证一下能不能用。我写个最简单的例子——用angr加载一个二进制文件,看看它的入口点。
import angr
# 加载一个二进制文件(这里用/bin/ls举例)
proj = angr.Project('/bin/ls', auto_load_libs=False)
# 打印基本信息
print("架构:", proj.arch)
print("入口点:", hex(proj.entry))
print("文件名:", proj.filename)
# 获取控制流图
cfg = proj.analyses.CFGFast()
print("函数数量:", len(cfg.functions))
运行这段代码,你会看到类似这样的输出:
架构: <Arch AMD64 (LE)>
入口点: 0x4017a0
文件名: /bin/ls
函数数量: 127
嗯,看到这个输出,说明angr已经能正常工作了。它能正确识别二进制文件的架构、入口点,还能快速生成控制流图。
小技巧:auto_load_libs=False这个参数很重要。如果不加,angr会尝试加载所有依赖的动态库,速度会慢很多,而且容易报错。我一般只在需要分析库函数时才设为True。
1.5 本章知识体系
为了让你更直观地理解angr在漏洞挖掘中的位置,我画了一张图:
这张图展示了angr漏洞挖掘的完整流程:从二进制文件输入,经过angr框架的核心分析能力,最终输出漏洞发现结果。我们后续的课程,就是围绕这张图的每一层展开。
1.6 本章小结
这一章我们聊了三个事情:
- angr是什么:一个二进制程序分析框架,核心能力是符号执行、模拟执行和程序分析。
- 为什么选angr:自动化程度高,适合做精准漏洞挖掘,能补上传统方法的短板。
- 怎么安装和验证:推荐Linux + 虚拟环境,注意Python版本和依赖问题。
嗯,基础打好了。从下一章开始,我们会真正动手用angr做漏洞挖掘。到时候你会发现,原来挖漏洞可以这么自动化。
一句话总结:angr是二进制漏洞挖掘的瑞士军刀,值得你花时间掌握。