關於AFL fuzz
AFL fuzz是一個模糊測試工具,它封裝了一個GCC/CLang編譯器,用於對被測代碼重新編譯的過程中進行插樁。插樁完畢后,AFL fuzz就可以給其編譯過的代碼輸入不同的參數參數,跟蹤被測代碼的執行路徑,並判定對輸入的變異能否觸發新的已知或未知執行路徑。
某些情況下,你可能不想重新編譯被測代碼,或者根本沒有被測程序的源代碼,因此無法用編譯的方式插樁。針對這種情況,AFL fuzz提供了QEMU模式,QEMU即“user emulation”的縮寫,相當於是黑盒測試,主要用於壓力測試(被測系統性能將下降2~5倍,但相比如DynamoRIO、PIN這些工具,QEMU的性能還算不算了)。
安裝
AFL fuzz的安裝非常簡單,只需要去官網下載最新版本的源代碼,解壓縮后依次執行下面的指令:
make
sudo make install
若需要使用QEMU模式,參見下面的步驟:
1、使用./build_qemu_support.sh 腳本進行構建,其會自動下載、配置並編譯QEMU的二進制代碼,此過程比較耗時,且這一過程中需要解決一些依賴包的問題(必須的依賴包:libtool、glib2-devel)。
2、編譯完成后,在afl-fuzz的啟動參數中加入“-Q”即可啟用QEMU模式。
注意:
1、QEMU模式需要較大內存空間,建議的最低配置為200M,負責項目則需要更多。當在afl-fuzz的啟動參數中指定的-Q參數時,afl-fuzz會自動設置-m參數,默認值為200M。
2、afl-fuzz適用於linux系統,且不追蹤共享庫,即:
2-1、對於想要分析的庫必須以靜態方式鏈接到可執行二進制文件;
2-2、對於C的標准庫及其他一些比較耗費資源而又不必要測試的庫則必須以動態方式鏈接,否則afl fuzz是沒有辦法不測這些內容的。
示例
已對binutils的模糊測試為例,說明如何使用afl fuzz。
首先,需要下載binutils的源碼並解壓,進入加壓后的文件夾,重寫CC編譯環境變量的值(如果是C++程序,且用g++而不是gcc進行編譯,則修改CXX),修改后即可運行configure腳本,然后編譯。
cd ~/binutils-2.25
CC=afl-gcc ./configure
make
注:如果用clang,而不是gcc,則將CC改為afl-clang。
編譯完成后,要修改一下配置,使系統將coredump輸出到文件,而不是上報給系統的處理程序:
# echo core > /proc/sys/kernel/core_pattern
建一個input文件夾作為afl fuzz的輸入,afl fuzz將在這個輸入的基礎上進行變異,在建立一個out文件夾,作為afl fuzz的輸出,afl fuzz會將崩潰、掛起等問題記錄到輸出文件中:
cd ~/binutils-2.25
mkdir afl_in afl_out
cp /bin/ps afl_in/
接下來,就可以使用afl fuzz進行模糊測試了:
cd ~/binutils-2.25
afl-fuzz -i afl_in -o afl_out ./binutils/readelf -a @@
afl fuzz啟動后,我們將看到如下界面: