如何使用 AFL++
本章节主要内容为简单介绍如何使用 AFL++ 来 fuzz 开源软件,大部分内容来自于 Build and install AFL++ 以及 Fuzzing libxml2 with AFL++
本章节仅介绍手动编译安装的步骤,图快的话直接用 docker 镜像,环境都配好了,开箱即用。
编译 AFL++
首先从 github 上直接拉取源码最新版本,本人电脑是 Windows,使用的是 WSL 的环境。
git clone https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
AFL++ 有很多编译选项,最简单的方式就是直接编译所有选项。但这里我们使用 AFL++ 推荐的 llvm 模式,需要先安装 llvm。
sudo apt-get install llvm clang
然后编译 AFL++ 的源码模式
make source-only
编译成功后,如果想要使用方便的话可以直接 sudo 安装。也可以不安装,每次用绝对路径使用就行了
sudo make install
编译源码
以 libxml2
库为例,fuzz 前需要先对源码进行编译插桩。首先
git clone https://gitlab.gnome.org/GNOME/libxml2.git
cd libxml2
如果是新环境,需要安装一些必要的库
sudo apt-get install autoconf pkgconf automake libtool m4 python3 python3-dev
用 configure 配置编译环境等,这里关闭动态库的编译,是因为插桩需要插桩到静态库中静态链接才能正常运行
./autogen.sh
./configure --enable-shared=no
配置环境变量,这里设置同时插桩ASAN
export AFL_USE_ASAN=1
使用 AFL++ 的 clang wapper 来编译
make CC=~/AFLplusplus/afl-clang-fast CXX=~/AFLplusplus/afl-clang-fast++ LD=~/AFLplusplus/afl-clang-fast
编译好 libxml2 以后,使用其中一个程序 xmllint
来进行fuzz
$ mkdir fuzz
$ cp xmllint fuzz/
$ mkdir fuzz/in
$ cp test/*.xml fuzz/in/
$ cd fuzz
开始 fuzz
在 fuzz 前还需要配置一些系统设置,这里 AFL++ 弄成了脚本,一键配置即可
sudo ~/AFLplusplus/afl-system-config
这里推荐使用 tmux 执行 fuzz,因为一旦终端关闭或者 ssh 断开连接,fuzz 就会终止,使用 tmux 可以保证窗口即便退出后也能继续运行。下面这条 tmux 命令的含义是启动一个新的名为 fuzz 的 tmux 窗口
tmux new -s fuzz
接下来在 fuzz 目录下执行:
~/AFLplusplus/afl-fuzz -i in/ -o out -- ./xmllint @@
接下来就可以看到界面了