初中生用easyfuzzer 1.5挖掘WINXP播放器內存破壞漏洞

光刃 (用什么頭像好呢?) | 2014-11-17 13:40

請在看這篇日志之前,先閱讀下面這篇日志

小學生用easyfuzz 1.0 挖掘緩沖區溢出漏洞。

鏈接:http://www.asm64.com/Study001.html

Easyfuzzer 1.4開始支持智能fuzz。

詳細的使用文檔,請瀏覽網站:http://www.asm64.com/readme/readme.mht

這里我只簡單的介紹一下:

到1.5為止,easyfuzzer已經支持4種函數類型。

分別是:

智能fuzz支持的語句簡介:

第一種:

_num,參數1,參數2,參數3,參數4;

如:_num,100,1,0,32;

_num有四個參數:

參數一:是數值, 支持10進制類型(如 100,1234567,),也支持16進制類型(如100H,deaddeadh,)16進制字母大小寫都可以,后面需要加h來和10進制數據加以區分。

參數二:是數據是否可以變異,0為可以變異,1為不可以變異。變異是指以后生成的不同的樣本中該數值都會進行變化。如果該數值設置成1(可以變異),那么對于參數一設置成什么值也就都沒有什么區別了(參數一部進行解析了)

參數三:大小尾。 0表示小尾(小尾表示低位數據存儲在低字節地址上),1表示大尾(大尾表示低位數據存儲在高字節地址上)。

比如12345678H  如果是大尾,在內存中是12345678,如果是小尾,在內存中是78563412,

參數四:數值的大小,目前支持8位,16位,32位3種類型。  也就是1字節,2字節,4字節。

8位: 如AAH   16位 如AABBH  32位 如AABBCCDDH

以下表示都是正確的:

_num,11111111h,1,0,32;

_num,2222h,1,0,16;

_num,ffh,1,0,8;

_num,254,1,0,8;

_num,12345678h,1,0,32;

_num,AABBh,1,1,16;

第二種:

_str,參數1,參數2,參數3 ,參數4, 參數5 ,參數6;  

如:_str,helloworld,1,0,0,32,1;

_str有六個參數:

_str,helloworld,1,0,0,32,1;

參數一:字符串數值。直接填寫數值即可如 helloworld。

參數二:該數值是否變化。0表示變化,1表示不變化。

參數三:字符串的長度,單位為字節。

參數四:字符串類型,0表示STR類型,1表示HEX類型。

如123456,如果是0,輸出后內存中的數據是313233343536,如果是1,輸出后內存的數據是123456.

參數五:前綴的大小。單位是字節數。有效值為0,8,16,32.

前綴用來表示該字符串的長度。如果您不需要該數值,設置成0就可以。

參數六:前綴的格式, 大尾或者小尾。 0表示小尾,1表示大尾。

第三種:

_cal,addr,參數1,參數2,參數3

如: _cal,addr,32,0,3

參數1:表示計算結果的位數。 可選值為 8,16,32   分別表示8位,16位,32位。(即1字節 2字節 4字節)

參數2:結果的大小尾, 0表示小尾,1表示大尾。

參數3:計算目標(函數序列號)  上面例子是3,就是計算第三個函數的偏移地址。

第四種:

_cal,size,參數1,參數2,參數3,參數4

如:_cal,size,32,0,4,6

參數1:表示計算結果的位數。 可選值為 8,16,32   分別表示8位,16位,32位。(即1字節 2字節 4字節)

參數2:結果的大小尾, 0表示小尾,1表示大尾。

參數3:開始函數(函數序列號)

參數4:結束函數(函數序列號)

上面的例子,開始是4,結束是6,就是計算4-6 共3個函數的大小。

注意:開始函數值不應該大于結束函數值

挖掘mid文件格式漏洞

我們的目標是windows xpxp3的媒體播放器

我們這里選擇一款簡單的文件格式。Mid文件格式。

下面是mid文件格式簡介,詳細信息請自行百度。

1.mid文件格式簡介:  

一個MIDI文件基本上由兩個部分組成,頭塊和軌道塊。 具體信息請百度。

2.頭塊:

頭塊出現在文件的開頭,頭塊看起來一直是這樣的:

4D5468640000 0006 ffff nnnn dddd

4D5468640000表示頭塊的標示值

ffff是文件的格式,有3種格式:

nnnn 是MIDI文件中的軌道數。

dddd 是每個4分音符節奏數

3.軌道塊:

4D54726B xxxxxxxx aaaaaaaaaaaaaaaa

4D54726B 表示軌道塊的表示值

aaaaaaaa表示軌道塊

xxxxxxxx表示軌道塊的大小

我認為:除了頭塊和軌道塊的標示值以外,所有的結構都應該作為fuzz的結構,當然您可以有自己的思路。

下面是我根據我對mid文件結構的了解,編寫的一段代碼:

_str,MThd,1,6,0,0,0;

_cal,size,16,1,1,1;

_num,ffffh,0,0,16;  

_num,ffffh,0,0,16;

_num,ffffh,0,0,16;

_str,MTrk,1,4,0,0,0;

_cal,size,16,1,8,8;

_str,fffffffffffffffffff,0,0,0,0,0;

第一行代碼:頭信息為MThd,長度為6的字符串類型

第二行代碼:第一行代碼解析字符串的長度,要求大尾形式。并且大小是16位

第三行代碼:一個16位的數據,數據需要fuzz。

該數值為變異數值,所以第一個參數(FFFFH)是不解析的,些什么都一樣

第四行和第五行類似于第三行

第六行類似與第一行

第七行:取第八行代碼生成數據的大小,

第八行:字符串類型,需要變異。表示軌道塊。

1.png

2.png

輸入我們的代碼,輸入后綴名,點擊確定來生成畸形樣本。

幾秒鐘的時間,我們已經生成了1萬多個畸形樣本,下面就需要對這些畸形樣本進行fuzz測試了。

(如果你再此之前從來沒有用過windows播放器,請先配置一下 否則不能成功挖掘漏洞)

這里修改一下配置信息。

在我的機器上,播放器處理一個樣本大約需要2秒,所以我設置成每一個樣本運行2秒。(數值設置太小會導致不能成功fuzz)

由于該播放器特殊性,不能進行多線程運行,所以開啟速率應該比運行時間略大,我這里設置成2.2秒

3.png

設置完畢后記得點擊確定。

由于我們是靠代碼生成的樣本,因此就不需要模板文件了,如下圖。然后點擊FUZZING按鈕

4.png

為了觀察方便,您可以吧總在最前面按鈕選上。當然你完全可以不選。

下面就是fuzz測試過程了,這個過程時間較長,您可以去喝一杯咖啡。不過我更喜歡喝蘋果汁。

按照我的選項,完全測試完畢需要6個小時,當然你可以多開幾個虛擬機用分布式挖掘。在一個i7 pc級cpu中,完全可以開6個虛擬機(需要較大的內存)這樣一個小時就足夠了。

由于時間原因,我這里提前結束了fuzz。

好消息是,我已經找到畸形樣本了。

5.png

這時候我們去看看日志目錄。目錄在哪里呢?在選項菜單里面。

6.png

日志顯示,因為除以0導致了崩潰。 我們下面手動測試下。

找到00000000.mid 和00000043.mid樣本。

7.png

8.png

有關該漏洞的詳細信息,您可以訪問

WooYun: Windows xp sp3   mspaint.exe拒絕服務漏洞

1.5測試版下載地址:

http://www.asm64.com/Soft/EasyFuzzer1.5BETA.zip

該版本bug很多,如果你不能容忍,請等待到本周四下載easyfuzzer 1.5正式版