angr的使用实例
本博主诈尸了!!在考研复习的间隙中再来水一篇blog。本次记录一下angr的一次使用。
0x00 介绍
1.符号执行
符号执行 (Symbolic Execution)是一种程序分析技术。其可以通过分析程序来得到让特定代码区域执行的输入。使用符号执行分析一个程序时,该程序会使用符号值作为输入,而非一般执行程序时使用的具体值。在达到目标代码时,分析器可以得到相应的路径约束,然后通过约束求解器来得到可以触发目标代码的具体值。(摘自维基百科)
2.angr简介
angr是一个二进制代码分析工具,能够自动化完成二进制文件的分析,并找出漏洞。angr是一个基于python的二进制漏洞分析框架,它将以前多种分析技术集成进来,它能够进行动态的符号执行分析(如,KLEE和Mayhem),也能够进行多种静态分析。
就我的理解来说,angr是一个非常好的符号执行爆破工具,他可以让我们在逆向分析的过程中不必关注复杂的运算,只要找到正确的程序出口和错误的程序出口后,就可以编写脚本进行自动化爆破找到正确的程序执行路径。
0x01 实验环境
主机系统:Mac OS Catalina 10.15.5
虚拟机系统:Kali Linux
0x02 实验过程
1. 安装环境
因为angr是基于Python语言编写的库,所以首先我们需要安装angr库。
在使用angr库之前我们要首先安装依赖文件,使用命令sudo apt-get install python-dev libffi-dev build-essential virtualenvwrapper
安装依赖库。然后使用pip install angr
命令即可安装angr。
2.程序分析
老师给了一个example程序。首先我们可以使用IDA Pro分析一下程序执行流程。通过IDA我们发现该程序实现的功能是用户输入字符串,当字符串与程序中正确的字符串相同时,输出正确提示,否则输出错误提示,如下:
然后通过分析中间的分支,得到正确输入时的提示信息位置,在0x080480E8处。打开指向的数据块内容,如下:
然后我们也得到了错误输入时的提示信息位置,在0x08048100处。打开指向的数据块内容,如下:
由此,我们得到了程序正确输入和错误输入时的出口地址。
3.脚本编写
然后我们开始编写angr脚本,执行符号执行暴力破解目标程序。编写脚本如下:
#!/usr/bin/python
import angr
proj = angr.Project("~/Test1/ELF-NoSoftwareBreakpoints", auto_load_libs=False) #载入待分析程序
state = proj.factory.entry_state() #保存初始状态,以便执行完错误路径后返回
simgr = proj.factory.simgr(state) #初始化运行器
simgr.explore(find = 0x080480E8, avoid=0x08048110) #find为正确出口,avoid为错误出口
print(simgr.found[0].posix.dumps(0).strip(b'\0\n')) #打印出正确执行后的程序状态值
代码注释比较全面,在这里不多做解释。
0x03 实验测试
首先,给我们的程序赋予执行权限,然后使用python执行我们之前编写的脚本,完成测试。
如下图所示,当我们运行我们编写的脚本后,输出了结果。该结果就是正确输入的内容,然后我们运行程序进行测试,输入之前得到的结果,成功执行,如下:
0x04 总结
通过这次的实验,我发现了一个新的天地。对于我这种菜鸡,尤其是逆向方面更是菜的抠脚的人来说,真的很友好。在CTF中应该更大的应用,所以在这里记录一下,以后有机会再进行更深度的学习。
不错不错,我喜欢看 www.jiwenlaw.com
看的我热血沸腾啊www.jiwenlaw.com
想想你的文章写的特别好https://www.237fa.com/
博主真是太厉害了!!!