23R3F's Blog

初探angr

字数统计: 832阅读时长: 3 min
2019/03/25 Share

angr作为一个符号执行的神器,是时候学它一波了

安装

这里采用python虚拟环境的方法来安装,可以与自己本机的python环境隔离开来,不会产生不可预见的玄学问题

安装编译所需要的环境
sudo apt install python-dev libffi-dev build-essential virtualenvwrapper

创建一个名字为angr的虚拟环境,并且会生成一个名字为angr目录
virtualenv angr

开始使用虚拟环境前,需要被激活
source ./angr/bin/activate

激活好后在终端界面命令行最开头中会出现(angr)

接着就安装angr
sudo pip install angr

angr流程

使用 angr 的大概步骤

  • 创建 project

  • 设置 state

  • 新建 符号量 : BVS (bitvector symbolic ) 或 BVV (bitvector value)

  • 把符号量设置到内存或者其他地方

  • 设置 Simulation Managers , 进行路径探索的对象

  • 运行,探索满足路径需要的值

  • 约束求解,获取执行结果

这里放一个最经典的模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#-*- coding:utf-8 -*-
import angr

def main():
p = angr.Project("xxx")
#创建一个Angr工程,可以追加参数:load_options={"auto_load_libs": False}
#auto_load_libs 设置是否自动载入依赖的库,如果设置为 True 的话会自动载入依赖的库
#然后分析到库函数调用时也会进入库函数,这样会增加分析的工作量,也有能会跑挂

state = p.factory.entry_state()
#获取入口函数,也可以指定某个地址
sm = p.factory.simgr(state)
#在入口准备开始符号执行
sm.explore(find=0x804868B, avoid=0x804869E)
#遍历可能的路径并找到成功的那条路径
#最终想找到的路径是0x804868B,要避开的路径是0x804869E,这里可以写多个avoid,用[]
return sm.found[0].posix.dumps(0).strip('\0\n')
#返回当前状态输入 dumps(0)表示输入

if __name__ == '__main__':
print main()

angr解题

martricks

网鼎杯的一道题

1553500384035

很明显要输入一个字符串

接着进行了一系列的运算判断

1553500415620

最后的也就分两条路径,找到congrats的路径,避免wrong flag的路径,就可以写出脚本了,这个大概一分钟就跑出来了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#-*- coding:utf-8 -*-
import angr

def main():
p = angr.Project("martricks")
#创建一个Angr工程
state = p.factory.entry_state(add_options=angr.options.unicorn)
#获取入口函数,使用unicorn引擎加速

sm = p.factory.simgr(state)
#在入口准备开始符号执行
sm.explore(find=0x400A84, avoid=0x400A90)
#遍历可能的路径并找到成功的那条路径
return sm.found[0].posix.dumps(0).strip('\0\n')
#返回当前状态输入 dumps(0)表示输入

if __name__ == '__main__':
print main()

持续加题填坑。。。。

angr tips

加速执行速度

  • 使用 pypy

    1
    2
    3
    4
    5
    6
    7
    安装方式:
    sudo apt install pypy
    wget https://bootstrap.pypa.io/get-pip.py
    sudo pypy get-pip.py
    然后使用 pip 安装 angr
    sudo pip install angr
    然后使用 pypy 来执行脚本即可使用
  • 使用 unicorn

    还可以设置 angr 的选项,使用 unicorn 引擎来做模拟执行

    p = angr.Project(xxx’)

    st = p.factory.full_init_state(add_options=angr.options.unicorn)

    #st = p.factory.entry_state(add_options=angr.options.unicorn)

注意

对于 c++ 的程序,如果调用了 c++ 的函数,使用 full_init_state

参考资料

angr api文档

官方文档

https://github.com/angr/angr-doc/tree/master/examples

https://www.secpulse.com/archives/83197.html

https://www.freebuf.com/articles/web/150296.html

https://bestwing.me/angr-study.html

http://3xp10it.cc/%E4%BA%8C%E8%BF%9B%E5%88%B6/2017/11/16/angr%E8%A7%A3%E9%A2%98

CATALOG
  1. 1. 安装
  2. 2. angr流程
  3. 3. angr解题
    1. 3.1. martricks
  4. 4. angr tips
  5. 5. 参考资料