應用
- Fuzzit 結合 DevOps
- AI-Based Fuzzing (AIF)
相關概念
- Code Coverage: 測試涵蓋範圍
- Basic Block
- edge
- tuple
參考 AFL 漏洞挖掘技术漫谈(二):Fuzz 结果分析和代码覆盖率
Fuzzing 的類型
- Blind Fuzzing: 僅透過大量數據觸發崩潰
- Guided Fuzzing: 關注測試數據的品質以提昇測試覆蓋率,ALF 為此類別。1
型類
- file fuzz
- protocol fuzz
測資分類
- Generation-based Fuzzing 基於生成,透過協議與界面產生測資
- Mutation-based Fuzzing 基於異變,異變現有的測資產生2:
常見的 Fuzzer
- afl GitHub
- 或
afl++
- 或
- 另外請見 Honggfuzz 筆記
- boofuzz
Fuzzing 的前置準備
- 花費 90% 閱讀文檔,來分析可能出現問題的位置1
基本的 Fuzzer 演算法
Mutator
radamsa
安裝
sudo pacman -S radamsa
使用
echo "if(x > 8)" | radamsa
或許可以搭配自己的 fuzz 腳本使用?
AFL
安裝
sudo pacman -S afl
白箱測試
編譯被測試程式
afl-gcc main.c
編寫測資後,測試程式
afl-fuzz -i in -o out ./a.out
或使用參數
afl-fuzz -i in -o out ./a.out @@
黑箱測試
黑箱測試可以採用
- afl-dyninst
- afl qemu
如果需要黑箱測試就必須編譯 qemu,這邊先 pull image
docker pull aflplusplus/aflplusplus
docker run -it -v $(pwd):/work aflplusplus/aflplusplus:latest /bin/bash
docker exec -it $id bash -i
cd /work
之後進入 docker 進行編譯,會把 qemu 之類的東西編譯好
make
之後我們就可以下指令
afl-fuzz -i ./in -o ./out -Q -- ./a.out
或者採用 docker image (不過這個版本,比較舊, 少人使用)
docker run -t -v $(pwd):/fuzz pl0nk/afl-qemu afl-fuzz -i /fuzz/in -o /fuzz/out -Q -- /fuzz/binary
Persistent Mode
AFL_QEMU_SNAPSHOT=0x????
AFLplusplus/README.persistent.md at stable · AFLplusplus/AFLplusplus
常見問題
Hmm, looks like the target binary terminated before we could complete a
handshake with the injected code. You can try the following
也可能是 libc 的版本不正確導致無法正常運作
把 libc, ld 抓出來之後,透過 ld 開始跑,並且確保 mv libc-2.33.so libc.so.6
不過這樣跑似乎蠻慢的
afl-fuzz -i ./in -o ./out -Q -- ./ld-2.33.so --library-path . ./binary
啟動持久模式,可以加速 qemu
-
參考 简单高效的模糊测试——Fuzzing ↩︎ ↩︎ ↩︎
-
建議閱讀 Fuzzing技术总结与工具列表,而該篇應該是轉載自原始貼文 ,而原始貼文似乎有更新過 ↩︎
Debug Vulnerability Fuzzing Testing Zero-Day