论文学习:Directed Greybox Fuzzing(CCS‘17)

INTRODUCTION

       本文引入了定向模糊测试(DGF),专注于到达程序中给定的目标位置。在高层次上,本文将可达性视为算法中的优化问题,并采用特定的元启发式,以最大限度地缩短生成的种子和目标的距离。为了计算种子距离,本文首先计算并插桩每个基本块到目标的距离。虽然种子距离是程序间的,但本文的新措施只需要对调用图和每个程序内CFG进行一次分析。运行时,模糊器聚合每个运行到的基本块的距离值,计算种子距离作为平均值。DGF以模拟退火算法作为最小化种子距离的元启发式,并且以能量分配来实现。一个种子的能量指定模糊器花费在这个种子上的时间。

       DGF将目标位置的可达性当成优化问题,而现有的定向模糊测试方法(白盒)将其作为迭次约束满意度问题。

       DGF在有效性和效率上都优于定向符号执行,然而,这两种技术的集成比每种技术都表现更好。

TECHNOLOGY

种子输入和多个目标之间的距离测量

       为了计算各函数之间的距离,本文在函数级别的调用图和基本块级别的程序内控制流图中为每个节点分配一个值。

       函数级目标距离决定了从函数到调用图中任意目标函数的距离,函数距离则决定了调用图中任意两个函数的距离。本文将函数距离d_{f}(n, n')定义为调用图中两个函数n、n'之间最短路径上的边缘数,将函数n和目标函数d_{f}(n, T_{f})之间的函数级目标距离定义为函数n和任意可达到的目标函数之间的函数距离的谐波平均值。

       基本块级目标距离决定了基本块到调用函数的所有其他基本块的距离,以及函数级目标距离的倍数。本文将基本块的目标距离定义为调用链中到达目标位置的其他基本块的平均距离。BB距离为控制流图中两个基本块的距离。BB距离d_{b}(m_{1}, m_{2})为控制流图中两个基本块之间最短路径上的边缘数。N(m)为基本块m调用的一些函数。最后本文定义基本块级的目标距离:

         最后,本文定义了归一化的种子距离,种子到目标位置结合的距离。本文首先定义种子距离:

         模糊器将持续保持一个种子集S进行模糊测试。本文定义归一化的种子距离:

         种子距离的计算时的重度程序分析可以放到插桩时计算,以保证运行时性能开销最小。只有归一化的种子距离需要在运行时通过收集预先计算的距离值进行计算。

基于模拟退火(SA)算法的能量分配

       模拟退火算法的特征是:在随机运行的过程中,它总是接受更好的解决方案,但有时候也可能接受更差的解决方案。温度是SA的参数,它调节对更差方案的接受程度,并且按照冷却计划持续下降。在开始时,T=T0=1,SA算法接受更差方案的概率很高,当T趋近于0时,它退化为经典的梯度下降算法,并且只接受更好的解决方案。

        冷却计划:

         其中α是一个常数,通常为0.8~0.99.

基于模拟退火的能量分配       

       在自动化漏洞挖掘中,我们通常只有有限的时间。因此,本文指定一个时间tx,表示退火过程在经历了足够的探索时间后,进入开发阶段。在tx之后,模拟退火过程就可以和经典的梯度下降算法类似。本文让温度Tk<0.05时进入开发阶段。

         接下来,本文使用质数冷却计划定义基于模拟退火的能量分配(APS)。给予种子s和目标位置Tb,能量为:

 集成

       将AFL的能量分配和本文的能量分配策略集成到一起。其中pafl(s)为AFL给种子s分配的能量。目标基本块Tb,种子s的能量为:

       功率因子,即13式的后半段,控制能量的增加或减少,在两种极端情况下的功率因子的行为如下图所示:

       第一种情况为种子距离最大的情况,仅仅过了15分钟之后,能量就降为原来的15%。当种子离目标很远时,分配的能量会越来越少。通过(12)和(13)可知:

         第二种情况为归一化的种子距离最小的情况,同样可以得出结论:

 系统整体架构

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用C++实现有向图的邻接矩阵,以及可达矩阵的计算算法。 请完成Project05.cpp中DirectedGraph类的成员函数,具体要求如下: DirectedGraph类: 用来表示一个有向图。 成员变量: m_AdjMat:邻接矩阵 m_ReachabilityMat:可达矩阵 成员函数: DirectedGraph():默认构造函数,构造一个空图。 ~DirectedGraph():析构函数 DirectedGraph(string filepath):解析文件filepath,构造一个DirectedGraph对象。 filepath文件格式与项目四相同,但本项目的图为有向图。 DirectedGraph(const Graph & graph):复制构造函数 operator=(const Graph & graph):赋值运算符 ClearGraph():清空图的邻接矩阵和可达矩阵。 OutputGraph():输出图的邻接矩阵 operator*(const DirectedGraph & graph): 乘法运算符,用于实现可达矩阵运算中的矩阵逻辑乘 DirectedGraph Pow(int power):邻接矩阵的整数次幂。 用法如下: DirectedGraph a; a = a.Pow(5); 即a的5次幂,相当于a = a * a * a * a * a; 注意要考虑0次幂的情况。 该函数适合以递归实现。 DirectedGraph MatOr(DirectedGraph graph):矩阵逐元素的逻辑或运算。 例如: 1 0 0 1 与 0 1 1 0 运算后的结果为 1 1 1 1 void CalcReachabilityMat():计算可达矩阵,要求该函数基于*运算符和Pow函数实现 void OutputReachabilityMat():输出可达矩阵 IsConnected(int src, int dst):基于可达矩阵判断从节点src与dst之间是否存在通路,如存在返回真,否则返回假
05-30

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值