其实就是加上 simulation = project.factory.simgr(initial_state, veritesting=True)
Veritesting
动态符号执行(DSE)和静态符号执行(SSE)一个为路径生成公式,一个为语句生成公式。前者生成公式时会产生很高的负载,但生成的公式很容易解;后者生成公式很容易,公式也能覆盖更多的路径,但是公式更长更难解。方法上的区别在于 DSE 会摘要路径汇合点上两条分支的情况,而 SSE 为两条分支 fork 两条独立的执行路径
SSE 目前还不能对大规模的程序分析(如 Cloud9+state merging),问题主要在于循环的表示、方程复杂度、缺少具体状态、和对 syscall 等的模拟。Veritesting 可以在 SSE 和 DSE 之间切换,减少负载和公式求解难度,并解决静态方法需要摘要或其他方法才能处理的系统调用和间接跳转
简单来说就是 Veritesting 结合了静态符合执行与动态符号执行,减少了路径爆炸的影响,在 angr 里我们只要在构造模拟管理器时,启用 Veritesting 了就行
首先检测一下文件:
用 IDA 打开查看一下函数:
回忆一下 08_angr_constraints
我们很快就能发现容易产生路径爆炸的地方
在之前我们是通过增加条件约束和 Hook 函数避免路径爆炸,我们也可以尝试一下使用之前的方法,但是这题我们启用了 Veritesting 就变得简单了很多,不用过多的手动设定太多参数
话不多说,先直接上 EXP:
查看一下运行结果: