afl

afl-fuzz技术初探
目录

安装lzma-sdk
安装ucl
安装zlib
编译upx

afl-fuzz技术初探
转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.html

参考了:

http://pwn4.fun/2017/09/21/AFL%E6%8A%80%E6%9C%AF%E4%BB%8B%E7%BB%8D/

http://blog.csdn.net/youkawa/article/details/45696317

https://stfpeak.github.io/2017/06/12/AFL-Cautions/

http://blog.csdn.net/abcdyzhang/article/details/53487683

安装afl

下载最新源码
解压并安装:
1
bash $make $sudo make all

有源码的afl-fuzz

这里以fuzz upx为例进行测试

编译upx
upx项目地址([*https://github.com/upx/upx*)
因为afl会对有源码的程序进行重新编译,因此需要修改upx的Makefile
1
2
3
4
5
6
7
8
9
$git clone https://github.com/upx/upx.git
$cd upx
$vim Makefile
CC = /usr/local/bin/afl-gcc #添加此句


$cd src
$vim Makefile
CXX ?= /usr/local/bin/afl-g++ #将CXX改成afl-g++

安装lzma-sdk

1
$git submodule update --init --recursive

安装ucl

1
2
bash $cd ucl-1.03 $./configure $make $sudo make install
bash $export UPX_UCCLDIR="~/ucl-1.03"

安装zlib

1
2
3
4
5
6
$wget http://pkgs.fedoraproject.org/repo/pkgs/zlib/zlib-1.2.11.tar.xz/sha512/b7f50ada138c7f93eb7eb1631efccd1d9f03a5e77b6c13c8b757017b2d462e19d2d3e01c50fad60a4ae1bc86d431f6f94c72c11ff410c25121e571953017cb67/zlib-1.2.11.tar.xz


$cd zlib-1.2.11/
$./configure
$sudo make install

编译upx

1
2
$cd ~/upx
$make all

此时可在/src目录下找到upx.out文件
对upx进行fuzz测试

1
2
$cd ~
$mkdir afl_in afl_out

afl_in存放测试用例,afl_out存放fuzz结果

1
2
$cp /usr/bin/file afl_in
$afl-fuzz -i afl_in -o afl_out ~/upx/src/upx.out @@

@@会代替测试样本,即相当于执行了upx.out file

对于从stdin获取输入的程序,可以使用

1
# afl-fuzz -i afl_in -o afl_out ./file

无源码的afl-fuzz

对无源码的程序进行fuzz一般有两种方法:
对二进制文件进行插桩
使用-n选项进行传统的fuzz测试
这里主要介绍第一种,该方法是通过afl-qemu实现的.

编译afl版的qemu

1
2
$ cd qemu_mode 
$ ./build_qemu_support.sh

另外需要把afl加入环境变量
例如:编辑/etc/profile文件,添加CLASSPATH变量

1
2
# vi /etc/profile 
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

对readelf进行fuzz

以readelf为例

1
2
3
4
5
$mkdir afl_in afl_out
$cp test afl_in
test为自己准备的测试elf
$sudo cp /usr/bin/readelf .
$afl_fuzz -i afl_in -o afl_out -Q readelf -a @@