1. 程式人生 > >afl-fuzz技術初探

afl-fuzz技術初探

高級用法 編譯 tar.xz 構造 還需要 dump mode -c 重新

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一般有兩種方法:

  1. 對二進制文件進行插樁
  2. 使用-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技術初探