星期五實驗室

AFL介紹

American fuzzy lop (AFL) 是由lcamtuf開發的一款模糊測試工具,它採用了編譯時插樁和遺傳算法來自動發現能引起目標二進制文件新的內部狀態的乾淨有趣的測試用例。它的工作流程大致如下:

  1. 將用戶提供的初始測試用例加載到隊列中
  2. 從隊列中獲取下一個輸入文件
  3. 嘗試將測試用例調整到不會影響程序行為的最小大小
  4. 使用均衡的經過充分研究過的各種傳統模糊測試策略反覆的變異文件
  5. 如果任何生成的突變導致記錄了一個新的狀態轉換,將變異的輸出作為新的加入到隊列中
  6. 回到步驟2開始重複操作

發現的測試用例也會定期選出部分消除,用更新的更高覆蓋率的用例所取代,並執行幾個其他插樁驅動的工作量最小化步驟。

插樁

當源代碼已知時,AFL可以在重新編譯源代碼時對相關代碼進行插樁。

AFL的安裝與使用

首先從官網下載源碼壓縮包,輸入以下命令安裝


星期五實驗室 | AFL入門

插樁編譯(有源碼fuzz)

首先對源碼進行編譯


星期五實驗室 | AFL入門

如果有makefile,需要在makefile中添加 gcc/g++重新編譯目標程序的方法是:

星期五實驗室 | AFL入門

對於一個C++程序,要設置:

星期五實驗室 | AFL入門

然後需要建立兩個文件夾儲存輸入和輸出

在執行fuzz前,如果系統配置為將核心轉儲文件(core)通知發送到外部程序。將導致將崩潰信息發送到Fuzzer之間的延遲增大,進而可能將崩潰被誤報為超時,所以我們得臨時修改core_pattern文件


星期五實驗室 | AFL入門

對那些可以直接從stdin讀取輸入的目標程序來說,語法如下:

星期五實驗室 | AFL入門

對從文件讀取輸入的目標程序來說,要用“@@”,語法如下:

星期五實驗室 | AFL入門

從testcasedir中讀取輸入,輸出放在findingsdir中, path/to/program 是測試程序的路徑

無源碼fuzz

無源碼的情況下我們也可以使用afl進行測試,不過要啟用qemu模式。

在安裝qemu模式時可能會提示缺少 automake,python,libtool,bison,glib2, 使用apt-get install安裝即可,libtool需要安裝libtool-bin, glib2需要安裝libgtk2.0-dev

遇到以下報錯時

星期五實驗室 | AFL入門

由於qemu的util/memfd.c中定義的函數memfd_create()會和glibc中的同名函數衝突,參考這篇文章添加一個patch即可

星期五實驗室 | AFL入門

保存為memfdcreate.diff後 在 buildqemu_support.sh中修改

星期五實驗室 | AFL入門

之後就可以重新安裝了

星期五實驗室 | AFL入門

安裝成功後可以使用參數Q運行qemu模式

星期五實驗室 | AFL入門

AFL的運行

開始運行afl後會出現以下界面,如果顯示不完整可以調整窗口大小。

星期五實驗室 | AFL入門

process timing


星期五實驗室 | AFL入門

這裡展示的是fuzzer的運行時間,也可以看到最近一次發現新路徑的時間,最近一次崩潰的時間和最近一次掛起的時間。

overall result


星期五實驗室 | AFL入門

這裡提供的是運行的總週期數,總路徑數,崩潰次數和掛起次數。

cycle progress


星期五實驗室 | AFL入門

這裡提供的是fuzzer正在處理的測試樣例的編號和由於超時放棄的的輸入數量,從而得知fuzzer處理了多少樣例,隊列中還剩多少。

map coverage


星期五實驗室 | AFL入門

第一行顯示的是已經命中了多少分支元組與位圖可以容納的數量的比例。左邊的是當前輸入,右邊的是整個輸入語料庫的值。

第二行顯示的是二進制文件中元組命中計數的變化,如果對於所有嘗試的輸入,每個採用的分支都採用固定的次數。讀數顯示為1.00, 當設法觸發每個分支的其他命中計數時,讀數向8.00移動(8位映射命中每一位),但可能永遠不會到達極限。

這些值可以用於比較不同的模糊測試對於同一檢測二進制文件的覆蓋範圍。

stage progress


星期五實驗室 | AFL入門

這裡顯示了正在測試的策略,進度,總執行次數和執行速度。一般正常的執行速度應該在500以上。

findings in depth

星期五實驗室 | AFL入門

這一部分的數據對一般的使用者用處不大,包括基於應用到代碼的最小化算法獲得的fuzzer最喜歡的路徑數和真正獲取更好的邊緣覆蓋率的測試用例數,還有超時和崩潰的計數器,注意這裡的timeout和hang有所不同,timeout計數器包括了所有超過超時的測試用例,即使它們沒有超過超時足夠的幅度而分類為hangs(掛起)。

fuzzing strategy yields


星期五實驗室 | AFL入門

這部分用於追蹤各種fuzzing策略所獲得的路徑和嘗試執行的次數的比例,用於驗證各種方法的有效性。

path geometry


星期五實驗室 | AFL入門

這部分的第一個數據指的是fuzzing過程中達到的路徑深度,通常用戶提供的測試用例視為1級,傳統模糊測試從中獲得的測試用例視為2級,通過它們作為後續模糊測試回合的輸入得到的結果為3級,以此類推。

下一個數據pending指的是還有多少輸入數據沒有經過任何測試。pend fav時指fuzzer在這個隊列中真正想到達的條目。接下來的是這個fuzzing部分找到的新路徑數量和在進行並行化fuzzing時從其他fuzzer實例導入的路徑數量 。

最後一個數據可以衡量觀測到痕跡的一致性,如果程序對相同的輸入始終表現相同,則為100%,若數值較低但仍然顯示為紫色,測試過程不太可能受到負面影響,而顯示紅色說明出現了問題,afl可能難以區分調整輸入文件的有意義的效果和幻象效果。

CPU Load


星期五實驗室 | AFL入門

CPU利用率


運行結果

測試一段時間後我們可以打開輸出文件夾,就可以看到有crashes,hangs,queue三個文件夾存放著生成的對應的樣例,以及fuzzbitmap, fuzzerstats, plot_data三個文件。

比如針對我們的demo1


星期五實驗室 | AFL入門

得到的crash用xxd查看

星期五實驗室 | AFL入門

基礎的安裝與使用就介紹到這裡,afl還有很多別的功能,感興趣的朋友可以繼續研究


引用和參考

American fuzzy lop 官方網站

http://lcamtuf.coredump.cx/afl/


AFL漏洞挖掘技術漫談(一):用AFL開始你的第一次Fuzzing

作者:alphalab (FreeBuf)

https://www.freebuf.com/articles/system/191543.html


qemu patch

https://www.mail-archive.com/[email protected]/msg1643066.html


星期五實驗室 出品


分享到:


相關文章: