0x00 安装

虚拟环境: virtualenvmrapper

0x01 angr 简介


angr 官网

官网对angr给出的解释是,angr是一款二进制分析工具,它包含动态和静态符号分析,可以用来处理各种任务。本文主要针对angr解CTF题目做简单介绍。

0x02 angr 基本用法


以defcamp_quals 2015的r100题目为例

首先将载入二进制文件 r100, auto_load_libs 是设置是否自动加载外部动态链接。

1
2
import angr
proj = angr.Project('./r100',auto_load_libs = False)

然后获取当前的入口状态

1
state = proj.factory.entry_state()

在获取到当前的入口状态后,模拟执行

1
simg = proj.factory.simgr(state)

模拟执行后产生多种状态,我们要选择最终要到达的,过滤掉不需要的。

1
2
simg.explore(find = 0x400844, avoid = 0x400855)
#e = b.surveyors.Explorer(find=(0x4006ed,), avoid=(0x4006aa,0x4006fd))

获取最终的状态结果

1
simg.found[0].posix.dumps(3)

最终的结果如下,Code_Talkers即是我们最终需要的答案。

1
2
In [10]: simr.found[0].posix.dumps(3)
Out[10]: 'Code_Talkers\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\xf5\x00'

0x03 程序带参数执行


某些程序我们在程序运行的时候就应该输入参数,利用以

1
./example hello #运行

载入文件

1
2
3
import angr
import claripy #引入参数
proj = angr.Project('./ais3_crackme',auto_load_libs = False)

设置初始参数

1
argv1 = claripy.BVS('argv1',50*8) #BVS给的是二进制的参数,50*8才是50字节

获取初始状态

1
state = proj.factory.entry_state(args = ['ais3_crackme',argv1])

获取其各种状态,并explore

1
2
simg  = proj.factory.simgr(state)
simg.explore(find = 0x400602, avoid = 0x40060E)

得到最终的结果

1
2
simg.found[0].solver.eval(argv1)#asscii码形式
#simg.found[0].solver.eval(argv1,cast_str)

0x04 参考博文

angr框架初探

angr学习

angr汇总