最后更新于
最后更新于
如果程序使用scanf
从stdin中一次获取多个值,则需要生成一个在**scanf
**之后开始的状态。
代码取自
在这种情况下,输入是用 scanf("%u %u")
获取的,给定的值是 "1 1"
,所以栈中的值 0x00000001
来自用户输入。您可以看到这些值是如何从 $ebp - 8
开始的。因此,在代码中,我们已经从 $esp
减去了 8 字节(因为在那时刻 $ebp
和 $esp
具有相同的值),然后我们推入了 BVS。
请注意,符号文件还可能包含与符号数据合并的常量数据:
有时候像逐个字符比较长度为16的两个单词这样简单的人类操作(循环),对于angr来说会花费很多资源,因为它需要指数级地生成分支,因为它会根据if语句生成1个分支:2^16
因此,更容易要求angr回到先前的一个点(在那里真正困难的部分已经完成),然后手动设置这些约束。
在某些情况下,您可以激活veritesting,它将合并类似状态,以节省无用的分支并找到解决方案:simulation = project.factory.simgr(initial_state, veritesting=True)
在这些情况下,您可以做的另一件事是hook the function giving angr something it can understand更容易。
有些模拟管理器可能比其他的更有用。在前面的示例中,存在一个问题,因为创建了许多有用的分支。在这里,veritesting技术将合并这些分支并找到解决方案。
这个模拟管理器也可以通过以下方式激活:simulation = project.factory.simgr(initial_state, veritesting=True)
你在网络安全公司工作吗?想要看到你的公司在HackTricks中被宣传吗?或者想要获取PEASS的最新版本或下载HackTricks的PDF吗?查看!
探索,我们的独家
获取
加入 或 或在Twitter上关注我 🐦.
通过向和提交PR来分享你的黑客技巧。