开篇
今天我们来介绍一款python实现的二进制分析工具 — angr,由加州大学圣巴巴拉分校的计算机安全实验室开发。
angr是一个支持多CPU架构的二进制分析python工具包,可以对二进制文件进行各种静态分析,以及具有进行动态符号执行的能力,比如:
- 将二进制代码反汇编为中间表示(IR,Intermediate Representation);
- 程序插桩;
- 符号执行;
- 控制流分析;
- 数据依赖性分析;
- 值集分析(VSA,Value Set Analysis);
- …
angr项目的目标是创建一个用户友好的二进制分析套件,允许用户简单地启动iPython并通过几个命令就可以轻松执行复杂的二进制分析。
要以编程的方式分析二进制文件,通常按照以下几个步骤,大致是:
1.将二进制文件载入分析程序;
2.将二进制转换为中间表示(IR);
3.进行实际分析,比如:
- 部分或完整程序静态分析,比如依赖分析,程序切片等等;
- 对程序状态空间的象征性探索,比如模拟执行直到发现溢出漏洞;
- 上述方法的组合,比如只模拟执行导致内存写入的程序片段,以便找到溢出漏洞。
angr提供了各种组件来解决上面的各个步骤,接下来我们从安装开始,并通过示例来讲解下angr的能力。
安装
angr是Python 3.8+的库,因此必须安装到Python环境中才能使用。在安装之前我们可以通过conda创建一个python 3.10的虚拟环境:
conda create --name py310 python=3.10
conda activate py310
然后通过pip安装angr:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple angr
核心概念
要开始使用angr,我们需要对一些基本的angr概念,以及如何构造一些基本的angr对象有一个基本的了解。
Project对象
使用angr的第一个操作总是将二进制文件加载进来,如下:
>>> import angr
>>> proj = angr.Project('/bin/true')
Project对象是angr中最先创建的,也是最基础的对象,angr中其它类型的对象都依赖于该对象。有了它,我们才能在加载的二进制文件上进行分析和模拟。
Project对象中包含一些基本属性,这些属性说明了加载的二进制文件的一些基本信息:
import monkeyhex # 以十六进制方式查看打印的数字
>>> proj.arch # 二进制文件所属的CPU架构,为archinfo.Arch对象的实例
<Arch AMD64 (LE)>
>>> proj.arch.name # CPU架构名称
'AMD64'
>>> proj.arch.bits # CPU架构的位数,此处为64位
0x40
>>> proj.entry # 二进制文件的程序入口点地址
0x401670
>>> proj.filename # 二进制文件名
'/bin/true'
Loader加载器
获取静态的二进制文件在内存虚拟地址空间中的表示是相当复杂的,angr内部有一个叫做CLE的模块来处理这个问题。CLE模块执行的结果称为加载器,可以在proj.loader 属性中找到。我们可以用它来查看与你的程序一起加载的共享库,以及对加载后的地址空间执行基本查询:
>>> proj.loader # 查看加载的二进制对象和其内存映射区域的起始和终止地址
<Loaded true, maps [0x400000:0x5004000]>
>>> proj.loader<