angr初探
0.0 一些碎碎念
本来是想学z3的,后来发现都要用 virtualenvwrapper ,既然都是符号执行,那就先试试angr的水吧。
本来是挺好配置环境的,但是之前那个ubuntu有问题怎么都配不上,无奈重装了一个虚拟机,捏妈,装了一晚上,加上下载中文包,啥也没干,*摆烂一天重新开始学。
不过令我高兴的是,新装的ubuntu可以支持和原系统共享剪贴板,好好好,终于可以永久告别啥指令都要建个文档用文件互相传的日子喽。
1.0 angr介绍
angr 是一个基于符号执行和模拟执行的二进制框架,可以用在很多的场景,比如逆向分析,漏洞挖掘等。
1.1符号执行
假如我们遇到一道逆向分析题,正常的流程应该是:拖入IDApro一键F5反编译然后硬刚代码写exp得到flag使得该程序输入该flag可以输出“success”等提示字样。(bushi
假如有一堆if语句,分别是if(a>b),if(b>c)……(等等,这不是差分约束么)
于是如果我有一个东西,可以自动分析这些语句的逻辑构造一个输入可以让程序跑到指定的一条语句,比如printf("Oooooooops");那么是不是就可以自动获取flag了?
2.0 virtualenvwrapper
首先是环境配置。virtualenvwrapper是一个虚拟的python环境,假如你再安装angr前安装了z3,那么二者会发生一些冲突,因此需要把二者的环境隔离开,创建一个新的虚拟环境。
2.1 安装virtualenvwrapper
第一步:
sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper
正常都是没有问题的,如果这一步有问题建议直接remake,就像某彩笔一样。
然后配置环境变量:
先把“显示隐藏文件选项”勾选上,然后直接搜索.bashrc文件,打开后,在末尾加上
export WORKON_HOME=$HOME/Python-workhome
source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
保存后 source ~/.bashrc
然后 mkvirtualenv --python=$(which python3) angr && pip install angr
安装即可,SG大爹说但其实好像也没多长时间(捂脸)
2.2 virtualenvwrapper的操作命令
workon: 列出已有环境(我们只创建了叫angr的环境)
workon angr: 切换到环境angr
deactivate: 退出环境
rmvirtualenv: 删除环境 (这个就不试了)
3.0 使用初探
例题来自, https://github.com/jakespringer/angr_ctf 感谢SG大爹提供
3.1 00_angr_find
一个比较简单的程序,用angr尝试解一下。
3.2 找出口
我们发现只要程序运行到puts("Good Job")
这一行那么我们就得到了flag,找到该语句地址:
3.3 写python脚本
首先是最简单的explore函数,因为该程序计算量不大,即使自己分析也是可行的,此题仅作为练手。
import angr
import sys
path = '/home/ep/桌面/00_angr_find' # 被执行文件的路径
project = angr.Project(path) # 以被执行文件创建angr项目
init_state = project.factory.entry_state() # entry_state()可以创建一个默认的初始状态,告诉angr该从哪开始
simulation = project.factory.simgr(init_state) # 以该初始状态创建一个模拟管理器,这个管理器还有很多工具可以帮助搜索和执行二进制文件
aim_addr = 0x804867D # 希望程序运行到的地址,也就是上图的地址
simulation.explore(find = aim_addr) # 开始执行,直到达到上述地址或者探索完所有可能的路径,simulation.explore()会建立一个名为simulation.found的状态列表
# 该状态列表用来表示是否找到了期望的输出,若找到则为true,反之为false
if simulation.found: # 检查是否得到了解决方案
solution_state = simulation.found[0]
print(solution_state.posix.dumps(sys.stdin.fileno())) # 输出angr执行到该状态时的输入,也就是我们需要的flag
else: # 没有得到解决方案
print('Failed.')
进入angr环境后,运行得到flag。