文章摘要: 可定義該函式作為相應的回撥處理 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。