AFL模糊測試學習(一)原始碼插樁

2021-10-04 21:28:12 字數 1573 閱讀 5926

剛接觸模糊測試肯定是要從現在最為流行的afl開始,現在很多關於afl的改進都是針對afl的,而且afl本身因為其遺傳演算法、高吞吐量而得到很好的應用,在一些afl變異版本(如a***o、pfuzz、collafl、enfuzz等)、混合模糊測試(結合模糊測試和符號化執行)在實驗對比中都拿afl當作baseline。我們就一步一步從afl本身學起,對模糊測試進行深入學習吧。

對乙個程式進行模糊測試我們需要做到以下幾點:

1、能夠變異很多的測試樣例,把種子(測試樣例)進行自生產

2、在程式以乙個種子作為輸入後,能夠觀察程式是否會走新的路徑。

這樣一來就可以把能觸發不同執行路徑的種子進行收集,當有種子是程式執行產生錯誤或者延遲的時候進行記錄,就可以利用工具看程式在哪存在問題。

拿到afl原始碼後進行make,make install編譯安裝後就可以用了。make過程中會出現缺少什麼依賴之類的,該安裝就安裝,就可以編譯成功了。為了獲得對乙個程式執行路徑的掌握,需要插樁,有程式原始碼的話用內建的afl-gcc進行原始碼插樁,插樁後就可以進行模糊測試了,命令行為./afl-fuzz -i testcase_dir -o findings_dir /path/to/program @@(@@表示程式執行的時候會把indir裡面的測試樣例當作引數放在命令列中,-i後面是存放測試樣例的資料夾,-o後面是存放輸出結果的資料夾,./後面是插樁過的二進位制程式)。

但是如果只有二進位制程式的話,使用qemu模式進行插樁(速度會慢二到五倍)。在之後會進行講解。

我們先看一下afl-gcc的原始碼,其實afl-gcc就是對gcc的乙個封裝,會在gcc的基礎上呼叫afl-as。

afl-as是對.s檔案進行插樁操作,在其中有跳轉的的位置插入彙編碼,實現在程式跳轉時能夠通過在跳轉處的插樁掌握程式的執行路徑。在函式add_instrumentation()中對輸入的彙編**.s檔案進行操作,下列**將識別跳轉(je,jnz之類)。

if (line[0] == '\t') 

continue;

}

其中r(map_size)為隨機值,修改了rcx中的值,呼叫__afl_maybe_log。我們可以在使用afl-gcc編譯後的二進位制程式反彙編,看到跳轉處有插樁。拿乙個簡單的例子為例

int main(int argc, char *ar**)

把編譯好的檔案反彙編可以看到插入的彙編**:

之前提到過,在跳轉處插入了呼叫random封裝而成的r(map_size)函式生成乙個隨機值存入rcx暫存器,再進入堆疊成為_afl_maybe_log的引數。那麼當afl在選擇輸入種子之後就會執行程式,沒到乙個基本塊就會執行一次_afl_maybe_log,這樣一來,每個基本塊相當於有了自己的id,afl執行了哪些基本塊就會記錄id,從而得到執行路徑。關於afl怎麼記錄基本塊id,怎麼比對不同種子下的執行路徑,我們會在第三節afl的執行中詳細講。

AFL模糊測試學習(二)二進位制插樁

上一節一起學習了使用afl gcc對有原始碼的程式如何插樁,並且插樁的機制,這一節我們來一起學習如何使用qemu對沒有原始碼的二進位制程式進行插樁。首先要執行build qemu support.sh這個指令碼,這個時候如果有沒安裝pixman的錯誤的時候直接用apt安裝即可。apt get ins...

Spring原始碼學習(一)

人對神秘的東西即好奇又恐懼,好奇心使人想一 竟恐懼心又使人望而卻步,工作了那麼久對spring原始碼一直懷有這樣的心態,從來沒有下決心進行研讀,最近感覺壓力在攀公升,使自己不得不戰勝恐懼心,進行更深入的學習,希望自己的學習同樣也能給你小夥伴們帶來一絲靈感。接下來將更加一下小例子來跟讀一下原始碼的實現...

tensorflow 原始碼學習 一

作為主流的機器學習框架,tensorflow的提供的介面變化很多,專案 也比較複雜,為了讓自己使用起來更得心應手,所以覺得還是有必要學習一下原始碼。個人覺得提公升程式設計水平的兩種最好方式,乙個是自己造輪子,再乙個就是閱讀原始碼。1.版本 2.整體專案結構 這並不是tensorflow完整的專案結構...