【AFL(十)】用 ijon+AFL 对 LAVA-M测试(LAVA下)


前言:

前两篇分别是:利用 和 ,这是最后一篇,在前面的基础上加上ijon-AFL 的测试(Angora、QSYM、需要单独再开一个虚拟机测试,环境冲突,计划暂且搁置),并优化一键启动脚本。

为什么挑选这五个,不仅仅是因为开源的原因,还因为这五个优化方向各有不同:

AFL:谷歌开发的模糊测试产品,属于开创现在这几年模糊测试的先河,可以看到超级多的fuzzer就是在AFL的基础上进行的改进,所以一定要有这个作为标杆;

MOpt-AFL:这是19年的一篇顶会的文章,要加这个有三点:一是开源、二是改进代码清晰易读、三是论文的那个浙大实验室来这里进行过讲座,是因为那位老师的讲座和之后的交流我才对fuzz模糊测试感兴趣,找到自己之后的研究方向;

Angora:是18年的SP的文章,选这个的原因有两点:一是开源、二是改进成熟,最近貌似是要从学术进入到工业中,足以可见这个项目的潜力其实不小;(因为环境问题需要单独另起一个虚拟机处理,留做下一个笔记);

QSYM:18年USENIX的顶会文章,关于混合模糊测试的工具,原因有二:一是开源、二是混合模糊测试即使渐渐开始脱离 覆盖率反馈导向型模糊测试 的队列,自成一体,成为一个新的研究分支(单独另起一个虚拟机,留作下一个笔记);

ijon+AFL:20年的SP文章,选这个原因有三:一是开源、二是展现形式新颖,把路径跟游戏相结合,做展示、三是iJon不是一个集成的fuzz工具,更像是抽象出来的插件,可以用它加到其他fuzz上,这里用的是它加上afl,所以是ijon+AFL,其实也可以跟着作者readme做一个ijon+Mopt-AFL;

iJon-AFL

1. 下载 iJon 和 iJon-data 数据集

git clone https://github.com/RUB-SysSec/ijon.git
git clone https://github.com/RUB-SysSec/ijon-data.git

分别是 ijon+afl 的源码 和 论文中用到的测试数据集:maze、super Mario Bros、tpm_fuzzing

2. 安装 llvm 和 clang

如果已经安装好可以跳过这一步,直接查看版本:

如果没有安装:

(因为 llvm 是一个大框架,包含了clang,所以先安装clang,再安装 llvm)

sudo apt-get install clang
sudo apt-get install llvm

安装完回到最开始那里查看版本。

3. 安装 AFL

make
sudo make install (-j4 如果支持多核可以用-j参数,能加快速度)

4. 安装 llvm 模式下的afl

cd llvm_mode
LLVM_CONFIG=llvm-config-3.8 CC=clang-3.8 make

这里版本跟第二步查到的一致就行

5. 对maze进行测试

我对maze进行了一些魔改,可以从github先下下来

git clone https://github.com/WayneDevMaze/mod-ijon-maze.git

文件说明:

地图源文件:

big.c 大地图(13 * 17 大地图模式)

small.c 小地图(7 * 11 符号执行的路径经常用这个地图来测试)

tiny.c 新加的地图(4 * 6 超级小地图)

地图结果展示源文件:

maze_show.c 当fuzz跑完跑出结果的时候调用这个文件对应的程序,对路径结果进行展示

脚本:

build.sh 编译脚本,对三类地图进行编译,并对地图展示程序进行编译.

run_afl.sh 运行 afl,第一个参数格式 maze.tiny.bt (tiny对应三种地图模式,bt是对应两类,还有一种是nobt,意味着是否可以回退,如果可以回退,对 fuzz 来说路径难度会加倍)

运行测试:

bash build.sh
bash run_afl.sh maze.tiny.bt

6. 查看运行结果

如果出现fuzz界面,并且很快出现结果,然后有路径重现,说明成功

7. 对LAVA-M数据集进行插桩编译

设置C、C++环境

export CC=afl-clang-fast
export CXX=afl-clang-fast++

检查环境可以用 echo

运行编译脚本

./validate.sh 

8. 利用 iJon+afl 对 base64 进行测试

AFL_BENCH_UNTIL_CRASH=1 afl-fuzz -m none -i fuzzer_input -o outputs -- coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@

到这里对base64的 iJon+afl 测试就完成了,剩下的就是等着跑结果了。

一键启动 bash 优化

现在在前两篇的基础上要实现的是一个可以挑选一定的参数,然后选择性的启动需要的fuzzer,其实这里挺简单的,就是加一个case分支选项。

但是之后的想法是,能不能让各个fuzzer之间数据共享,也就是之间的outputs能够互相运用,这个可能需要后面完成 angora 和 qsym 再实现了。

参考

1. Angora 官方 git - lava教程:https://github.com/AngoraFuzzer/Angora/blob/master/docs/lava.md