轉載請註明出處: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的基本操做作了介紹,更多的高級用法還待之後探索