作者:天融信阿爾法實驗室
公眾號:https://mp.weixin.qq.com/s/WMfCNN095-PpM0VB_pRESg
一、前言
阿爾法實驗在上一篇文章中向大家介紹了使用AFL開始模糊測試前要做的一些準備工作,以及AFL的幾種工作方式,但是並沒有提到何時結束測試過程,以及測試完成後又需要做些什麼。本文中就繼續介紹這些內容,並開始逐步介紹一些AFL相關原理。以下就是本文中主要討論的問題:
- 何時結束Fuzzing工作
- afl-fuzz生成了哪些文件
- 如何對產生的crash進行驗證和分類
- 用什麼來評估Fuzzing的結果
- 代碼覆蓋率及相關概念
- AFL是如何記錄代碼覆蓋率的
二、Fuzzer工作狀態
因為afl-fuzz永遠不會停止,所以何時停止測試很多時候就是依靠afl-fuzz提供的狀態來決定的。除了前面提到過的通過狀態窗口、afl-whatsup查看afl-fuzz狀態外,這裡再補充幾種方法。
1. afl-stat
afl-stat是afl-utils這套工具AFL輔助工具中的一個(這套工具中還有其他更好用的程序,後面用到時會做介紹),該工具類似於afl-whatsup的輸出結果。
使用前需要一個配置文件,設置每個afl-fuzz實例的輸出目錄:
{ "fuzz_dirs": [ "/root/syncdir/SESSION000", "/root/syncdir/SESSION001", ... "/root/syncdir/SESSION00x" ] }
然後指定配置文件運行即可:
$ afl-stats -c afl-stats.conf [SESSION000 on fuzzer1] Alive: 1/1 Execs: 64 m Speed: 0.3 x/s Pend: 6588/249 Crashes: 101 [SESSION001 on fuzzer1] Alive: 1/1 Execs: 105 m Speed: 576.6 x/s Pend: 417/0 Crashes: 291 ...
2. 定製afl-whatsup
afl-whatsup是依靠讀afl-fuzz輸出目錄中的fuzzer_stats文件來顯示狀態的,每次查看都要需要手動執行,十分麻煩。因此可以對其進行修改,讓其實時顯示fuzzer的狀態。方法也很簡答,基本思路就是在所有代碼外面加個循環就好,還可以根據自己的喜好做些調整:
[2] Fuzzing with AFL
[3] Clang 9 documentation – SanitizerCoverage
[5] How Much Test Coverage Is Enough For Your Testing Strategy?