AFL作為最有名的開源灰盒模糊測試引擎,得到了學(xué)術(shù)界與工業(yè)界的廣泛關(guān)注。本文將簡要介紹AFL在unbuntu linux18.04下的安裝與配置,并介紹AFL的基礎(chǔ)使用,(暫不介紹內(nèi)部原理)如有不足之處還請(qǐng)諸位斧正。
1.下載
推薦到AFL的官網(wǎng)進(jìn)行下載,鏈接如下
https://lcamtuf.coredump.cx/afl/
2.安裝
將壓縮包解壓完成之后,進(jìn)入到其目錄下打開終端
make
sudo make install
如果在該目錄下,出現(xiàn)了afl-fuzz的可執(zhí)行文件,說明安裝成功。(暫未遇到過安裝不成功的情況。)

3.使用
3.1 簡單c語言程序
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
int vuln(char *str)
{
int len = strlen(str);
if(str[0] == 'A' && len == 66)
{
raise(SIGSEGV);
//如果輸入的字符串的首字符為A并且長度為66,則異常退出
}
else if(str[0] == 'F' && len == 6)
{
raise(SIGSEGV);
//如果輸入的字符串的首字符為F并且長度為6,則異常退出
}
else
{
printf("it is good!\n");
}
return 0;
}
int main(int argc, char *argv[])
{
char buf[100]={0};
gets(buf);//存在棧溢出漏洞
printf(buf);//存在格式化字符串漏洞
vuln(buf);
return 0;
}
程序很簡單,不贅述。注意需要將該程序放在與afl-fuzz同一目錄下。
編譯插樁指令:
afl-gcc -g -o afl_test afl_test.c
建立兩個(gè)文件夾,fuzz_in和fuzz_out,顧名思義
fuzz_in中需要?jiǎng)?chuàng)建一個(gè)測試樣本,并在里邊插入字符“123”
echo "123" > 1
fuzzing!!!
afl-fuzz -i fuzz_in -o fuzz_out ./test
運(yùn)行界面如下圖:

ps:可能會(huì)遇到 echo core >/proc/sys/kernel/core_pattern的報(bào)錯(cuò),sudo su之后執(zhí)行這條指令即可
sudo su
echo core >/proc/sys/kernel/core_pattern
簡要說明一下其界面,
(1)process timing
里邊記錄著運(yùn)行時(shí)狀態(tài),當(dāng)前fuzz了多久,距離最近的一次發(fā)現(xiàn)新路徑和觸發(fā)新的程序崩潰過去了多久。
(2)overall results
統(tǒng)計(jì)信息。統(tǒng)計(jì)有多少崩潰,fuzzing循環(huán)了多少次,發(fā)現(xiàn)了多少路徑。
其他的話目前還不需要了解。
這樣就完了么?沒有...我還要展示如何使用AFL來fuzz binutils
3.2 AFL測試readelf
下載好binutils,(因?yàn)檫@里示范的是有源碼下的編譯插樁,所以需要去binutils的源碼,針對(duì)二進(jìn)制程序的QEMU模式以后再介紹吧)
https://ftp.gnu.org/gnu/binutils/
下載完成之后解壓,進(jìn)入其目錄下
注意?。?!注意!??!敲重點(diǎn)啦
必須修改編譯器環(huán)境為afl-gcc和afl-g++,在大部分的源碼編譯插樁中基本都需要這一步。
>CC=~/.../afl-gcc CXX=~/.../afl-g++ ./configure //替換為自己afl的目錄
>make
如果在make的時(shí)候如果有類似下邊的Instrumented就說明你成功了:

一定要先插樁成功,如果不成功的話,無法進(jìn)行測試的。
如果沒有插樁成功,可以刪除當(dāng)前目錄然后多嘗試幾次,關(guān)鍵就是要將CC更改為afl-gcc,并且更新配置信息。
測試 readelf
>mkdir fuzz_in
>cd ..
>~/../afl-fuzz -i fuzz_in -o fuzz_out binutils/readelf -d @@
readelf有輸入?yún)?shù)-d,不加的話就會(huì)報(bào)錯(cuò)
另外,輸入的文件夾fuzz_in里邊需要放一個(gè)elf文件,這里可以使用afl自帶的,
文件目錄為~/afl-2.52b/testcases/others/elf/small_exec.elf
界面展示:

后記
本人在剛開始配置AFL的過程中得到了前輩們寫的教程幫助,respect,由此在前人的基礎(chǔ)上將自己的配置過程寫下來。后續(xù)會(huì)接著介紹afl測試其他目標(biāo)程序以及LAVA-M數(shù)據(jù)集,并且介紹AFL的原理和源碼閱讀。
參考鏈接:
https://xz.aliyun.com/t/4314
https://www.codercto.com/a/78143.html
http://www.itdecent.cn/p/bfab6bb94fb6?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation