环境搭建:Ubuntu 22.04虚拟机配置、Python 3.10虚拟环境创建、avatar2与angr的pip安装与源码编译
说实话,做固件逆向分析这么多年,我踩过最多的坑就是环境问题。你想想看,好不容易找到一个漏洞点,结果工具链跑不起来,那得多憋屈?所以这一章,咱们先把地基打牢。
我个人习惯用 Ubuntu 22.04 作为宿主系统。为什么选这个版本?因为它的 glibc 版本和 Python 3.10 的兼容性最好,我在项目中遇到过好几次因为 glibc 太新导致 angr 符号执行出诡异 bug 的情况。嗯,这里要注意,别图新鲜用 24.04,有些依赖包还没跟上。
1. 虚拟机配置要点
如果你用 VMware 或 VirtualBox,我建议给虚拟机分配至少 8GB 内存和 4 个 CPU 核心。angr 跑符号执行的时候,内存消耗很猛。我曾经在 4GB 的机器上跑一个简单的固件漏洞,结果直接 OOM 被 kill 了,白等两小时。
磁盘空间建议 60GB 以上。avatar2 调试时会产生大量快照文件,加上 angr 的缓存,空间很快就吃完了。
核心配置清单:
- CPU:4 核以上(推荐 8 核)
- 内存:8GB 以上(推荐 16GB)
- 磁盘:60GB 以上(推荐 120GB SSD)
- 网络:NAT 模式,方便 apt 更新
2. Python 3.10 虚拟环境创建
为什么非要虚拟环境?说白了,就是怕依赖冲突。angr 和 avatar2 对某些库的版本要求不一样,直接装系统里迟早出事。我见过有人把系统 Python 搞崩了,最后重装系统,那叫一个惨。
先确认系统 Python 版本:
python3 --version
# 如果版本不是 3.10,需要安装
sudo apt update
sudo apt install python3.10 python3.10-venv python3.10-dev
然后创建虚拟环境:
python3.10 -m venv ~/firmware_env
source ~/firmware_env/bin/activate
我个人习惯把虚拟环境放在 home 目录下,取名 firmware_env,这样一眼就能认出是干啥用的。每次打开终端第一件事就是 source ~/firmware_env/bin/activate,已经形成肌肉记忆了。
小技巧:在 ~/.bashrc 里加一行别名:alias fwenv='source ~/firmware_env/bin/activate',以后直接敲 fwenv 就能激活环境。
3. avatar2 的 pip 安装与源码编译
avatar2 有两种安装方式。如果你只是做常规调试,pip 安装就够了。但如果你要修改 avatar2 的底层逻辑(比如自定义调试器接口),那就得源码编译。
3.1 pip 安装(推荐新手)
pip install avatar2
就这么简单?嗯,但有个坑。avatar2 依赖 pyelftools 和 capstone,有时候 pip 不会自动装全。我建议手动装一下:
pip install pyelftools capstone unicorn
为什么强调 unicorn?因为 avatar2 底层用 unicorn 做模拟执行,没有它,很多功能跑不起来。我曾经在项目里忘了装,结果 avatar2 启动后一直报 ImportError,排查了半天才发现是这个问题。
3.2 源码编译(进阶需求)
如果你需要调试 avatar2 的内部行为,或者想给它打补丁,那就走源码编译:
git clone https://github.com/avatartwo/avatar2.git
cd avatar2
pip install -e .
-e 参数表示可编辑模式,你修改源码后不需要重新安装,直接生效。这个在调试 avatar2 自身 bug 时特别有用。
注意:源码编译前确保系统装了 libffi-dev 和 pkg-config,否则编译会报错。命令:sudo apt install libffi-dev pkg-config
4. angr 的 pip 安装与源码编译
angr 的安装比 avatar2 稍微复杂一点,因为它依赖 z3 求解器。不过 pip 会自动处理,你只需要:
pip install angr
但这里有个性能问题。默认的 z3 是纯 Python 版本,跑符号执行时慢得让人抓狂。我建议安装带原生支持的 z3:
pip install angr-native
这个包会编译 z3 的 C++ 版本,速度能提升 5-10 倍。我在分析一个 2MB 的固件时,用纯 Python 版本跑了 3 小时没出结果,换成原生版本后 20 分钟就搞定了。差距就是这么大。
4.1 源码编译 angr
如果你要修改 angr 的源码(比如自定义符号执行策略),那就:
git clone https://github.com/angr/angr.git
cd angr
pip install -e .
angr 的源码结构比较清晰,核心逻辑在 angr/angr/ 目录下。我建议把 angr-management 也装上,它提供了一个 GUI 界面,方便查看 CFG 和符号执行状态:
pip install angr-management
5. 验证安装是否成功
装完之后,跑个简单的测试脚本,确认环境没问题:
import avatar2
import angr
print(f"avatar2 version: {avatar2.__version__}")
print(f"angr version: {angr.__version__}")
# 测试 angr 能否加载一个简单的二进制
proj = angr.Project("/bin/ls", auto_load_libs=False)
print(f"Binary architecture: {proj.arch.name}")
如果输出正常,说明环境搭建成功。如果报错,多半是依赖没装全,回头检查一下 capstone、unicorn、pyelftools 这几个包。
避坑指南:我曾经在 macOS 上装 angr,结果因为 clang 版本问题编译失败。后来切到 Ubuntu 22.04 虚拟机,一次成功。所以如果你用 Windows 或 macOS,强烈建议用虚拟机,省心很多。
6. 知识体系结构图
下面这张图概括了本章的环境搭建流程和依赖关系,你可以对照着检查自己的环境:
环境搭建这块,说白了就是一次配置,长期受益。只要按照上面的步骤走,基本不会出问题。如果遇到报错,别慌,先检查依赖包版本,再确认 Python 环境是否激活。我当年刚开始搞固件分析时,光环境就折腾了两天,现在回想起来,其实就是少装了一个 libffi-dev。
好了,环境搭好了,后面咱们就可以真正开始玩 avatar2 和 angr 的联合调试了。