Finger
一只孤独的代码狗/程序猿/攻城狮

使用Afl-fuzz (American Fuzzy Lop) 进行Fuzzing测试

0x01 具有导向性的模糊测试

Fuzzing技术被证明是当前鉴别软件安全问题方面最强大测试技术。当前大多数远程代码执行和特权提升等比较严重的漏洞都是使用Fuzzing技术挖掘的。然而Fuzzing技术仍然存在着覆盖率低的缺陷。而许多的代码漏洞需要更大的路径覆盖率才能触发,而不是通过纯粹的随机尝试。

为了解决这一问题,已经提出了不少通过提供被测试代码更多的信息去引导和增强测试技术的方法。如简单的语义库蒸馏(corpus distillation),流分析(concolic execution),到纯粹的符号执行(symbolic execution)和静态分析等。

第一种方式(corpus distillation)能很好地工作,但严重依赖于大量的、高质量的合法输入数据的语料库(corpus)。正因为如此,代码覆盖率也只是衡量程序执行状态的一个简单化的度量,这种方式并不适合后续引导fuzzing测试的。

其余的技术(符号执行,concolic执行)一直都被认为是极有前景的。但仍然被可靠性问题和程序执行环境的复杂性所束缚。大部分高价值的程序都有非常复杂的内部状态和执行路径,在这一方面符号执行和concolic技术往往会显得不够健壮(如路径爆炸问题),所以仍然稍逊于传统的fuzzing技术。

AFL号称是当前最高级的Fuzzing测试工具之一。由lcamtuf所开发。通过对源码进行重新编译时进行插桩(简称编译时插桩)的方式自动产生测试用例来探索二进制程序内部新的执行路径。与其他基于插桩技术的fuzzers相比,afl-fuzz具有较低的性能消耗,有各种高效的fuzzing策略和tricks最小化技巧, 不需要先行复杂的配置,能无缝处理复杂的现实中的程序。当然AFL也支持直接对没有源码的二进制程序进行测试,但需要QEMU的支持。这在本文后面会做详细介绍。

0x02 安装

官网下载最新版的源码(latest version),解压后进入所在目录。执行以下命令进行编译和安装:

make
sudo make install

0x03 对测试集进行fuzzing测试

在对测试集进行编译的时候把GCC编译器替换成afl-gcc,

2227

1246

在执行的过程中会遇到一些错误,但都给出了提示,如:

echo core > /proc/sys/kernel/core_pattern

0x04 对binutils进行fuzzing测试

GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。下载之后解压,然后按一下步骤编译:

cd  ~/binutils-2.25** 
CC=afl-gcc ./configure 
make

在binutils-2.25目录下新建afl_in 用于存放初始输入文件,新建afl_out文件夹用于保存fuzzing测试结果。

cd ~/binutils-2.25 
mkdir afl_in afl_out 
cp /bin/ps afl_in/

开始对reeelf程序进行测试

cd ~/binutils-2.25
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@

6206

没错,跑了两天也没跑出个CRASH=_=

0x05 参考

这篇文章还没有人发言,快抢第一!

发表评论