酷播亮新聞
最棒的知識補給站

honggfuzz漏洞挖掘技術深究系列(2)—— Persistent Fuzzing

文章摘要: 可定義該函式作為相應的回撥處理 indirect-calls上篇 《honggfuzz漏洞挖掘技術深究系列(1)——反饋驅動(Feedback-Driven)》 講到基於軟體的程式碼覆蓋率驅動fuzzing的方式

上篇 《honggfuzz漏洞挖掘技術深究系列(1)——反饋驅動(Feedback-Driven)》 講到基於軟體的程式碼覆蓋率驅動fuzzing的方式,除了軟體還有硬體方式,即基於Intel BTS (Branch Trace Store) 或Intel PT (Processor Tracing) 去計算程式碼覆蓋率,同時要求Linux核心>=4.2,這種方式的最大好處是完全由硬體支配,無所謂軟體是閉源還是開源。由於硬體環境受限,我也一直未使用過,有此條件的同學可以試下。

本篇主要講下持久型fuzzing(Persistent Fuzzing),即fuzzing API,這種方式會更精準和高效的。

先看使用方法:

$ cat test.c
#include 
#include    
extern int LLVMFuzzerTestOneInput(uint8_t **buf, size_t *len);
  
int LLVMFuzzerTestOneInput(uint8_t *buf, size_t len) {
  _FuncFromFuzzedLib_(buf, len);  // 目標函式
  return 0;
}
$ clang-4.0 -fsanitize-coverage=trace-pc,indirect-calls,trace-cmp fuzzedlib.c -o fuzzedlib.o
$ clang-4.0 test.c fuzzedlib.o honggfuzz/libhfuzz/libhfuzz.a -o test
$ honggfuzz -z -P -f INPUT.corpus -- ./test

這裏用到幾個編譯選項:

  • trace-pc :追蹤執行過的基本塊BB,在每個edge中插入__saitizer_cov_trace_pc()函式,可定義該函式作為相應的回撥處理
  • indirect-calls :在每個間接呼叫中新增PC追蹤,與前面的trace-pc或trace-pc-guard聯合使用,回撥函式:__sanitizer_cov_trace_pc_indir
  • trace-cmp :追蹤每個比較指令和swith語句

以trace-pc為例,測試程式碼如下:


用trace_pc編譯:


可以看到自定義的函式被執行,輸出執行過的不同pc地址,其它編譯選項的用法同上。

下面是honggfuzz對各個回撥函式的定義情況:


然後就是記錄程式碼覆蓋率情況並進行統計,跟驅動反饋的方式一樣了。

再回頭看使用示例中的 LLVMFuzzerTestOneInput 函式,honggfuzz是如何處理它的呢?


通過for無限迴圈呼叫目標函式進行Fuzzing,其中引數buf,即樣本檔案內容,len是資料長度。

最後根據發現的新路徑,將相應的樣本作為新樣本繼續fuzzing。


如有侵權請來信告知:酷播亮新聞 » honggfuzz漏洞挖掘技術深究系列(2)—— Persistent Fuzzing