Angr
这份备忘录的部分内容基于angr文档。
安装
sudo apt-get install python3-dev libffi-dev build-essential
python3 -m pip install --user virtualenv
python3 -m venv ang
source ang/bin/activate
pip install angr基本操作
import angr
import monkeyhex # this will format numerical results in hexadecimal
#Load binary
proj = angr.Project('/bin/true')
#BASIC BINARY DATA
proj.arch #Get arch "<Arch AMD64 (LE)>"
proj.arch.name #'AMD64'
proj.arch.memory_endness #'Iend_LE'
proj.entry #Get entrypoint "0x4023c0"
proj.filename #Get filename "/bin/true"
#There are specific options to load binaries
#Usually you won't need to use them but you could
angr.Project('examples/fauxware/fauxware', main_opts={'backend': 'blob', 'arch': 'i386'}, lib_opts={'libc.so.6': {'backend': 'elf'}})已加载和主对象信息
已加载数据
主要目标
符号和重定位
块
动态分析
模拟管理器,状态
调用函数
通过
args和env将参数列表和环境变量字典传递给entry_state和full_init_state。这些结构中的值可以是字符串或位向量,并将被序列化为状态中的参数和环境,用于模拟执行。默认的args是一个空列表,因此,如果您要分析的程序期望至少找到一个argv[0],您应该始终提供它!如果您希望
argc是符号的,可以将符号位向量作为argc传递给entry_state和full_init_state构造函数。但要小心:如果这样做,您还应该向生成的状态添加一个约束,即您的 argc 值不能大于您传递给args的参数数量。要使用调用状态,应该使用
.call_state(addr, arg1, arg2, ...),其中addr是您想要调用的函数的地址,argN是该函数的第 N 个参数,可以是 Python 整数、字符串、数组或位向量。如果您想要分配内存并实际传递一个对象的指针,您应该将其包装在 PointerWrapper 中,即angr.PointerWrapper("point to me!")。这个 API 的结果可能有点不可预测,但我们正在努力改进。
位向量
符号位向量和约束
Hooking
钩子
此外,您可以使用proj.hook_symbol(name, hook),将符号的名称作为第一个参数提供,以挂钩符号所在的地址
示例
最后更新于