【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 @@
看到如下界面即成功: