【angr源码分析】7. exploration_techniques
参考:Angr源码分析——Explorer 技术及ExplorationTechnique机制简单解析
Technique
个人理解:technique也是插件的一种,特用于sim_manager。已知simgr中提供了若干执行SimState的方法,包括step,run,explore等。在simgr中,也可以配置类似插件的装置(technique)。angr提供了很多techenique,比如Explorer, DFS等,调用simgr的use_technique方法就可以加载一个technique。加载这个technique后,就会对simgr中原有的step,run等方法hook,真正执行时执行的是technique里的step等方法。也就是说,technique里实现的方法,才是simgr中真正执行的方法。
在sim_manager中,使用 tech = self.use_technique(Explorer(find, avoid, find_stash, avoid_stash, cfg, num_find))
加载了Explorer插件。use_technique的定义如下:
1 | def use_technique(self, tech): |
下面分析Explorer类。Explorer类是ExplorationTechnique类的子类,依次进行分析。
ExplorationTechnique
angr\exploration_techniques\_init_.py
注释:
一个otiegnqwvk (真的不知道是什么) 是为 sim_manager提供的钩子集合,用来帮助在符号执行中实现新的的techniques。
TODO:为功能性选择实际的name(??? choose actual name for the functionality (techniques? strategies?))
子类可以重载父类的任何一个方法。通过调用simgr.use_technique(instance_of_technique)来添加一个technique。
ExplorationTechnique方法提供了若干空方法,留给子类重载。
- setup方法:在sim_manager上执行一些你需要的初始化操作。
- step方法:只是调用了sim_manager的filter方法,具体功能看子类的实现
- filter方法:
- selector方法:
- step_state方法:
- complete方法:
这里要单独提一个方法:_condition_to_lambda
def _condition_to_lambda():
我们知道,在调用simgr.explore()时,可以设置avoid和find参数。这两个参数支持使用int型的地址,也可以传入一个方法判断当前state是否加入。
注释:
将一个整形,集合,列表或者lambda转换为lambda类型,来将当前状态地址和给定的地址对照,state的地址从block中读出。
1 | def _condition_to_lambda(self, condition, default=False): |
下面就是具体的插件了。最常见的是Explorer,基本什么也没做。其他的插件如果用到再研究。
Explorer
angr\exploration_techniques\explorer.py
注释:
搜索路径,直到找到了 “num_find” 数量的满足”find”条件的路径,并且避免掉”avoid”条件的路径。找到的路径默认加入 “found_stash”,避免的路径默认加入”avoid_stash”。
“find” 和 “avoid” 参数可以是:整数地址,地址数组、列表、集合,或者一个方法。
如果cfg参数被设置了,而且”find”是整数或者列表类型,那么任何不可能到达成功状态的路径(除了经过一个失败状态???)都会被先行避免。
如果 “find” 或者 “avoid” 参数是一个返回bool类型的函数,而且一个路径触发了这两个状态,就将会被加入到find stash,除非”avoid_priority”被设置为True
def _init_():
1 | def __init__(self, find=None, avoid=None, find_stash='found', avoid_stash='avoid', cfg=None, num_find=1, avoid_priority=False): |
def filter():
在其父类ExplorationTechnique中定义filter的目的是:根据传入的filter_func,判断当前的state,返回true or false.
***这里的filter应该是和CFG结合,根据CFG额外删除掉一些没有意义的状态。