AFL-Fuzz 模糊测试工具学习
AFL初探
afl-fuzz全称American Fuzzy Loop,是一款特别强大的Fuzzing工具。Fuzzing是指模糊测试,Fuzzing起源很早,其思想是通过自动化产生大量的无目的输入来对目标系统进行测试。afl也是根据这一基本原理,再结合几位大佬的巧妙的构思而产生。其具体的原理、fork策略、变异策略有空的时候更新
安装AFL以及相关工具
AFL安装
可以git下载,也可以官网下载,这里选择Linux下,git安装
$ git clone https://github.com/mirrorer/afl
之后在afl文件夹中执行
$ make
$ make install //如果安装报权限的错,那么就 $ sudo make install
可以输入afl-fuzz -h查看是否安装成功,安装成功则会出现afl-fuzz的–help界面。
llvm+clang安装
afl-fuzz需要在编译时进行插桩,然后再进行下一步的Fuzzing。afl-fuzz的编译器有afl-gcc、afl-g++、afl-clang、afl-clang++,其实质就是gcc、g++、clang以及clang++的wrapper,实质调用的依旧是gcc和clang,一般来说gcc在大部分Linux系统都有安装,高版本的ubuntu和centOS好像也编译好了llvm和clang,可以按照下面分别验证系统是否安装gcc和llvm+clang(llvm和clang是一套的)。
$ gcc --version
$ clang --version
下面针对电脑未安装llvm+clang。对于简单的学习afl和fuzzing,并不需要自己编译llvm,在llvm的官网下载需要版本的pre-built版,然后进行环境配置就够了。但如果是对一些论文的工具,特别是魔改过afl-clang的工具、源码,最好是下载源码中所用版本的llvm源码,然后本地进行编译。
下载到本地之后进行环境配置,在打开的文件最后加上环境变量,最后使环境变量生效。
$ gedit ~/.bashrc
export LLVM_HOME=/你的下载的llvm路径/bin
export PATH=$LLVM_HOME:$PATH
source ~/.bashrc
再进入afl的文件夹,找到llvm_mode文件夹进入,运行make。afl-clang就可以运行了。
开始第一次AFL-Fuzz
就和学一门语言都要先输入"Hello World"一样,我们也用一个简单的例子开始Fuzzing。
新建一个文件夹,目录下建立test.c文件,并在该文件夹下新建两个文件夹分别为in 和out 。在in文件夹中建立testcase文本文件,随意输入一点文本,作为起始种子。
echo "asdsas" >> testcase
test.c文件内容如下。
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<string.h>
int main(int argv,char *argv[]){
char c[100] = {0};
gets(c); //gets函数存在栈溢出漏洞
int l = strlen(c);
if(c[0] == 'a'&&l == 20){ //首字母为a,长度为20的输入会导致异常退出
raise(SIGSEGV);
}else if(c[0] == 'A'&&c[1] == 'B'&&l == 12){
//前两个字母为AB,长度为12的输入会导致异常退出
raise(SIGSEGV);
}
else return 0;
}
将上面的代码使用afl插桩
$ afl-gcc -g test.c -o test
test文件就是插桩好的测试文件。下面使用afl-fuzz工具,运行界面最好全屏显示。
$ afl-fuzz -i in -o out ./test
······先写这么多