Angr模板系列——1. hook and solve
处于以下两个原因,我决定写本系列文章
- 利用符号执行可以提升逆向算法的效率,对于简单算法,可以快速求解。
用算力来弥补逆向经验的不足。 - reverse已经进入用angr自动化解题的时代,新手上路没模板就凉凉。
如果你是新手,建议看看angr-doc文档。
约束求解的一般步骤
- 创建project,比如:
proj=angr.Project('./g',load_options={'auto_load_libs':False})
- 设置初始state,比如:
state=proj.factory.blank_state(addr = addr_main)
- 设置位向量变量,比如:
bv_key=state.solver.BVS('key',8 * len_key)
- 载入位向量到内存,比如:
state.memory.store(addr_key,bv_key)
- 设置Simulation Managers,比如:
simgr = proj.factory.simulation_manager(state)
- 运行,比如:
simgr.explore(find=win,avoid=suck)
- 获取执行结果,比如:
find=simgr.found[0]
- 约束求解,比如:
key = find.solver.eval(bv_key,cast_to=str).strip('\0')
通过scanf/read/fread输入flag
如果求解对象是通过scanf获得,则必须要进行hook。
自己写的一个例子:
https://github.com/Vector1iu/how2angr/tree/master/one_input
proj.hook(addr_scanf,scanf_hook,length=5)
这里的length是指令长度,比如指令call ___isoc99_scanf
的长度就为5。
示例代码
通过main函数参数读入flag
angr-doc给出的例子
https://github.com/angr/angr-doc/blob/master/examples/ais3_crackme/solve.py
参考文献
http://ysc21.github.io/blog/2016-01-27-angr-script.html
https://github.com/angr/angr-doc/blob/master/examples/asisctffinals2015_fake/solve.py