【AFL(八)】用 AFL 对 LAVA-M 进行 Fuzz(LAVA上)


在前面的文章中,我们已经对AFL及其相关的工具进行了简单的认识,在第一篇中也写了个小例子,进行了简单的fuzz测试,现在我们可以用LAVA-M数据集进行真实的测试。

LAVA-M介绍

LAVA来自于论文《LAVA: Large-scale Automated Vulnerability Addition》发表在了2016年的S&P上,是由Brendan Dolan-Gavitt等人提出的用于在程序中插入bug的技术方法。通过LAVA在uniq、who、md5sum、base64四个程序上进行bug插入而形成的测试集即为LAVA-M。LAVA-M被广泛应用于fuzz领域的工具效果评估,我们所熟知的Angora、RedQueen、T-Fuzz、VUzzer等工具都使用了LAVA-M进行测试评估。从这篇文章开始,通过三篇的篇幅讲述如何实现一个可以通用的基于LAVA的数据模型系统。


实现利用afl对lava的fuzz


下载 && 前期准备

从http://panda.moyix.net/~moyix/lava_corpus.tar.xz下载我们需要的数据集,我是用的Ubuntu环境进行的测试。可能会因为没有安装libacll库,遇到编译不通过的情况,所以保险起见,也安装一下这个库。

wget http://panda.moyix.net/~moyix/lava_corpus.tar.xz
sudo apt-get install libacl1-dev

结构

现在基本上都准备好了,来看一下这个数据集的三层文件夹结构:

 我们这次要用的是LAVA-M文件夹下面的数据,其中包含四类base64、md5sum、uniq、who,本篇文章以base64为例进行介绍。进入LAVA-M下的base64文件夹,可以看到四个文件夹和一些文件,其中:

validated_bugs 里列出了在 base64 中插入的crash编号;

inputs里有能触发crash的输入,每一个输入的编号对应于一个crash的编号;

fuzzer_input里有用于给fuzzer作为种子的输入;

coreutils-8.24-lava-safe文件夹里存放了源代码及编译设置等;

validate.sh为安装脚本;

插桩编译base64

如果还没有安装afl,参考我的这篇文章,然后我们来进行插桩编译,进入LAVA-M下的base64文件夹。如果不进行插桩编译,可以直接运行脚本 validate.sh安装,但是我们要想用afl就要改一下配置(这一步之后可以跟angora、mopt等类似对比,这里先提一手,之后会用到)

先设置环境:

export CC=afl-gcc
export CXX=afl-g++

可以用env命令进行查看环境设置是否成功。

然后运行脚本即可安装:

 ./validate.sh 

显示输出插入bug数量为44/44时,即安装成功

对base64进行fuzz

找到如图的位置,里面的base64即我们的测试目标程序,我们回到base64的根目录位置,运行fuzz命令:【有误】

afl-fuzz -i inputs/ -o outputs coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@

经指正,这里的输入文件夹有误,正确的命令应该是:

afl-fuzz -m none -t 5000 -i inputs/ -o outputs coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@

看到如下界面即成功: