angr源码分析——BackwardSlice

本文介绍了angr库中的BackwardSlice功能,用于从目标点反向获取程序执行路径。首先,需要提供控制流图CFG和目标点targets。BackwardSlice允许用户选择是否使用控制依赖图CDG和数据依赖图DDG,这两者可以提高切片准确性但可能增加计算时间。源码分析集中在_Construct函数,特别是_Construct_Default,它根据CDG和DDG标记受影响的语句。当只有CFG时,angr通过_Construct_Control_Flow_Slice利用SimRuns进行切片。文章探讨了相关挑战,如CFG跳转恢复和依赖图的生成算法。
摘要由CSDN通过智能技术生成

BackwardSlice 程序反向切片,从给出的某一个目标点,获取所有到达该目标点的路径。angr的这个功能似乎并不完善,里面可以自己进行定制。在进行程序切片前,我们需要提供一个控制流图CFG。此外,为了确定程序反向的起始点,还需要提供一个target。下面是angr文档中给出的一个例子:

>>> import angr
# Load the project
>>> b = angr.Project("examples/fauxware/fauxware", load_options={"auto_load_libs": Fal
se})
# Generate a CFG first. In order to generate data dependence graph afterwards,
# you’ll have to keep all input states by specifying keep_stat=True. Feel free
# to provide more parameters (for example, context_sensitivity_level)for CFG
# recovery based on your needs.
>>> cfg = b.analyses.CFGAccurate(context_sensitivity_level=2, keep_state=True)
# Generate the control dependence graph
>>> cdg = b.analyses.CDG(cfg)
# Build the data dependence graph. It might take a while. Be patient!
>>> ddg = b.analyses.DDG(cfg)
# See where we wanna go... let’s go to the exit() call, which is modeled as a
# SimProcedure.
>>> target_func = cfg.kb.functions.function(name="exit")
# We need the CFGNode instance
>>> target_node = cfg.get_any_node(target_func.addr)
# Let’s get a BackwardSlice out of them!
# `targets` is a list of objects, where each one is either a CodeLocation
# object, or a tuple of CFGNode instance and a statement ID. Setting statement
# ID to -1 means the very beginning of that CFGNode. A SimProcedure does not
# have any statement, so you should always specify -1 for it.
>>> bs = b.analyses.BackwardSlice(cfg, cdg=cdg, ddg=ddg, targets=[ (target_node, -1) ]
) #
Here is our awesome program slice!
>>> print bs

先加载一个二进制文件,然后执行CFGAccurate算法,获取一个cfg;

执行CDG获取程序的控制依赖图CDG,执行DDG获取程序的数据依赖图DDG;

获取目标点targets,即,反向切片的起始点,最后生成的切片的结束点;

传入cfg, cdg,ddg以及targets,执行反向切片。

其中cdg与ddg是可选的,也就是可以不提供控制依赖图和数据依赖图。因为某些程序的数据依赖图ddg是生成不出来的。

下面我们跟以往一样,先了解BackwardSlice的API,然后探究它的算法。

classangr.analyses.backward_slice.BackwardSlice

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值