AFL簡易使用


AFL 簡易使用

一、環境

名稱 版本 鏈接
AFL 2.57B https://github.com/google/AFL
Ubuntu 18.04 https://ubuntu.com/
UPX 3.94 https://github.com/upx/upx.git
afl-cov 0.62 https://github.com/mrash/afl-cov#prerequisites

二、測試

  • vi test.c
#include<stdio.h>    
#include<stdlib.h>    
#include<string.h>    
      
int main(int argc, char* argv[]) {    
      char buf[100] = {0};    
      gets(buf);    
      printf("%s\n",buf);    
      return 0;    
 }   
  • 使用afl-gcc test.c

  • 創建輸入輸出文件夾,並初始化首個樣本文件

  • 使用afl-fuzz -i fuzz_in -o fuzz_iout ./a.out

  • 如上圖所示即為運行成功。

  • 在fuzz_iout 目錄下存在crashes文件夾,里面存放着可以導致崩潰的文件

*如下圖所示觸發

三、fuzz upx

  • 首先拉取upx代碼並切換到3.94版本
    git clone https://github.com/upx/upx.git
    cd upx
    git checkout v3.94

  • 拉取依賴(在當前目錄下運行)
    git submodule update --init --recursive

  • 上面這一步是為了拉取src/lzma-sdk/目錄下的代碼

  • vim src/Makefile

    • CC = /usr/local/bin/afl-gcc (添加)
    • CXX ?= /usr/local/bin/afl-g++ (修改)
  • 安裝 UCL

  • 進入upx目錄執行make all

  • 編譯完成之后就可以進行fuzz了

  • mkdir upx_in upx_out

  • cp /bin/touch upx_in

  • afl-fuzz -i upx_in -o upx_out -m 300 -t 300000 -- upx/src/upx.out @@

四、簡易介紹

  • afl命令
    afl-gcc 和afl-g++ 分別對應的是gcc 和g++ 的封裝 可以編譯文件,並在源文件中添加特殊指令用於 afl fuzz 編譯插裝
    afl-clang 和afl-clang++ 分別對應clang 的c 和c++ 編譯器封裝À。
    afl-fuzz 是AFL 的主體,用於對目標程序進行fuzz。
    afl-analyze 可以對用例進行分析,通過分析給定的用例,看能否發現用例中有意義的字段。
    afl-qemu-trace 用於qemu-mode,默認不安裝,需要手工執行qemu-mode 的編譯腳本進行編譯
    afl-plot 生成測試任務的狀態圖
    afl-tmin 和afl-cmin 對用例進行簡化
    afl-whatsup 用於查看fuzz 任務的狀態
    afl-gotcpu 用於查看當前CPU 狀態
    afl-showmap 用於對單個用例進行執行路徑跟蹤
  • afl-fuzz 參數
    -i:指定測試樣本所在目錄;
    -o:指定測試結果存放目錄;
    -M:運行主(Master) Fuzzer;
    -S:運行從屬(Slave) Fuzzer;
    -t:設置程序運行超時值,單位為 ms;
    -m:最大運行內存,單位為 MB;
  • 窗口信息
    Process timing:Fuzzer運行時長、以及距離最近發現的路徑、崩潰和掛起經過了多長時間。
    Overall results:Fuzzer當前狀態的概述。
    Cycle progress:我們輸入隊列的距離。
    Map coverage:目標二進制文件中的插樁代碼所觀察到覆蓋范圍的細節。
    Stage progress:Fuzzer現在正在執行的文件變異策略、執行次數和執行速度。
    Findings in depth:有關我們找到的執行路徑,異常和掛起數量的信息。
    Fuzzing strategy yields:關於突變策略產生的最新行為和結果的詳細信息。
    Path geometry:有關Fuzzer找到的執行路徑的信息。

五、afl-cov的使用

  • afl-cov主要是為了查看覆蓋率,並且需要編譯支持。
  • 首先拷貝一份upx的代碼
    • cd upx_2

    • vi src/Makefile

    • 在上面更改的CC和CXX后面添加-fprofile-arcs -ftest-coverage

    • make all

 ./afl-cov/afl-cov -d fuzz_upx/upx_out/ --live --coverage-cmd="./upx/upx_2/src/upx.out  AFL_FILE" --code-dir="./upx/upx_2/src/"
  -d afl-fuzz 的輸出目錄
  --live 實施獲取
 --coverage-cmd  被fuzz文件與AFL_FILE 為生成的例子
 --code-dir= 代碼目錄
  • 在upx_out 目錄下存在cov目錄,cov目錄下存在web,可以使用python啟動web服務器查看。
  • python啟動web服務命令
    • python -m SimpleHTTPServer 80
  • 瀏覽器中訪問
  • 根據上圖所示,更改示例達到更好的fuzz效果。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM