AFL入门
1 afl 是什么?
American fuzzy lop 號(hào)稱是當(dāng)前最高級(jí)的Fuzzing 測(cè)試工具之一,由谷歌的Michal Zalewski 所開發(fā)。通過(guò)對(duì)源碼進(jìn)行重新編譯時(shí)進(jìn)行插樁(簡(jiǎn)稱編譯時(shí)插樁)的方式自動(dòng)產(chǎn)生測(cè)試用例來(lái)探索二進(jìn)制程序內(nèi)部新的執(zhí)行路徑。與其他基于插樁技術(shù)的fuzzers 相比,afl-fuzz 具有較低的性能消耗,有各種高效的fuzzing 策略和tricks 最小化技巧,不需要先行復(fù)雜的配置,能無(wú)縫處理復(fù)雜的現(xiàn)實(shí)中的程序。當(dāng)然AFL 也支持直接對(duì)沒(méi)有源碼的二進(jìn)制程序進(jìn)行測(cè)試,但需要QEMU 的支持,將在本文后面做詳細(xì)介紹。
2 安裝
從官網(wǎng)http://lcamtuf.coredump.cx/afl/ 下載最新版的源碼(latest version),解壓后進(jìn)入所在目錄。執(zhí)行以下命令進(jìn)行編譯和安裝:
make
sudo make install
默認(rèn)情況下,afl 相關(guān)的可執(zhí)行文件會(huì)被安裝到/usr/local/bin 目錄下,我們看看安裝了哪些工具,執(zhí)行l(wèi)s 命令(如圖1):
ls /usr/local/bin/afl*
?
從圖1可以看到,AFL 安裝的文件,作用分別為:
? afl-gcc 和afl-g++ 分別對(duì)應(yīng)的是gcc 和g++ 的封裝
? afl-clang 和afl-clang++ 分別對(duì)應(yīng)clang 的c 和c++ 編譯器封裝à。
? afl-fuzz 是AFL 的主體,用于對(duì)目標(biāo)程序進(jìn)行fuzz。
? afl-analyze 可以對(duì)用例進(jìn)行分析,通過(guò)分析給定的用例,看能否發(fā)現(xiàn)用例中有意義的字段。
? afl-qemu-trace 用于qemu-mode,默認(rèn)不安裝,需要手工執(zhí)行qemu-mode 的編譯腳本進(jìn)行編譯,后面會(huì)介紹。
? afl-plot 生成測(cè)試任務(wù)的狀態(tài)圖
? afl-tmin 和afl-cmin 對(duì)用例進(jìn)行簡(jiǎn)化
? afl-whatsup 用于查看fuzz 任務(wù)的狀態(tài)
? afl-gotcpu 用于查看當(dāng)前CPU 狀態(tài)
? afl-showmap 用于對(duì)單個(gè)用例進(jìn)行執(zhí)行路徑跟蹤 3.使用
1.文件FUZZ
官網(wǎng)有許多:略
2.網(wǎng)絡(luò)I/O
1. 如果手頭有被測(cè)程序的源碼,可以修改源碼,對(duì)網(wǎng)絡(luò)接收?qǐng)?bào)文的函數(shù)進(jìn)行封裝,改為從文件文件讀取數(shù)據(jù);
2. 如果沒(méi)有源碼,或者不想修改代碼這么麻煩的話,可以使用LD_PRELOAD 加載一些hook 庫(kù),替換掉recv、recv_from 等網(wǎng)路I/O 函數(shù)。preeny 是一個(gè)很好的選擇à。我們以兩個(gè)實(shí)際的例子,看看如何使用AFL 測(cè)試一個(gè)網(wǎng)絡(luò)程序,分別對(duì)應(yīng)修改源碼和替換系統(tǒng)函數(shù)這兩種方式。
?4.建議
首先我們需要認(rèn)識(shí)到AFL 的優(yōu)劣勢(shì),選擇適合的工具做合適的事情。AFL 設(shè)計(jì)之初就是用來(lái)做文件格式fuzz的,而且也測(cè)出了很多知名開源組件的漏洞,如:OpenSSH,ntpd,PHP,sqlite、Firefoxà該目錄中的所有用例都是AFL 在FUZZ 過(guò)程中能導(dǎo)致目標(biāo)程序異常退出的如何更有效地使用等等,這些漏洞的共同的特征是從文件中讀取數(shù)據(jù)進(jìn)行解析。AFL 未設(shè)計(jì)針對(duì)有特定狀態(tài)機(jī)的復(fù)雜網(wǎng)絡(luò)程序的fuzz,所以,像那些有復(fù)雜交互狀態(tài)的網(wǎng)絡(luò)程序,如通過(guò)一些交互報(bào)文建立一個(gè)會(huì)話,后續(xù)在此會(huì)話中處理輸入,那么AFL 就不太適合了,peach 是更合適的選擇。另外,AFL 目前也不支持fuzz 命令行參數(shù),所以對(duì)于有些程序直接讀取命令行參數(shù)中的內(nèi)容,并對(duì)參數(shù)內(nèi)容進(jìn)行處理,AFL 也做不了。
這里給出幾個(gè)更有效使用AFL 的TIPS。
1. 盡量使測(cè)試用例足夠小
大用例不光使得目標(biāo)進(jìn)程解析時(shí)需要耗費(fèi)更多CPU 時(shí)間和更多內(nèi)存,也會(huì)使得fuzz 進(jìn)程效率非常低下。舉個(gè)例子,如果要對(duì)一個(gè)圖片處理程序進(jìn)行fuzz,就沒(méi)必要將高分辨率的照片作為用例,一個(gè)16x16 分辨率的圖片就足矣。再舉個(gè)例子,從數(shù)據(jù)上來(lái)看,如果一個(gè)用例的大小為100 字節(jié),那么fuzz 1000 次,可以有71% 的機(jī)會(huì)觸發(fā)到有問(wèn)題的執(zhí)行路徑;如果用例的大小變?yōu)?k 字節(jié),則同樣的執(zhí)行次數(shù),觸發(fā)有問(wèn)題的分支的概率降低為%11;如果用例規(guī)模進(jìn)一步增長(zhǎng),變?yōu)?0k字節(jié),則同樣的執(zhí)行次數(shù),觸發(fā)問(wèn)題分支的概率將降低為%1。
2. 確保測(cè)試對(duì)象足夠簡(jiǎn)單
有些基本的文件格式處理庫(kù)被不同的處理程序使用,有些處理程序功能復(fù)雜,有些簡(jiǎn)單,那么,我們應(yīng)該選擇那些功能簡(jiǎn)單的處理程序來(lái)fuzz。舉個(gè)例子,就圖片格式處理程序來(lái)說(shuō),djpeg、readpng 以及gifhisto 要比ImageMagick 在執(zhí)行效率上快5 到10 倍,但是他們都用同樣的圖片格式解析庫(kù)。
3. 只給需要測(cè)的庫(kù)進(jìn)行打樁因?yàn)锳FL
是在匯編級(jí)別對(duì)被測(cè)程序的源碼進(jìn)行插樁的,也就是說(shuō),插樁的點(diǎn)越多,編譯出來(lái)的程序執(zhí)行效率就會(huì)越低。那么,如果只想對(duì)其中某一個(gè)庫(kù)進(jìn)行fuzz 的話,可以用未插樁的庫(kù)替換掉被測(cè)程序中使用AFL 編譯器編譯出來(lái)的庫(kù)。
4. 并行
afl-fuzz 設(shè)計(jì)成只給工作進(jìn)程分配一個(gè)核,現(xiàn)在的機(jī)器都具備多個(gè)CPU,每個(gè)CPU 又有多個(gè)核,所以我們可以最大地發(fā)揮硬件效率,同時(shí)執(zhí)行多個(gè)afl-fuzz。
轉(zhuǎn)載于:https://www.cnblogs.com/0xHack/p/9414444.html
總結(jié)
- 上一篇: 铝合金多少钱啊?
- 下一篇: 黄金今天多少钱一克啊?