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中应该更大的应用,所以在这里记录一下,以后有机会再进行更深度的学习。

END
本文作者:
文章标题:angr的使用实例
本文地址:http://hackerhome.top/index.php/archives/11/
版权说明:若无注明,本文皆由"岁月年华的秘密基地"原创,转载请保留文章出处。
最后修改:2021 年 02 月 15 日 05 : 50 PM
如果觉得我的文章对你有用,请随意赞赏