【AFL(十)】用 ijon+AFL 对 LAVA-M测试(LAVA下)
前言:
前两篇分别是:利用AFL对LAVA-M数据集测试 和 加入mopt编写同步启动脚本,这是最后一篇,在前面的基础上加上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
==========================================================
如果本文对您有帮助,欢迎打赏~~~