1. 程式人生 > >天融信AlphaFuzzer測試工具 使用教程

天融信AlphaFuzzer測試工具 使用教程

原文:http://blog.topsec.com.cn/ad_lab/alphafuzzer/

更新記錄:

2015年7月30日  1.2

2015年7月23日  1.1

2015年7月13日  1.0

軟體簡介:

AlphaFuzzer是一款多功能的漏洞挖掘工具,到現在為止,該程式以檔案格式為主。
1.0版本主要包含了:一個智慧檔案格式的漏洞挖掘框架。一個通用檔案格式的fuzz模組。此外,他還包含了一個ftp伺服器程式的fuzz模組。一個程式引數的fuzz模組。一些shellcode處理的小工具。

FileFuzz模組

功能簡介:

FileFuzz模組即檔案格式通用Fuzz模組。該模組可簡單快速對檔案格式處理類程式進行Fuzz。這類程式很多,包括各種播放器,閱讀器,圖片文件處理工具等等。首先,介紹一下程式簡單功能。

AlphaFuzzer1

程式工作流程:

程式通過使用者傳給一個標準的樣本檔案,通過樣本生成引擎對樣本進行畸形變異。變異成大量畸形樣本後再依次傳給宿主程式來執行。執行時候監控程式執行狀態,一旦程式執行發生異常我們就吧該樣本和異常的簡要資訊放在我們的日誌中,從而方便研究人員的後續研究與分析。下面解釋一下各功能的細節。

樣本檔案:

既新增樣本檔案所在的路徑,通過右面的“選擇”按鈕進行新增。

生成檔案路徑:

選擇樣本的生成檔案路徑,手動新增。注意所選磁碟空間的大小。

宿主程式:

要處理樣本程式的所在路徑,通過右面的“選擇”按鈕進行新增。右面的小編輯框內填寫執行時候的引數(大部分情況下空著即可)。

異常日誌路徑:

存放異常日誌以及異常檔案的路徑。

生成樣本:

配置好後點擊它即可生成樣本。

引擎1:

對區域性進行深入Fuzz的引擎,需要給一定的範圍。該引擎一般用來處理檔案頭的某結構。範圍不宜太大,否則會浪費很多時間。該引擎要求樣本大小為16B-4MB.

引擎2:

對檔案的整體部分進行Fuzz的引擎。這裡有2個選項,一個是細度,一個是深度。
細度有3個按鈕,分別是x2,x4,x16。通過多選可以滿足1倍到128倍的選擇。深度有3個按鈕,分別是快速,高效,完美。不可以多選。完美效果最好,但是需要大量的時間,快速所需時間最少。通過選擇我們可以把生成樣本數量大致定位到500個到250萬個區間。
該引擎要求樣本大小為512B-4MB。

執行時間:

每一個樣本開啟後的執行時間,如果樣本在這個時間內沒有發現異常。那麼樣本將會被強迫關閉。

開啟速率:

程式的開啟速率。就是說程式每次經過這麼多時間開啟一個新樣本。如果要程式單執行緒允許,開啟速率=允許時間即可。但是由於現在的cpu都是多核心多執行緒的,所以在程式允許多執行緒的情況下,單執行緒執行是一種很浪費能源和浪費時間的工作,通過這個功能我們可以多執行緒執行,提高工作效率。

Fuzz完畢後關機

工作完成後自動關機,節省能源。

刪除非異常樣本:

對沒有問題的樣本及時刪除。

開啟自定義樣本功能:

通過這個功能我們可以讓我們的程式處理別的程式生成的樣本,也可以處理我們程式上次未處理完畢的樣本,也可以用於多臺pc機同時處理樣本。

忽略以下異常:

忽略我們不關注的異常。

過濾以下暫存器異常:

程式在執行時候由於設計問題會報一些異常,對於一些異常我們對他並沒有興趣,可以選擇忽略,從而關注我們有興趣的異常。

總在最前面:

選擇後程序就在最前面了,方便隨時對程式進行操作。(尤其適用於高速多執行緒Fuzz)。

FTPFuzz模組

功能簡介:

針對FTP伺服器程式開發的一款Fuzz工具。可以簡單方便快速的對FTP伺服器進行Fuzz測試。

演示例子:

1首先,安裝這個FTP伺服器,配置好了並開啟。

AlphaFuzzer8

2 開啟我們的Fuzzer,並設定。 配置好了點選開始挖掘漏洞

AlphaFuzzer9

很快,程式就崩潰了。

AlphaFuzzer10

程式退出後,FuzzER顯示出了讓程式崩潰的poc指令。

AlphaFuzzer11

AgruFuzz模組

針對執行引數進行模糊測試的模組。選好程式路徑和日誌路徑,即可對程式的執行引數進行模糊測試了。

AlphaFuzzer12

智慧Fuzz模組

程式碼規範:

函式類似於c語言的樣子,每一個引數間用逗號相隔,函式末尾用分號表示。如果為空,則表示為0。一共支援4096行程式碼,每一行程式碼最長支援4096位元組。字串支援最長128位元組。如果你要自行編輯程式碼,強烈建議使用一種可用於顯示程式碼行數的編輯器。如010editor。並且要多添加註釋資訊。

AlphaFuzzer13

函式定義:

_num:

用於表示一個數值,共有四個引數。 如_num,888,0,0,32;
引數1:表示這個數值的數。比如例子裡面表示888.
引數2:表示該數值是否可變,0為不可變,1為可變。如果是可變,那麼引數1則不進行解析。
引數3:表示大小尾。0表示小尾,1表示大尾。(小尾指低位資料存放在低位地址上,大尾則表示低位資料存放在高位地址上)。
引數4:數值的大小,支援8位,16位,32位3種類型。也就是1位元組,2位元組,4位元組。

表示形式:

_num,1234567,0,0,32;  表示一個小尾,4位元組的數值,值為1234567.
_num,1234567,,,32;  同上
_num,,1,,16; 表示一個2位元組的可變數值。

_str:

用於表示一個字串,共有3個引數。如_str,hello,1,0;
引數1:字串數值。直接填寫字串即可。
引數2:字串是否可變,0為不可以變化,1為長度不變,內容會變化,2為長度內容都會變化。
引數3:字串的長度,如果是0,則是輸入字串的實際長度。
引數4:字串字首,字首用來表示字串的長度。如果不需要字首,設定為0.如果需要字首,可以設定成8,16,32.分別表示字首大小為1,2,4位元組。
引數5:字首的大小尾。0表示小尾,1表示大尾。

_cal,addr:

用於計算一些資料的偏移。共有3個引數。如_cal,addr,32,0,3;
引數1:表示計算結果的位數,可選值為8,16,32.分別表示1,2,4位元組。
引數2:表示計算結果的大小尾。0為小尾,1為大尾。
引數3:要計算的目標的函式序列號。上面的引數3是3,代表計算第三個函式的偏移。

_cal,size:

用於計算一些資料的大小,共有4個引數,如_cal,size,32,0,4,6;
引數1:表示計算結果的位數,可選值為8,16,32。分別代表1,2,4位元組。
引數2:表示計算結果的大小尾,0為小尾,1為大尾。
引數3:要計算的開始函式(函式序列號)
引數4:要計算的結束函式(函式序列號)

如上面的例子,開始是4,結束為6,則表示計算函式序列號為4 5 6 三條指令生成資料的總大小。

_cal,f+:

用於對_num型別輸出的資料作計算。共有4個引數。 如_cal,f+,32,0,3,5;
引數1:計算結果的大小,分別為6,16,32.分別表示計算結果是1,2,4位元組。
引數2:計算結果的大小尾,0表示小尾,1表示大尾。
引數3:用於計算的第一個函式的引數ID。
引數4:用於計算的第二個函式的引數ID。

該函式所表示的值=第三個函式的數值+第四個函式的數值。

該類函式共用5種,分別為

_cal,f+ 結果=引數3指向函式數值+引數4指向函式數值
_cal,f-   結果=引數3指向函式數值-引數4指向函式數值
_cal,f*   結果=引數3指向函式數值*引數4指向函式數值
_cal,f/   結果=引數3指向函式數值/引數4指向函式數值
_cal,f%   結果=引數3指向函式數值%引數4指向函式數值

_cal,n+:

用於計算一些資料的大小,共有4個引數,
如_cal,n+,32,0,3,200。

引數1:計算結果的大小,分別為6,16,32.分別表示計算結果是1,2,4位元組。
引數2:計算結果的大小尾,0表示小尾,1表示大尾。
引數3:用於計算的第一個函式的引數ID。
引數4:用於計算的第二個引數,該數是數值。
該函式所表示的值=第三個函式的數值+第四個引數值200.

該類函式共用5種,分別為

_cal,n+ 結果=引數3指向函式數值+引數4
_cal,n-   結果=引數3指向函式數值-引數4
_cal,n*   結果=引數3指向函式數值*引數4
_cal,n/   結果=引數3指向函式數值/引數4
_cal,n%   結果=引數3指向函式數值%引數4

_cal,-n:

用於計算一些資料的大小,共有4個引數,如_cal,0-n,32,0,200,3。

引數1:計算結果的大小,分別為6,16,32.分別表示計算結果是1,2,4位元組。
引數2:計算結果的大小尾,0表示小尾,1表示大尾。
引數3:用於計算的第一個引數,該數是數值。
引數4:用於計算的第二個函式的引數ID。
該函式所表示的值=第三個引數200-第四個函式的值.

該類函式共用3種,分別為

_cal,-n 結果=引數3-引數4指向函式數值
_cal,/n   結果=引數3/引數4指向函式數值
_cal,&n  結果=引數3%引數4指向函式數值

 _copy:

用於對一段指令生成的資料進行復制,該函式公用三個引數 如_copy,1,3,100;
引數1 要複製的開始ID值。
引數2,要複製的結束ID值。
引數3,要複製的份數。
如上面指令 表示要把1-3條指令的資料,複製100次。

該函式要求:如果引數3為0,則表示0-100的隨機數。

註釋資訊:

用於表示註釋程式碼的資訊。用[<>]來表示。填寫在每一條函式的末尾(不得填寫在最後一條函式的末尾)。

_crc32:

用於計算一段資料的CRC32值,資料可以為num型別 也可以為長度不會變化的STR型別。
該函式一共有3個引數 如_crc32,1,2,5;
引數1:大小尾  0表示大尾,1表示小尾。
引數2:資料開始的ID
引數3:資料結束的ID
如上面指令表示第二條資料到第五條資料的CRC32值。佔用空間4位元組。

_crc16:

用於計算一段資料的CRC16值,用法和_CRC32一樣,只是佔用空間為2位元組。

_hex:

用於定義一段HEX數值,最多64位元組。一個引數。 如_hex,004010cc;

_choice:

選擇語句,用來對一段指令序列隨機選擇。該函式一共有2個引數,如_choice,3,5;
表示在3-5條語句中隨機選擇一條語句作為輸出。
可用於指向語句的型別有:

_num
_str
_hex

_DelToEnd:

刪除語句,可以根據情況來選擇是否刪除該指令後續的全部程式碼。
該函式有1個引數,如_DelToEnd,1;
如果該引數為0,表示無條件刪除後面的指令。
如果該引數非0,則表示引數語句的ID,如果指向ID引數語句值為0.則刪除_DelToEnd語句後面的全部語句,否則不刪除。

可用於指向語句的型別有:
_CountOfCopy
_num
cal,addr
cal,size
_cal,f+
_cal,n+
_cal,n-

注意:

1不要用於指向無值意義的指令,如_str型別。
2 被刪除的語句參與計算,但是不參與輸出。所以請小心使用該語句。
3 該語句可用於刪除最後幾條用於計算的零時語句。

_when:

有條件選擇語句,該語句一共有5個引數。如_when,32,0,3,4,5;
引數1:計算結果的大小,分別為6,16,32.分別表示計算結果是1,2,4位元組。
引數2:大小尾。0大尾1為小尾。
引數3:判斷語句的ID。如果該ID值為0,則輸出引數4.否則輸出引數5.
引數4:語句ID
引數5:語句ID

例子表示判斷第三條指令的值是否為0.如果為0輸出引數4的值,否則輸出引數5個值。輸出結果為4位元組,大尾格式。

程式碼編寫:

例1 :MIDI格式

瞭解MIDI檔案格式:

下面用來編寫一個mid的檔案格式的指令碼。
mid檔案格式簡介:
一個MIDI檔案基本上由2部分組成,頭塊和軌道塊。

頭塊:
頭塊出現在檔案的開頭,頭塊看起來一般是這樣的:
4D5468640000 0006 FFFF NNNN DDDD
4D5468640000 表示頭塊的表示值
FFFF是檔案格式,有三種格式。
NNNN是MIDI檔案中的軌道數。
DDDD是每個四分音符節奏數

軌道塊:

4D54726B XXXXXXXX AAAAAAAAAAAAAAAAAAAAAAA
4D54726B 表示軌道塊的標識值
AAAAAAAAAAAAAAAAAAAAAA表示軌道塊
XXXXXXXX 表示軌道快的大小。

對檔案格式建模,編寫解析程式碼 下面是我編寫的解析程式碼

_str,MThd,,6,,;[<頭資訊為MThd,長度為6的字串型別>]
_cal,size,16,1,1,1;[<第一行程式碼解析字串的長度,大尾,16位>]
_num,,1,,16;[<一個16位的可變資料>]
_num,,1,,16;[<如上>]
_num,,1,,16;[<如上>]
_str,MTrk,,4,,;[<類似第一行>]
_cal,size,16,1,8,8;[<取締把行程式碼生成資料的大小>]
_str,,1,,,;

根據我們的指令碼進行漏洞挖掘

編寫指令碼後點擊確定,如果指令碼沒有錯誤,系統則會根據指令碼來生成畸形樣本。

AlphaFuzzer14

生成完畢後,我們進行通用Fuzz模組來進行漏洞挖掘。

因為漏洞挖掘模組寫在了通用Fuzz模組裡面。智慧Fuzz模組只是一個生成畸形樣本的模組。

AlphaFuzzer15

如果你在此之前從來沒有用過windows播放器,請先配置一下,才可以正常挖掘漏洞.Windows播放器是不支援多執行緒執行的,因此,您需要把開啟速率這個值設定比允許時間稍微大一些。然後,程式就開始Fuzz了。這需要大量的時間。

AlphaFuzzer16

時間問題,我們提前結束了Fuzz。此時程式已經將會出現異常的樣本和日誌儲存起來。

如圖:AlphaFuzzer18

我們隨便點選一個樣本做測試,發現程式崩潰可以成功復現。

AlphaFuzzer19

例2:BMP格式

和midi格式相比,BMP格式較為複雜,具體檔案格式請自行學習,下面是一段BMP格式的解析指令碼:

_str,BM,,,,;
_cal,size,32,,1,20;[<all size>]
_num,,1,,32;
_cal,addr,32,,18;
_cal,size,32,,1,4;
_num,8,,,32;[<x>]
_num,8,,,32;[<y>]
_num,,1,,16;
_num,,1,,16;
_num,,1,,32;
_cal,size,32,,18,20;
_num,,1,,32;
_num,,1,,32;
_num,,1,,32;
_num,,1,,32;
_num,,1,,32;
_copy,16,16,31;
_num,,1,,16;[<18>]
_str,,1,2,,;[<19>]
_copy,18,19,63;

該段指令碼一共有20行。

第1-4行為一個結構,我們定義為結構A
第18-20行表示一個結構。我們定義為結構B
第1行為一段固定的字串,BM。
第2行表示檔案的總大小。
第4行則表示結構B的偏移
第5行可以表示該結構的偏移,也就是結構A的大小
第11行表示結構B的大小.

AlphaFuzzer20

常見錯誤:

1 第xx行程式碼錯誤(最後一行)
檢查最後是否多了空格,回車符等符號。
檢查程式碼最後是否有註釋資訊。
1 第xx行程式碼錯誤(非最後一行)
檢查引數個數是否匹配。
檢查每一個引數是否在有效值內。
檢查引數的長度是否過長。

漏洞分析模組

Shellcode工具

ShellcodeToBin模組

AlphaFuzzer21

到1.0為止Shellcode支援hex,c,python3種類型。
該模組可用於對shellcode的編輯處理。

ShellcodeToExe模組

AlphaFuzzer22

該模組可用於對shellcode的除錯。

BinToShellcode模組

AlphaFuzzer23

該模組可用於對shellcode的編輯。格式處理。