转载请注明出处:http://www.cnblogs.com/WangAoBo/p/8280352.htmlhtml
参考了:git
http://pwn4.fun/2017/09/21/AFL%E6%8A%80%E6%9C%AF%E4%BB%8B%E7%BB%8D/github
http://blog.csdn.net/youkawa/article/details/45696317vim
https://stfpeak.github.io/2017/06/12/AFL-Cautions/安全
http://blog.csdn.net/abcdyzhang/article/details/53487683bash
在计算机领域,Fuzz Testing(模糊测试)是一种颇有效的测试方法,主要原理为构造一系列“坏”数据传入应用程序,经过判断程序是否发生异常发现和检测潜在的bug.而在安全领域引入fuzz技术,无疑可使安全研究员效率倍增,更有效的挖掘和防御漏洞。工具
AFL(American Fuzzy Lop)是目前最高级的Fuzzing测试工具之一,由lcamtu开发.当须要测试的程序有源码时,AFL经过对源码从新编译时插桩(插入分析代码)的方法来探测程序内部的执行路径.相对于其余fuzzer,AFL-Fuzz具备更低的性能消耗,更有效的fuzzing策略和tricks最小化技巧,只需简单的配置便可处理复杂的程序.固然,对于没有源码的可执行程序,AFL也可进行处理,但须要QEUM模拟器的支持.性能
本次实验将介绍AFL的安装和使用方法,以有源码的upx为例进行展现,也会简要介绍AFL处理无源码程序的状况.测试
听学长介绍,afl会烧ssd,不建议在本地安装ui
下载最新源码
解压并安装:
$make $sudo make all
若是不报错,则afl-fuzz就安装成功了
这里以fuzz upx为例进行测试
$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++
经过upx的文档,还须要安装三个库:
$git submodule update --init --recursive
下载ucl
bash wget http://www.oberhumer.com/opensource/ucl/download/ucl-1.03.tar.gz
编译:
$cd ucl-1.03 $./configure $make $sudo make install
$export UPX_UCCLDIR="~/ucl-1.03"
$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
$cd ~/upx $make all
若没有报错,则编译成功
此时可在/src目录下找到upx.out文件
$cd ~ $mkdir afl_in afl_out afl_in存放测试用例,afl_out存放fuzz结果 $cp /usr/bin/file afl_in $afl-fuzz -i afl_in -o afl_out ~/upx/src/upx.out @@ @@会代替测试样本,即至关于执行了upx.out file
能够看出,在短短的十几分钟内,已经跑出了6个crash,安全从业者能够经过分析afl_out中的文件获得更多信息,能够看出使用afl-fuzz比起人工审查效率有了极大地提升
对于从stdin获取输入的程序,可使用
# afl-fuzz -i afl_in -o afl_out ./file
对无源码的程序进行fuzz通常有两种方法:
这里主要介绍第一种,该方法是经过afl-qemu实现的.
$ cd qemu_mode $ ./build_qemu_support.sh
在编译时,可能会遇到如下的报错:
报错信息都比较明显,安装相应的库便可
若遇到glib2丢失,能够
$sudo apt-get install libglib2*
以readelf为例
$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 @@
以下图,已经开始fuzz了:
本篇博文只对afl-fuzz的基本操做作了介绍,更多的高级用法还待之后探索