angr_veritesting
前面两节我们分别学习了应对路径爆炸的两种方法——手动约束和hook,这一节我们来学习有效缓解路径爆炸的第三种方法——Veritesting。
Veritesting意为路径归并,出自2014年的一篇论文Enhancing Symbolic Execution with Veritesting,读者对归并的原理感兴趣的话可以阅读一下。
12_angr_veritesting¶
angr中实现了上述论文中提到的Veritesting技术,我们只需要在构建simgr的时候添加一个veritesting=True
参数即可,代码如下:
simgr = proj.factory.simgr(state, veritesting=True)
然后我们再来测试一下这一段会导致路径爆炸的代码:
import angr
proj = angr.Project('../dist/12_angr_veritesting')
state = proj.factory.entry_state()
simgr = proj.factory.simgr(state, veritesting=True)
simgr.explore(
find=lambda state : b'Good Job.' in state.posix.dumps(1),
avoid=lambda state: b'Try again.' in state.posix.dumps(1)
)
print(simgr.found[0].posix.dumps(0))
跑出来还是要一段时间,但起码不会卡死了。输出:
b'OQSUWYACEGIKMOQSUWYACEGIKMOQSUWY'
这种写法与上面的写法是等价的:
simgr = proj.factory.simgr(state)
simgr.use_technique(angr.exploration_techniques.Veritesting())
另外根据官方的说法:
Note that it frequenly doesn't play nice with other techniques due to the invasive way it implements static symbolic execution.
Versitesting通常与其他exploration techniques不兼容。