【AFL(九)】详细解释 AFL类fuzzer 对目标进行 Fuzz (LAVA中)


上一篇解决了如何利用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博客