angr 是一个功能强大的二进制程序分析框架,可用于程序的静态分析和动态符号执行。支持 x86、ARM、MIPS 和 PPC 架构中 32 bit 和 64 bit 可执行程序的分析。
0x01 安装
angr 是一个 python 库,适用于 python2.x 系列,暂时不支持 python3.x 系列。由于 angr 会对 libz3 和 libVEX 产生修改,为了防止对已安装库的修改而影响其他程序的使用,官方建议在 python 虚拟环境(virtualenvwrapper)中安装和使用 angr。
环境:
64bit Ubuntu 16.04.4 LTS (Xenial Xerus)
Python 2.7.12
1. 安装 virtualenvwrapper
virtualenv 是一个可以在同一台计算机中隔离多个 Python 环境的工具。它能够用于创建独立的 Python 环境,使得多个 Python 环境互不影响。virtualenvwrapper 是 virtualenv 的扩展管理包,可以更方便地管理虚拟环境。
使用 pip 命令安装 virtualenvwrapper,默认安装在 /usr/local/bin 目录下。
配置环境变量 WORKON_HOME 指定虚拟环境管理目录,然后运行 virtualenvwrapper.sh 初始化配置。
为了避免每次使用前手动执行以上命令,可以将其写入 shell 配置文件 ~/.bashrc 或 ~/.zshrc 中。
2. 安装依赖包
由于安装 angr 时需要编译一些 C 文件,需要安装 python-dev 和 libffi-dev。
3. 安装 angr
使用以下命令以开发模式安装 angr,安装完后可修改和重新编译 angr 的各模块,并且这些改动会自动反映到虚拟环境中。
0x02 顶层接口
1. Project
angr 模块中的 Project 是分析和模拟二进制可执行文件的基础。分析程序时通过 angr.Project 将二进制程序加载到项目中。
项目的基本属性有 CPU 架构(arch)、文件路径(filename)、入口地址(entry)。
2. Loader
angr 的 CLE 模块用于加载二进制程序到虚拟地址空间。加载器(loader)作为项目的一个属性可用于查看与二进制程序一起加载的共享库,并且可在加载地址空间进行查询操作。
3. Factory
angr 中有很多类,其中大部分需要在项目中进行实例化。通过 project.factory 可以方便地使用一些常用的对象。
1)Blocks
使用 project.factory.block 可从给定的地址提取代码块。
此外,还可将 block 转化为 VEX 中间语言形式。
2)State
Project 中保存的是程序的初始内存映像,二进制程序执行后的状态由 SimState(simulated program state)表示。SimState 包含程序执行时的状态数据,比如进程内存、寄存器和文件数据等。
3)Simulation Managers
模拟管理器是 angr 中用于执行和模拟程序的接口,可以管理多个程序状态。stash 为包含多个同类状态的列表,默认执行的 stash 为active。模拟管理器中使用 .step() 以基本 block 为单位运行。
执行之后,active 中的状态已更新,而初始状态 state 未改变。SimState 对象在程序执行时是不变的,所以可以将单个状态用作多次执行的“基础”。
4)Analyses
angr 中内置了多种分析功能(analyses)可用于提取程序中的信息,具体有以下 analyses:
例如使用 proj.analyses.CFGFast 可以生成程序的控制流图。
0x03 分析实例
state.step() 可运行程序,并返回一个 Simsuccessors 对象。符号执行过程中会产生多个后续状态,所以该对象是包含多个状态的列表。
符号执行过程中遇到类似于 if (x > 4) 的分支时,若 x 为符号位向量,angr 会生成一个约束条件
以程序 fauxware 为例,程序中的 authenticate( ) 函数中存在后门。以“SOSNEAKY”为密码,任何用户名都可以通过验证。
当程序运行到 if (strcmp(password, sneaky) == 0) 分支时会产生两个状态,其中一个状态将会包含用户输入正确后门密码的约束条件。
模拟执行的目标程序从标准输入中获取数据,默认情况下,angr 会将其视为符号数据流。为了进行符号求解并获得满足条件的输入,需要获取从 stdin 输入数据的引用,可以使用 state.posix.files[0].all_bytes() 获取从 stdin 中读取的数据。
由求解结果可知,输入后门密码“SOSNEAKY”可进入 state1,即成功通过身份认证。
还可以使用以下脚本求解:
References:
[1] angr Documentation