针对angr提供的练习题,现在进行求解00_angr_find,它是关于输入密码的问题,需要使用angr求解出正确密码。
#1 创建项目
project = angr.Project(“00_angr_find”)
#2 通过entry_state()创建一个默认初始状态,这个状态是为了告诉angr该从哪里开始
initial_state = project.factory.entry_state()
查看当前initial_state的值,为0x8048450。
使用IDA查看地址0x8048450处于00_angr_find的什么位置。
可以看出,0x8048450对应00_angr_find的_start位置。
#3 创建模拟管理器Simulation Managers
simulation = project.factory.simgr(initial_state)
#4 开始执行直到到达希望的解决方案或者探索完所有的可能的路径
# 0x0804867D为希望得到的输出的虚拟地址
simulation.explore(find=0x0804867D)
#5 如果找到则生成simulation.found,可以打印出这个状态。
if simulation.found: #检查是否发现了解决方案
solution_state = simulation.found[0]
print(solution_state.posix.dumps(sys.stdin.fileno())) #代表该状态执行路径的所有输入
else:
raise Exception('Cannot find')
其中,simulation.found的内容如下所示。
在IDA中查看0x0804867D,如下所示。
可以看出,绿框部分0x0804867D对应call _puts,就是我们需要求解的关键路径,而红框部分0x0804866B也对应call _puts,angr却未求解。这是因为指向此基本块的红箭头表示不会执行此路径,因此直接忽略即可。
import angr
import sys
def main(argv):
path_to_binary = '00_angr_find'
project = angr.Project(path_to_binary)
initial_state = project.factory.entry_state()
simulation = project.factory.simgr(initial_state)
print_good_address = 0x0804867D
simulation.explore(find=print_good_address)
if simulation.found:
solution_state = simulation.found[0]
print(solution_state.posix.dumps(sys.stdin.fileno()))
else:
raise Exception('Cannot find')
if __name__ == '__main__':
main(sys.argv)
下面验证实验结果
执行刚刚写好的程序,保存为scaffold00.py,并将其与00_angr_find放于同一文件夹中,具体如下图所示。
再执行00_angr_find,然后需要我们输入angr刚刚求解出的密码即JXWVXRKX,结果为Good Job。
至此,求解00_angr_find已全部完成。