前言:
前兩篇分別是:利用AFL對LAVA-M數據集測試 和 加入mopt編寫同步啟動腳本,這是最后一篇,在前面的基礎上加上ijon-AFL 的測試(Angora、QSYM、需要單獨再開一個虛擬機測試,環境沖突,計划暫且擱置),並優化一鍵啟動腳本。
為什么挑選這五個,不僅僅是因為開源的原因,還因為這五個優化方向各有不同:
AFL:谷歌開發的模糊測試產品,屬於開創現在這幾年模糊測試的先河,可以看到超級多的fuzzer就是在AFL的基礎上進行的改進,所以一定要有這個作為標桿;
MOpt-AFL:這是19年的一篇頂會的文章,要加這個有三點:一是開源、二是改進代碼清晰易讀、三是論文的那個浙大實驗室來這里進行過講座,是因為那位老師的講座和之后的交流我才對fuzz模糊測試感興趣,找到自己之后的研究方向;
Angora:是18年的SP的文章,選這個的原因有兩點:一是開源、二是改進成熟,最近貌似是要從學術進入到工業中,足以可見這個項目的潛力其實不小;(因為環境問題需要單獨另起一個虛擬機處理,留做下一個筆記);
QSYM:18年USENIX的頂會文章,關於混合模糊測試的工具,原因有二:一是開源、二是混合模糊測試即使漸漸開始脫離 覆蓋率反饋導向型模糊測試 的隊列,自成一體,成為一個新的研究分支(單獨另起一個虛擬機,留作下一個筆記);
ijon+AFL:20年的SP文章,選這個原因有三:一是開源、二是展現形式新穎,把路徑跟游戲相結合,做展示、三是iJon不是一個集成的fuzz工具,更像是抽象出來的插件,可以用它加到其他fuzz上,這里用的是它加上afl,所以是ijon+AFL,其實也可以跟着作者readme做一個ijon+Mopt-AFL;
iJon-AFL
1. 下載 iJon 和 iJon-data 數據集
git clone https://github.com/RUB-SysSec/ijon.git git clone https://github.com/RUB-SysSec/ijon-data.git
分別是 ijon+afl 的源碼 和 論文中用到的測試數據集:maze、super Mario Bros、tpm_fuzzing
2. 安裝 llvm 和 clang
如果已經安裝好可以跳過這一步,直接查看版本:
如果沒有安裝:
(因為 llvm 是一個大框架,包含了clang,所以先安裝clang,再安裝 llvm)
sudo apt-get install clang sudo apt-get install llvm
安裝完回到最開始那里查看版本。
3. 安裝 AFL
make sudo make install (-j4 如果支持多核可以用-j參數,能加快速度)
4. 安裝 llvm 模式下的afl
cd llvm_mode LLVM_CONFIG=llvm-config-3.8 CC=clang-3.8 make
這里版本跟第二步查到的一致就行
5. 對maze進行測試
我對maze進行了一些魔改,可以從github先下下來
git clone https://github.com/WayneDevMaze/mod-ijon-maze.git
文件說明:
地圖源文件:
big.c 大地圖(13 * 17 大地圖模式)
small.c 小地圖(7 * 11 符號執行的路徑經常用這個地圖來測試)
tiny.c 新加的地圖(4 * 6 超級小地圖)
地圖結果展示源文件:
maze_show.c 當fuzz跑完跑出結果的時候調用這個文件對應的程序,對路徑結果進行展示
腳本:
build.sh 編譯腳本,對三類地圖進行編譯,並對地圖展示程序進行編譯.
run_afl.sh 運行 afl,第一個參數格式 maze.tiny.bt (tiny對應三種地圖模式,bt是對應兩類,還有一種是nobt,意味着是否可以回退,如果可以回退,對 fuzz 來說路徑難度會加倍)
運行測試:
bash build.sh bash run_afl.sh maze.tiny.bt
6. 查看運行結果
如果出現fuzz界面,並且很快出現結果,然后有路徑重現,說明成功
7. 對LAVA-M數據集進行插樁編譯
設置C、C++環境
export CC=afl-clang-fast export CXX=afl-clang-fast++
檢查環境可以用 echo
運行編譯腳本
./validate.sh
8. 利用 iJon+afl 對 base64 進行測試
AFL_BENCH_UNTIL_CRASH=1 afl-fuzz -m none -i fuzzer_input -o outputs -- coreutils-8.24-lava-safe/lava-install/bin/base64 -d @@
到這里對base64的 iJon+afl 測試就完成了,剩下的就是等着跑結果了。
一鍵啟動 bash 優化
現在在前兩篇的基礎上要實現的是一個可以挑選一定的參數,然后選擇性的啟動需要的fuzzer,其實這里挺簡單的,就是加一個case分支選項。
但是之后的想法是,能不能讓各個fuzzer之間數據共享,也就是之間的outputs能夠互相運用,這個可能需要后面完成 angora 和 qsym 再實現了。
參考
1. Angora 官方 git - lava教程:https://github.com/AngoraFuzzer/Angora/blob/master/docs/lava.md