上一篇解决了如何利用AFL对LAVA-M进行fuzz的问题,接下来的中篇,主要为最后的写shell脚本做提前尝试。
本篇主要解决的问题是:实现变种AFL对LAVA的fuzz,进一步实现两个AFL双开,并写一个脚本自动打开进行fuzz展示的脚本。
一、mopt-afl对lava-m进行fuzz
为什么选中mopt-afl,因为是一篇开源的顶会论文,而且mopt-afl对afl的改进,只对afl.c文件进行了改进,所以fuzz的操作跟afl差不多,处理方便。
对lava的介绍就不多说了,详情可以看(上篇),接下来进入正题:
1. 从git下载源码,放到跟afl同级的目录下(这里的目的是为之后写脚本目录好分配做准备)
git clone https://github.com/puppet-meteor/MOpt-AFL.git
2. 进入MOpt-AFLV1.0文件夹
3. 跟afl一样进行编译安装
make make install
4. 这个时候,mopt-afl已经代替了user环境文件夹下的那个afl,所以这时候执行afl-fuzz使用的就是mopt-afl的fuzzer,但是我们依旧可以通过原来afl2.52b的文件夹下的afl-fuzz来运行,知道这一点之后就容易多了,之后我们不用在编译时在环境里生成的link,而是用afl的真正位置路径。
当然了这时候我们可以先用afl-fuzz命令测试一下编译是否成功:
afl-fuzz -i inputs/ -o outputs coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@
只要跟正常的afl显示相同即可,这里有一点变化是开头的第一行,具体mopt-afl和afl的区别看最后的截图。
二、编写两个afl同时进行的脚本
总体的设计思路是这样的,首先编写总的shell,目的是能够统一管理fuzzer,因为之后可能会有新的fuzzer加入,比如angora、vuzz之类的,现在就要计划好结构;然后可以为每一个fuzzer单独编写shell,因为我是想用gnome-terminal实现为每一个fuzzer分配一个单独的窗口,因此最好是单独有shell,这样总的shell代码可读性也好一点。
1.总的shell:
#afl gnome-terminal --geometry=80x40+70+30 -x bash -c "sh ./afl.sh;exec bash;" #mopt-afl gnome-terminal --geometry=80x40+870+30 -x bash -c "sh ./mopt-afl.sh;exec bash;"
2.afl的shell:
./afl-2.52b/afl-fuzz -i ../LAVA/lava_corpus/LAVA-M/base64/fuzzer_input/ -o ../LAVA/lava_corpus/LAVA-M/base64/outputs ../LAVA/lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@
3.mopt-afl的shell:
./MOpt-AFL/MOpt-AFL/afl-fuzz -i ../LAVA/lava_corpus/LAVA-M/base64/fuzzer_input/ -o ../LAVA/lava_corpus/LAVA-M/base64/outputs_mopt ../LAVA/lava_corpus/LAVA-M/base64/coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@
4.然后运行总的脚本即可:
bash afl_s_exc.sh
5. 我的目录结构是这样的,可以按照自己的需求自行对以上代码进行修改:
三、可能的报错
1.查看报错,发现有个问题,需要 core_pattern
2.切换root
3.按提示输入指令切换 echo core >/proc/sys/kernel/core_pattern
四、运行结果
五、参考
1. mopt-afl的git地址:https://github.com/puppet-meteor/MOpt-AFL
2. gnome-terminal:gnome-terminal用法解析_运维_Alone-CSDN博客