05月30, 2019

How to use AFL fuzzing?

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

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

#2. 流分析(concolic execution) 路径爆炸问题

#3. 符号执行(symbolic execution)

--- 安装 ---

从官网http://lcamtuf.coredump.cx/afl/ 下载最新版的源码(latest version)

make
sudo make install
--- 例如,对binutils进行fuzzing ---

(GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件)

// 在对测试集进行编译的时候把GCC编译器替换成afl-gcc
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/
--- 测试 ---
cd ~/binutils-2.25 
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@ 
// 在执行过程中,afl-fuzz会把@@替代测试样本,即之前拷贝到afl_in目录下的ps程序,所以最后实际执行的命令为 readelf -a ps

alt

--- 例如,对ImageMagic进行fuzzing ---
../afl-2.49b/afl-fuzz –i ../afl-testcases/jpeg/full/images –o ./fuzzoutput ./utilities/magick @@ 3.png

/afl-testcases/jpeg/full/images为afl官网提供的测试集,里面有大量的各种格式的且经过修剪处理的测试用例(jpeg格式文件就有8千多个)

./utilities/magic是被测试程序,@@代表测试输入样本,即../afl-testcases/jpeg/full/images目录下的.jpeg文件,在实际执行时@@会被替换成实际的测试样本,3.png是随便命名的文件,主要是实现把.jpeg文件转换成.png文件的功能. 在运行十几个小时之后,出现了16个崩溃,然后就显示系统错误

alt

alt

--- AFLFast ---

使用AFLFast,它实现了一些模糊测试策略,不仅针对高频代码路径,也针对低频代码路径,“在相同的时间内,更加强调程序的行为”。简而言之,通过研究我们发现,对于某种模糊测试对比,跟vanilla AFL相比,这种优化方法大约提高了2倍的速度和更好的代码覆盖率。

要使用AFL,我们必须要用AFL的编译器包装器来编译库的源代码。

$ ./configure CC=afl-clang-fast \
CFLAGS ="-O2 -D_FORTIFY_SOURCE=0 -fsanitize=address" \
LDFLAGS="-O2 -D_FORTIFY_SOURCE=0 -fsanitize=address"
$ make; sudo make install

ASAN编译工具是用来识别内存相关的报错的

ASAN为已测试过程序的执行速度添加了2倍的减速,但是效果却更好,让我们可以检测到与内存相关的问题,如:

· UAF漏洞(悬空指针取消引用)

· 堆缓冲区溢出

· 栈缓冲区溢出

· 全局缓冲区溢出

· Use After Return(返回后使用)

· Use After Scope(范围后使用)

· 初始化命令错误

· 内存泄露

此外,为了优化模糊测试过程,我们使用下面这些参数编译了源代码:

-D_FORTIFY_SOURCE=0 因为ASAN不支持源代码强化,所以我们禁用它来避免错误警告

-O2 使用-O参数,开启所有的优化标志;对于LLVM3.6而言,默认设置是-O1

本文链接:https://harry.ren/post/afl-fuzzing.html

-- EOF --

Comments