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