eeeeeeeeeeeeeeeea

愿我们永远热泪盈眶!

0%

fuzzing-二

fuzzing(二)

这一篇我们介绍一下afl-fuzz编译后的各种c文件的作用。首先要明确几个专业性质的词语及释义

一:专业性词语介绍

使用AFL进行模糊测试的对象一定是具备接收输入的程序,也正是这样的程序有更大可能出现漏洞。

1.语料

AFL需要一些初始输入数据(也叫种子文件)作为Fuzzing的起点

2.语料库蒸馏(Corpus Distillation)

网上找到的一些大型语料库大部分都包含大量的文件,我们需要对其进行精简,称为语料库蒸馏,afl提供了两个工具,叫afl-cmin和afl-tmin

2.1 afl-cmin

尝试找到与语料库全集具有相同覆盖范围的最小子集。用比较通俗的话来说就是去掉重复的文件,使用方法如下:

1
afl-cmin -i input_dir -o output_dir -- /path/to/tested/program [params] @@

2.2 afl-tmin

减小单个文件的大小,分为两个模式,instrumented modecrash mode,默认方式是instrumented mode。crash mode会把将程序异常退出的文件直接删除掉来缩减语料库

1
afl-tmin -i input_file -o output_file -- /path/to/tested/program [params] @@ 
1
afl-tmin -x -i input_file -o output_file -- /path/to/tested/program [params] @@

二:fuzzing前准备过程(模式选择+编译)

1.fuzz模式介绍

可以使用afl-gcc/g++模式,也可以使用llvm模式

之所以会出现llvm模式,是因为传统的afl-gcc/g++插桩在模式在效率和性能上不能完美的实现复杂程序的fuzz了,所以afl-clang-fast/fast++就出现了。

1
./configure --disable-shared CC="afl-clang-fast" CXX="afl-clang-fast++"

2.判断要fuzz程序的构建

如果程序不是autoconf构建的话,直接修改makefile文件中编译器为afl-gcc/g++

1
./configure CC="afl-gcc" CXX="afl-g++" 

autoconf是GNU下使用的工具之一。GNU构建系统主要是指通过autoconfautomakelibtool这三个工具构建出来的软件结构体系

详情参考维基百科https://zh.wikipedia.org/wiki/GNU%E6%9E%84%E5%BB%BA%E7%B3%BB%E7%BB%9F

3.fuzz共享库时

在fuzz共享库时,我们需要将库链接给一个demo(可以是自己写的,也可以是自带的),写demo的目的是将输入传递给要fuzzing的库,因为库没有输入点,可以用ldd命令查看共享库是否被链接

1
./configure --disable-shared CC="afl-gcc" CXX="afl-g++"

4.编译

用afl-gcc/g++或者afl-clang-fast/fast++编译

三:fuzzing开始

1.白盒测试

所谓白盒就是对有源码的程序来进行fuzzing

1
afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@ 

2.黑盒测试

黑盒测试就是对没有源码的程序进行fuzzing,这就要用到afl里的qemu模式。

qemu模式也需要编译做一些准备工作,这里不在介绍。网上已有很多文章了。

只需加一个-Q参数即可使用qemu模式

1
afl-fuzz -Q -i testcase_dir -o findings_dir /path/to/program @@ 

四:并行fuzz

顾名思义就是同时运行多个fuzz实例,这是根据cpu的核心数来确定的,查看核心数

1
cat /proc/cpuinfo | grep "cpu cores" | uniq

并行fuzz分为主fuzzer(master fuzzer)和从fuzzer(slave fuzzer),主fuzzer用参数-M,从fuzzer用参数-S

1
2
3
4
screen afl-fuzz -i testcases/ -o sync_dir/ -M fuzzer1 -- ./program
screen afl-fuzz -i testcases/ -o sync_dir/ -S fuzzer2 -- ./program
screen afl-fuzz -i testcases/ -o sync_dir/ -S fuzzer3 -- ./program
...

-S,-M后面是被fuzz程序的别名,-o后的输出是同一个目录,可以在找到新的路径时相互协作,相互传递新的测试用例。放一张老图

有一个小tips,若是想将fuzz放在后台跑的话,可以用screen命令

1
2
3
4
5
screen -S fuzzer1
在新建出来的终端里输入fuzz
然后输入ctrl a+d
这样,fuzz就在后台运行了,可以用screen -ls查看
用screen -r fuzzer1恢复