• VUzzer: Application-aware Evolutionary Fuzzing


    题目:VUzzer: Application-aware Evolutionary Fuzzing

    作者:Sanjay Rawat, Vivek Jain, Ashish Kumar, Lucian Cojocar, Cristiano Giuffrida, Herbert Bos

    出版:NDSS 2017

    背景

    模糊测试随机变异,不了解被测程序,进行盲目的变异。生成的输入往往在不符合程序输入的规则,导致陷在程序的浅层位置。而根据基于覆盖的fuzzing策略,触发浅层err handler代码也触发了新的覆盖,导致大量资源浪费在格式无效种子的变异上,给有效种子和执行深层代码种子的时间就少了。

    白盒测试,比如符号执行,通过约束求解生成覆盖程序中路径的测试用例。白盒技术的加入,使得fuzzer更加有效。比如driller,在fuzzing遇到瓶颈的时候,会进行符号执行,交替两种技术。

    但是fuzzer,比如afl,是可以分析大规模程序的。但是符号执行技术因为路径爆炸和约束求解问题,难以扩展到大规模程序。所以符号执行的加入破坏了fuzzer的scalable属性。

    问题

    在不使用符号执行的情况下,设计更加有效的fuzzer:在更少的种子生成情况下,有效发现crash。

    方案

    通过污点分析识别err handler code的方式,减少对格式无效种子的变异。在更少变异的前提下,发现更深层次的crash。

    设计

    静态分析

    使用IDA反编译被测二进制程序,

    1-得到程序的函数的控制流图,通过基于马尔科夫模型的基本块权重计算方法,计算得到基本块权重文件。

    2-得到程序中的函数名文件。

    动态分析:

    动态二进制插桩,使用pin工具。对程序输入种子的每个字节进行污点追踪。

    1- 插桩程序中的cmp和lea指令。

    cmp指令经常作为程序路径的分支条件,代表了程序中可能存在的magic byte,这是随机变异的fuzzer的一个挑战。

    lea指令的操作数是int类型,lea的操作数对应的种子偏移位置的字节就可以在int范围内进行变异,降低变异的随机性。

    2-确定error handler代码

    首先,使用有效测试用例集合(test suit)喂给插桩后的被测程序,这些测试用例所执行的基本块我们叫做valid BB set.

    然后,使用随机生成的种子集合,喂给插装后的被测程序,这些执行路径中的公共基本块BB,且如果BB不在valid BB set中,那么我们将这些BB 放在invalid BB set中。(依据:随机生成的种子很可能是无效的,会被err handler代码处理)

    3-能量调度:

    通过计算种子能量,给种子赋予不同的变异机会。

    计算:对于一个种子的执行路径P,路径中每个基本块的权重在静态分析阶段已经给出。如果基本块是valid BB set中的,那么我们说该基本块权重为正,否则权重为负。这样,对所有基本块权重进行相加,得到该种子的能量。

    对于种子能量高的种子,它应该是符合程序输入格式的,并且更有可能到达程序深层位置。所以给这些种子更多的变异机会。

  • 相关阅读:
    BZOJ3193: [JLOI2013]地形生成
    ARG102E:Stop. Otherwise...
    51NOD1847:奇怪的数学题
    大型大常数多项式模板(已卡常...)
    CF932G Palindrome Partition
    51nod1538:一道难题(常系数线性递推/Cayley-Hamilton定理)
    HTML——meta标签
    HTTP 格式
    Node.js——Async
    设计模式——外观模式
  • 原文地址:https://www.cnblogs.com/linkJ/p/11446467.html
Copyright © 2020-2023  润新知