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依赖的库很多,比如pyvexclaripyarchinfo等。如果某个库版本不兼容,你会看到一堆报错。我的建议是:用虚拟环境

# 创建虚拟环境
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/源码 符号化输入 路径约束 约束求解(Z3) CTF逆向 漏洞挖掘 反混淆 Docker镜像 源码编译 虚拟环境 总结:符号执行是核心,angr是工具,安装选Docker

这张图把本章的核心内容串起来了。你记住:符号执行是核心思想,angr是具体实现工具,安装选Docker最省事。后面的章节,我们会一步步深入angr的各个模块。


公众号:蓝海资料掘金营,微信deep3321