afl-fuzz技術初探
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
在計算機領域,Fuzz Testing(模糊測試)是一種很有效的測試方法,主要原理為構造一系列“壞”數據傳入應用程序,通過判斷程序是否發生異常發現和檢測潛在的bug.而在安全領域引入fuzz技術,無疑可以使安全研究員效率倍增,更有效的挖掘和防護漏洞。
AFL(American Fuzzy Lop)是目前最高級的Fuzzing測試工具之一,由lcamtu開發.當需要測試的程序有源碼時,AFL通過對源碼重新編譯時插樁(插入分析代碼)的方法來探測程序內部的執行路徑.相對於其他fuzzer,AFL-Fuzz具有更低的性能消耗,更有效的fuzzing策略和tricks最小化技巧,只需簡單的配置即可處理復雜的程序.當然,對於沒有源碼的可執行程序,AFL也可進行處理,但需要QEUM模擬器的支持.
本次實驗將介紹AFL的安裝和使用方法,以有源碼的upx為例進行展示,也會簡要介紹AFL處理無源碼程序的情況.
安裝afl
聽學長介紹,afl會燒ssd,不建議在本地安裝
- 下載最新源碼
- 解壓並安裝:
bash $make $sudo make all
如果不報錯,則afl-fuzz就安裝成功了
有源碼的afl-fuzz
這裏以fuzz upx為例進行測試
編譯upx
- upx項目地址([*https://github.com/upx/upx*)
- 因為afl會對有源碼的程序進行重新編譯,因此需要修改upx的Makefile
$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的文檔,還需要安裝三個庫:
安裝lzma-sdk
$git submodule update --init --recursive
安裝ucl
- 下載ucl
- 編譯:
bash $cd ucl-1.03 $./configure $make $sudo make install
bash $export UPX_UCCLDIR="~/ucl-1.03"
安裝zlib
$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
$cd ~/upx
$make all
若沒有報錯,則編譯成功
此時可在/src目錄下找到upx.out文件
對upx進行fuzz測試
$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
AFL運行界面:
運行結果與分析
可以看出,在短短的十幾分鐘內,已經跑出了6個crash,安全從業者可以通過分析afl_out中的文件得到更多信息,可以看出使用afl-fuzz比起人工審查效率有了極大地提高
對於從stdin獲取輸入的程序,可以使用
# afl-fuzz -i afl_in -o afl_out ./file
無源碼的afl-fuzz
對無源碼的程序進行fuzz一般有兩種方法:
- 對二進制文件進行插樁
- 使用-n選項進行傳統的fuzz測試
這裏主要介紹第一種,該方法是通過afl-qemu實現的.
編譯afl版的qemu
$ cd qemu_mode
$ ./build_qemu_support.sh
在編譯時,可能會遇到以下的報錯:
報錯信息都比較明顯,安裝相應的庫即可
若遇到glib2丟失,可以
$sudo apt-get install libglib2*
對readelf進行fuzz
以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的基本操作做了介紹,更多的高級用法還待以後探索
afl-fuzz技術初探