Angr模板系列——1. hook and solve

2018-04-19  本文已影响0人  413x

Angr模板系列——1. hook and solve

处于以下两个原因,我决定写本系列文章

如果你是新手,建议看看angr-doc文档。

约束求解的一般步骤

  1. 创建project,比如:proj=angr.Project('./g',load_options={'auto_load_libs':False})
  2. 设置初始state,比如: state=proj.factory.blank_state(addr = addr_main)
  3. 设置位向量变量,比如:bv_key=state.solver.BVS('key',8 * len_key)
  4. 载入位向量到内存,比如:state.memory.store(addr_key,bv_key)
  5. 设置Simulation Managers,比如:simgr = proj.factory.simulation_manager(state)
  6. 运行,比如:simgr.explore(find=win,avoid=suck)
  7. 获取执行结果,比如: find=simgr.found[0]
  8. 约束求解,比如: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

上一篇下一篇

猜你喜欢

热点阅读