1、angr初探:什么是符号执行?angr能做什么?angr的安装与环境配置
各位同学好,我是你们这门课的老师。今天咱们正式开始《angr自动化逆向从入门到独立分析》的第一讲。
在正式开始之前,我先问大家一个问题:你平时做逆向分析,是不是经常遇到这样的情况——一个二进制文件,你拖进IDA,F5一看,好家伙,一堆混淆、花指令,或者干脆就是个加密壳?你手动跟了半天,头都大了,最后发现某个关键跳转死活分析不出来。
嗯,我当年也经历过这种痛苦。那时候我就在想:有没有一种工具,能自动帮我分析这些路径,甚至直接告诉我“输入什么能让程序走到成功分支”?
答案就是——符号执行。而angr,就是目前最成熟的符号执行工具之一。
1.1 什么是符号执行?
说白了,符号执行就是把程序的输入当成一个数学符号,而不是具体的数值。
举个例子。你写了一个简单的C程序:
int check_password(char *input) {
if (input[0] == 'A' && input[1] == 'B') {
return 1; // 成功
} else {
return 0; // 失败
}
}
传统逆向分析,你得手动输入'A'、'B'去试,或者静态分析看字符串。但符号执行是怎么做的呢?
它把input[0]和input[1]分别设为符号变量x0、x1。然后沿着程序路径走,遇到条件判断时,它会记录下路径约束:
- 成功路径:x0 == 'A' 且 x1 == 'B'
- 失败路径:x0 != 'A' 或 x1 != 'B'
然后,符号执行引擎会调用约束求解器(比如Z3),直接解出满足成功路径的x0、x1值。结果就是:x0=65('A'),x1=66('B')。
看到了吗?你不需要手动分析,它自动就给你算出来了。
核心思想:符号执行 = 符号化输入 + 路径约束收集 + 约束求解。它把逆向分析问题,转化成了数学求解问题。
我在项目中遇到过最典型的场景:一个CTF的逆向题,程序有1000多条路径,手动分析得崩溃。用angr符号执行,几分钟就找到了正确的输入。嗯,这就是符号执行的威力。
1.2 angr能做什么?
angr是一个二进制分析框架,它把符号执行、动态分析、静态分析都整合到了一起。你想想看,它就像一个瑞士军刀,专门用来对付二进制文件。
具体来说,angr能帮你做这些事:
| 功能 | 说明 | 我常用的场景 |
|---|---|---|
| 符号执行 | 自动探索路径,求解输入 | CTF逆向、漏洞利用条件生成 |
| 程序分析 | 控制流图、数据依赖、调用约定 | 分析恶意软件行为 |
| 漏洞挖掘 | 自动检测缓冲区溢出、格式化字符串等 | Fuzzing前的辅助分析 |
| 反混淆 | 去除控制流平坦化、虚拟化保护 | 分析加壳后的程序 |
| 动态符号执行 | 结合具体执行和符号执行 | 处理复杂路径爆炸问题 |
我个人习惯把angr当作一个自动化分析引擎。比如,你有一个加了UPX壳的exe,传统做法是手动脱壳。但用angr,你可以直接加载它,angr会自动模拟执行,帮你找到原始入口点。
小提示:angr不是万能的。遇到路径爆炸(路径数量指数级增长)时,它也会卡住。但大部分常规场景,它比手动分析快10倍以上。
1.3 angr的安装与环境配置
安装angr,我推荐两种方式:Docker 和 源码编译。我个人更推荐Docker,省心省力。
方式一:Docker安装(推荐)
Docker安装是最快的方式。你只需要一个Docker环境,然后拉取官方镜像:
# 拉取angr官方镜像
docker pull angr/angr
# 运行容器,并挂载本地目录
docker run -it -v /your/local/path:/home/angr angr/angr
# 进入容器后,验证安装
python3 -c "import angr; print(angr.__version__)"
我曾经踩过一个坑:Docker镜像默认是Python 3.8,但有些旧项目需要Python 3.6。这时候你可以指定版本:
docker pull angr/angr:py38 # 或者 py39、py310
注意:Docker镜像比较大(约2-3GB),第一次拉取需要耐心。建议使用国内镜像加速,比如阿里云、中科大源。
方式二:源码编译(进阶)
如果你需要定制angr,或者想研究它的内部实现,那就源码编译。不过说实话,这个过程有点折腾,我当年编译了整整一下午。
# 1. 安装依赖(Ubuntu/Debian)
sudo apt-get update
sudo apt-get install python3-dev python3-pip build-essential \
libffi-dev libssl-dev libxml2-dev libxslt1-dev \
zlib1g-dev libboost-all-dev cmake
# 2. 克隆angr仓库
git clone https://github.com/angr/angr.git
cd angr
# 3. 安装angr及其依赖
pip3 install -e .
# 4. 安装可选组件(比如angr-management图形界面)
pip3 install angr-management
这里有个坑:angr依赖的库很多,比如pyvex、claripy、archinfo等。如果某个库版本不兼容,你会看到一堆报错。我的建议是:用虚拟环境。
# 创建虚拟环境
python3 -m venv angr_env
source angr_env/bin/activate
# 在虚拟环境中安装
pip3 install angr
验证安装
安装完成后,写个简单脚本测试一下:
import angr
# 创建一个简单的二进制文件(比如一个/bin/ls)
proj = angr.Project('/bin/ls', auto_load_libs=False)
# 打印程序入口点
print(f"入口点: {hex(proj.entry)}")
# 获取CFG(控制流图)
cfg = proj.analyses.CFGFast()
print(f"函数数量: {len(cfg.functions)}")
如果输出正常,说明angr安装成功了。
避坑指南:我曾经在Windows上尝试源码编译angr,结果折腾了两天没成功。后来发现,angr官方对Windows支持有限。建议在Linux或macOS上使用。如果你只有Windows,用WSL2或者Docker Desktop吧。
1.4 知识体系总览
为了让大家对本章内容有个整体认识,我画了一张图:
这张图把本章的核心内容串起来了。你记住:符号执行是核心思想,angr是具体实现工具,安装选Docker最省事。后面的章节,我们会一步步深入angr的各个模块。
公众号:蓝海资料掘金营,微信deep3321