angr的一道题
第一步,把文件下载下来进行解压缩,解出来的文件 ,文件名为re3.ppp 。
可以把它复制到linux 系统中(我这里直接用kali 的),查看得知它是一个ELF 32位可执行程序。如图1所示。
图1 查看re3.ppp的文件类型
第二步,将re3.ppp 改为可执行。然后执行一下试试。发现它真的是一个需要输入四位数字的小程序,如果输错了数字程序出现wrong的反馈,如图2所示。
图2 执行re3.ppp
第三步,将re3.ppp 用IDA (32位)打开,可查看到它的程序结构,如图3所示。
图三,re3.ppp的程序结构。
第四步,在程序结构上。点击最上面的,我们可来到main程序。如图4所示。右键点击后,可以转到此程序的入口,也就是起始,记下它的0x080484E4 这个地址。
图四,main函数
图5 text view显示地址
第五步,回到图3的程序结构,找到程序中的两个分支结构,点击拖动一番以后,主窗体中显示为如图6所示。注意到其中的两个词“correct”和“wrong” 。显然,得使程序向correct 方向 走。用同样的text view 的方法。结果如图 7所示。分别记下 它们的入口点 ,前者为0x0804868B,后者为0x0804869E,前者是我们想让程序去的,而后者是我们想避免程序去的。
图6 程序的两个分支
图7 两个分支入口点
第六步,接下去,就是符号执行的方法了,具体编写一个python代码,代码如下:
import angr
import claripy
import binascii
p=angr.Project("re3.ppp")
state=p.factory.blank_state(addr=0x080484E4)
sm=p.factory.simgr(state)
sm.explore(find=0x0804868B,avoid=0x0804869E)
print(sm.found[0].posix.dumps(0))
解释部分:
import angr
因为要使用到angr所以,预先import ,注意在使用之前,先pip install angr
import claripy
此句总是配合着angr使用。
import binascii
二进制编码转换。
p=angr.Project("re3.ppp")
从re3.ppp创建工程
state=p.factory.blank_state(addr=0x080484E4)
此为main函数的入口
sm=p.factory.simgr(state)
sm.explore(find=0x0804868B,avoid=0x0804869E)
执行时避免后者地址,发现前面地址。
print(sm.found[0].posix.dumps(0))
输出
第七步,执行以上python程序, 得到结果9563 ,如图8所示。
图8 程序执行结果
程序若改成:
import angr
import claripy
import binascii
p=angr.Project("re3.ppp")
state=p.factory.entry_state()
sm=p.factory.simulation_manager(state)
sm.explore(find=0x0804868B,avoid=0x0804869E)
print(sm.found[0].posix.dumps(0))
执行效果也一样。