Factory SimManger State
Last updated on May 29, 2023 am
一般使用angr时,都会以以下几句开头
1 |
|
现在就来看看factory
都究竟是个啥
首先factory是一个类,但是它更像是一个工具类,帮助我们完成一些事情,我们就可以简单调用里面的方法。比如我们想要初始化一个入口函数的state
,那么我们就可以调用factory
里面的entry_state()
,就不用自己再去关心那细节。
现在就来看看里面还有哪些方法
State
blank_state(self, **kwargs)
调用此方法,会返回一个几乎没有初始化的state对象
1 |
|
entry_state(self, **kwargs)
调用此方法,返回一个起始地址的state
full_init_state(self, **kwargs)
Very much like :meth:
entry_state()
, except that instead of starting execution at the program entry point, execution begins at a special SimProcedure that plays the role of the dynamic loader, calling each of the initializer functions that should be called before execution reaches the entry point. It can take any of the arguments that can be provided toentry_state
, except foraddr
.
意思是,这个方法拥有以上的所有参数除了addr,因为这个方法是先于符号执行的,它的作用是初始化,调用哪些所有的初始化函数
call_state(self, addr, *args, **kwargs)
很显然是一个创建call到某个函数的state,它的参数
Returns a state object initialized to the start of a given function, as if it were called with given parameters.
:param addr: The address the state should start at instead of the entry point.
:param args: Any additional positional arguments will be used as arguments to the function call.
返回一个以给定函数起初地址的state
,换句话说提供addr
,它将以此创建一个state
,而不再是entry point。它也可以通过args
来传递所call的函数参数
Simulation Manager
simgr simulation_manager( self, thing: Optional[Union[List[SimState], SimState]] = None,**kwargs)
Constructs a new simulation manager.
:param thing: What to put in the new SimulationManager’s active stash (either a SimState or a list of SimStates).
:param kwargs: Any additional keyword arguments will be passed to the SimulationManager constructor
:returns: The new SimulationManager
:rtype: angr.sim_manager.SimulationManager
这个方法也很常用,但是它不再是创建和返回state对象,而是利用state对象创建一个simulation manager对象并返回。它的参数就是接受一个state列表或者单独一个state,并把他们放进stash的active里面。如果什么参数也不传,那么它就默认以entry_point为state创建。
那么这个simulation manager
对象是个啥呢?
SimulationManager
angr在[文档](angr.sim_manager - angr documentation)里面这样评论The Simulation Manager is the future future.
SimulationManager 也是angr里面的一个类。这个类的功能就是帮助我们根据state的stash来管理state,可以往下step,可以过滤filter,也可以融合merge。可以通过属性值来直接获取stash,比如.active
,也可以用一些前缀比如mp_
,那么就可以mp_active
,同理one_
.
这是它的一些成员
:param project: A Project instance.
:type project: angr.project.Project
:param stashes: 一个字典用于存储stash
:param active_states: Active states to seed the “active” stash with.
:param hierarchy: 一个StateHierarchy对象,用于追踪state之间关系
:param resilience: 收集error的集合
:param save_unsat: 如果为True,则保留unsat的state,而不是直接丢掉
:param auto_drop: 存放直接丢弃的stash的名字
:param completion_mode: 描述exploretion techniques的函数
:param techniques: 需要预先设定exploretion tech的列表
……
当然里面也有很多的方法,最重要的是step
,explore
,use_technique
三个方法
看看它的构造函数,通过初始化函数就能这些成员有一个更直观的了解
__init__
1 |
|
step
看看它的参数即可
1 |
|
stash : 需要step的stash名字,默认是active
target_stash : 将结果放入哪个stash
n : 如果
until
是NULL的话,那么会一直执行n步selector_fun : 接收一个以state为参数、返回类型为布尔的函数,如果返回为True,那么执行该 state,否则保持原样
step_fun : 接收一个以SimulationManager为参数并返回SimulantionManager的函数,每一次调用
step()
时,都会调用该函数,但该函数里面不应该有step(
)error_list : 一个list来存储
ErroredState
successor_fun : 接收一个以state为参数并返回它后继的函数
until: 接收一个以SimulationManger为参数并返回布尔值的函数,一直执行到返回为True
filter_func : 接收一个以state为参数并返回该state要移去哪个stash名字的函数
现在的angr中n
和until
已经移植到run()
中,用法相同
use_technique
1 |
|
总结
State是一个模拟状态,里面包含很多值,各种寄存器,内存以及几乎所有可以变得值,它是大多数函数的参数。
我们想要得到一个state,可以调用factory里的关于state的方法。还可以使用得到的state的对象以及factory.simgr方法得到一个SimManger对象。factory相当于一个工具箱,封装angr内部许多常用方法,方便我们调用,就不需要自己手动操作了。
当我们拥有一个state的时候,就可以把它丢给SimManger了,我们可以到一个SimManger的对象,这一步相当于把这个state拉伸进内存,得到更多有效信息,就可以开始正式执行了,而且我们还可以设定各种执行方式,是只走一步还是一直走到尽头?中间状态要怎么处理?以什么方式走?等等