PP点点通畸形文件溢出漏洞0Day
生活随笔
收集整理的這篇文章主要介紹了
PP点点通畸形文件溢出漏洞0Day
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
也許你用過(guò)或者正在用著PP點(diǎn)點(diǎn)通這款軟件,因?yàn)槠涑錾幕诰W(wǎng)絡(luò)的服務(wù)功能,使得它在現(xiàn)在的網(wǎng)絡(luò)軟件中占據(jù)了很大的市場(chǎng)。我也是它的一個(gè)忠實(shí)用戶(hù),可就在幾天前,我的朋友說(shuō)他發(fā)現(xiàn)PP點(diǎn)點(diǎn)通這款軟件有漏洞,而具體的細(xì)節(jié)他沒(méi)有給我說(shuō),雖然只是簡(jiǎn)單的一句話,可是因?yàn)樽约簩?duì)這樣的信息比較感興趣,于是我就自己尋找出現(xiàn)漏洞的地方,所謂自力更生才是正道嘛。我拿出自己編寫(xiě)的一套測(cè)試軟件,在腦力與程序的配合下,終于發(fā)現(xiàn)了出現(xiàn)漏洞的地方,其實(shí)要成功觸發(fā)這個(gè)漏洞并不難,可難就難在找到利用的突破口上了,欲知詳情請(qǐng)聽(tīng)下面分解。
? ?? ???漏洞出現(xiàn)的地方是在對(duì)本地一個(gè)文件的修改上,這個(gè)文件名為“Config.ini”,顧名思義是一個(gè)配置文件。很多程序在初始化的時(shí)候都是要么從配置文件獲取初始信息,要么從注冊(cè)表獲取信息等等,這一點(diǎn)對(duì)于安全測(cè)試員來(lái)說(shuō)很關(guān)鍵。文件“Config.ini”中有很多可以測(cè)試的字段,我這里首先選擇了“DownloadPath=”,因?yàn)檫@是一個(gè)可以被人明顯注意的地方,一般在程序安裝后,它的默認(rèn)值是“C:\Program Files\PP31\Downloads”。我們知道,Windows默認(rèn)的文件夾、文件完整路徑不超過(guò)255個(gè)字節(jié),而在VC6中有個(gè)宏定義標(biāo)記這個(gè)值為260,而PP點(diǎn)點(diǎn)通恰巧是用VC6編寫(xiě)的,這里我們就不得不考慮是不是會(huì)出現(xiàn)什么問(wèn)題了。利用我的測(cè)試軟件,在測(cè)試中果真發(fā)現(xiàn)PP點(diǎn)點(diǎn)通初始化讀取了這個(gè)文件,并且傳遞了“DownloadPath=”參數(shù),一旦我們修改了這個(gè)默認(rèn)的數(shù)值,PP點(diǎn)點(diǎn)通將會(huì)自動(dòng)新建一個(gè)同名的文件夾作為下載文件夾,那么這就勢(shì)必會(huì)引起對(duì)“DownloadPath=”參數(shù)長(zhǎng)度的限制。很可惜,PP點(diǎn)點(diǎn)通根本沒(méi)有注意到這個(gè),一旦我們將這個(gè)參數(shù)的值改到超過(guò)260個(gè)字節(jié)時(shí),你就會(huì)發(fā)現(xiàn)程序出錯(cuò)了,如圖1所示。
? ?? ?? ? 下載 (41.12 KB)
3?小時(shí)前
? ?? ???圖1
現(xiàn)在看起來(lái),漏洞果真是存在的了。你一定開(kāi)始急得想調(diào)試漏洞,尋找跳轉(zhuǎn)地址,然后放上ShellCode去執(zhí)行了。且慢,如果你現(xiàn)在調(diào)試就會(huì)發(fā)現(xiàn),此時(shí)程序的執(zhí)行已經(jīng)不是簡(jiǎn)單的返回地址被覆蓋了,你沒(méi)發(fā)現(xiàn)上面的報(bào)錯(cuò)內(nèi)容跟以往的不一樣嗎?程序出現(xiàn)棧溢出的地方早已執(zhí)行過(guò)去了,現(xiàn)在出現(xiàn)的錯(cuò)誤只是前面棧溢出引發(fā)的另一個(gè)錯(cuò)誤而已,傳統(tǒng)的溢出利用這里完全不奏效。怎么辦?別急,有兩個(gè)辦法可以幫助我們解決問(wèn)題。第一個(gè)是找到溢出的地方,看能不能引出返回地址被覆蓋的傳統(tǒng)溢出現(xiàn)象,我測(cè)試了這個(gè)辦法,答案是不能。那么就用第二個(gè)辦法,就是所謂“將錯(cuò)就錯(cuò)”,既然這個(gè)是引發(fā)溢出后的另一個(gè)錯(cuò)誤,那么就試圖把它弄成一個(gè)能被我們利用的錯(cuò)誤。還記得我們?cè)趥鹘y(tǒng)溢出中為了執(zhí)行ShellCode的辦法嗎?一個(gè)是利用系統(tǒng)DLL中的jmp xxx(寄存器)或者call xxx(寄存器)的方法,一個(gè)是覆蓋SHE。我們現(xiàn)在既然要?jiǎng)?chuàng)建一個(gè)能被我們利用的錯(cuò)誤,那么也就是尋找上述的兩個(gè)辦法來(lái)執(zhí)行ShellCode,要么我們弄出一個(gè)錯(cuò)誤,讓程序出現(xiàn)jmp xxx或者call xxx出錯(cuò),要么就去覆蓋SHE。這里覆蓋SHE不行,那么就只剩第一個(gè)辦法了。經(jīng)過(guò)我仔細(xì)的反匯編分析,用了將近一天的時(shí)間,終于成功的讓PP點(diǎn)點(diǎn)通程序出現(xiàn)了讓我們興奮的call指令錯(cuò)誤,如圖2所示。
圖2
看到了嗎?圖中黑色的那一行,“call dword ptr[eax+5c]”指令出錯(cuò),而這里的eax是我們能夠控制的指令,勝利的天平已經(jīng)向我們傾斜了??墒巧缘?#xff0c;這里的“call dword ptr[eax+5c]”指令是一個(gè)間接尋址指令,也就是說(shuō)我們必須使得[eax+5c]的值成為一個(gè)指向我們ShellCode的指針數(shù)值,而此時(shí)只有ecx和edi寄存器指向我們可以利用的ShellCode,如圖3所示。
下載 (72.14 KB)
3?小時(shí)前
圖3
所以我們要么能讓“[eax+5c]=edi”或者“[eax+5c]=ecx”,要么就是讓[eax+5c]指向的地方是一個(gè)跳轉(zhuǎn)語(yǔ)句或者call語(yǔ)句,類(lèi)似“call edi”或者“jmp ecx”,讓其變成間接的間接尋址,最終還是會(huì)跑到我們的ShellCode中去就行。說(shuō)到這里我提出一個(gè)面對(duì)這種情況下,如何執(zhí)行ShellCode的方法,因?yàn)檫@不是傳統(tǒng)的“jmp esp”,esp直接就指向ShellCode,這里的情況是我們得間接執(zhí)行ShellCode。按照上面的兩個(gè)方法,我們?yōu)榱藢ふ摇癧eax+5c]=edi”,可以在系統(tǒng)的動(dòng)態(tài)庫(kù)文件中,尋找一些指令,由這些指令組成一個(gè)等于edi值的連續(xù)地址。假設(shè)在user32中,某地址處的指令為“mov eax,ebx pop eax pop ebx ret”,那么它在內(nèi)存中的顯示就是“8B C3 58 5B C3”,而且我們需要的edi值就是“0x5B58C38B”,這個(gè)地址指向我們的ShellCode,那么我們只需要將eax的值賦值為上面user32[某地址-5c]即可,因?yàn)檫@樣“call dword ptr[eax+5c]”獲取的就是我們ShellCode的執(zhí)行權(quán)。同樣道理,我們也可以找一個(gè)“call edi”的指令地址,在系統(tǒng)DLL庫(kù)中找指令組合,然后獲得地址,修改我們的跳轉(zhuǎn)指令。大家仔細(xì)看看圖4和圖5的示意圖就會(huì)明白了。
下載 (18.49 KB)
3?小時(shí)前
圖4
圖5
其實(shí)這里最穩(wěn)定的還是圖5的使用方法,因?yàn)槿绻闶褂脠D4的方法,所獲得的ShellCode地址是相對(duì)穩(wěn)定的,一旦電腦重新啟動(dòng)或者因?yàn)槟承┰?#xff0c;例如堆的參與,很容易造成地址變化,而使用寄存器間接尋址則會(huì)保持穩(wěn)定,因?yàn)榧拇嫫鞯闹凳冀K指向我們的ShellCode地址。在接下來(lái)的時(shí)間里,我們就是尋找這樣的符合我們要求的地址。你可以選擇手工,也可以選擇編個(gè)程序自動(dòng)尋找,總之有了思路,一切皆有可能,最后,我們只需要放上一個(gè)符合格式的ShellCode即可。什么叫符合格式的ShellCode?還記得我們這里測(cè)試的參數(shù)嗎?是一個(gè)路徑值參數(shù)“DownloadPath”,既然是路徑值,那么就不要在其中出現(xiàn)一些特殊符號(hào)啦,不然Windows會(huì)報(bào)警的,這也會(huì)影響我們的ShellCode執(zhí)行。假設(shè)你要尋找符合這樣要求的ShellCode,你可以參考我以前在黑防上發(fā)表的那篇關(guān)于騰訊安全控件漏洞的文章,那里的ShellCode是符合要求的。
現(xiàn)在為了證明我的理論的正確性,我暫時(shí)把ShellCode換成一個(gè)執(zhí)行死循環(huán)的代碼,從偽指令角度來(lái)說(shuō)就是:“l(fā)oop 1=1”,匯編代碼是“EB FE”,這樣一旦我們的這個(gè)ShellCode執(zhí)行了,那么電腦就會(huì)忙得不可開(kāi)交了。現(xiàn)在我們無(wú)非是要找到符合要求的那種所謂的間接再間接尋址指令的地址,我這里尋找的是一個(gè)找尋指向call(寄存器)或者jmp(寄存器)指令的地址,并且我為了保證這個(gè)地址能是一個(gè)比較穩(wěn)定的地址,把尋找的目標(biāo)放到了系統(tǒng)的動(dòng)態(tài)庫(kù)里面,當(dāng)然你也可以尋找別的文件里的,只是一旦環(huán)境稍變化,恐怕你的地址就會(huì)成為錯(cuò)誤的。手工尋找太累了,自己編寫(xiě)一個(gè)程序自動(dòng)查找最好,其實(shí)這個(gè)很好編寫(xiě),就是按照將地址加一,然后取出這個(gè)地址,利用這個(gè)地址找到所指處的十六進(jìn)制代碼是否是“FF D1”“FF D7”“FF E1”“FF E7”,這幾個(gè)代碼其實(shí)就是call ecx、call edi、jmp ecx和jmp edi這些指令的十六進(jìn)制表示,只要我們找到其中的任意一個(gè),我們都是可以利用來(lái)執(zhí)行我們的ShellCode的,因?yàn)閑di和ecx寄存器都指向了我們的ShellCode。經(jīng)過(guò)大約一分鐘的查找,真是太幸運(yùn)了,我們找到了四個(gè)地址,可正如同我說(shuō)的那樣,為了穩(wěn)定最好選擇使用系統(tǒng)動(dòng)態(tài)庫(kù)的地址,這樣我們把目標(biāo)所在了“204D3DE1”,這個(gè)地址其實(shí)是在Windows XP SP2的一個(gè)專(zhuān)門(mén)的動(dòng)態(tài)庫(kù)文件“xpsp2res.dll”中的,不論怎樣這都非常符合我們的要求。現(xiàn)在趕緊修改我們的過(guò)長(zhǎng)字符串,將其中控制eax寄存器值的那個(gè)字符串值改為“204D3D85”,注意這里,這個(gè)值可不直接就是我們剛才找到的那個(gè)地址,還記得前面出錯(cuò)的那個(gè)call指令嗎?因?yàn)槌鲥e(cuò)時(shí),利用的是[eax+5c],所以我們找到的地址一定要減去5c才行,這樣PP點(diǎn)點(diǎn)通出錯(cuò)時(shí)會(huì)自動(dòng)幫我們恢復(fù)成真正要利用的地址。修改好跳轉(zhuǎn)地址后,再修改我們的ShellCode,把我們的死循環(huán)這個(gè)ShellCode放到離跳轉(zhuǎn)地址大約100個(gè)字節(jié)以后,因?yàn)閑di指向的地址比較靠超常字符串的后面,太前了出錯(cuò)時(shí)會(huì)執(zhí)行不到那里。還需要說(shuō)的就是,正因?yàn)閑di指向的地址比較靠后,這樣留給我們放ShellCode的位置就不是很充裕了,如果你要放一個(gè)比較長(zhǎng)的ShellCode,建議你使用先放小ShellCode,此Code的主要目的是跳轉(zhuǎn)后遍歷查詢(xún)大ShellCode,而大ShellCode就可以直接放到控制eax覆蓋的跳轉(zhuǎn)字符串的前面任意位置,那里可以放很長(zhǎng)的字符串,估計(jì)完全夠用。一切就緒后,我們用這個(gè)精心構(gòu)造好的字符串賦值給“config.ini”文件中的“DownloadPath”參數(shù),打開(kāi)PP點(diǎn)點(diǎn)通,然后選擇“退出系統(tǒng)”,你會(huì)發(fā)現(xiàn)你的電腦一下子忙到了100%!我為了更加清楚的反映程序出錯(cuò)時(shí)的狀態(tài),給大家截圖如下,先看第一幅,如圖6所示。程序出錯(cuò)了,還是出錯(cuò)在call指令上,而此時(shí)eax成功被我們控制進(jìn)入xpsp2res.dll中。再看圖7,看到了嗎?我們成功控制程序流程進(jìn)入了call edi指令,注意下方的顯示,此時(shí)edi就指向了我們的簡(jiǎn)單ShellCode。一旦程序進(jìn)入了我們的ShellCode,電腦就會(huì)進(jìn)入一個(gè)死循環(huán),圖8中的任務(wù)管理器真實(shí)的反應(yīng)了這一點(diǎn)。
? ?? ?? ? 下載 (57.71 KB)
3?小時(shí)前
? ?? ???圖6
圖7
下載 (25.31 KB)
3?小時(shí)前
圖8
到這里,表明我們的一切分析確實(shí)都是正確的,只是有時(shí)利用會(huì)出現(xiàn)一定的干擾,這個(gè)大家可以自己研究一下,這里我就不再分析了?,F(xiàn)在大功告成,我們收工了。最后,我提供給大家一個(gè)POC,因?yàn)槊總€(gè)版本的Windows環(huán)境下利用的跳轉(zhuǎn)地址不太一樣,我就偷懶不挨個(gè)測(cè)試了,我直接給出觸發(fā)到call指令的畸形文件,依據(jù)我上面的思路,自己修改練練手,也許你會(huì)有新的發(fā)現(xiàn)的。
? ?? ???漏洞出現(xiàn)的地方是在對(duì)本地一個(gè)文件的修改上,這個(gè)文件名為“Config.ini”,顧名思義是一個(gè)配置文件。很多程序在初始化的時(shí)候都是要么從配置文件獲取初始信息,要么從注冊(cè)表獲取信息等等,這一點(diǎn)對(duì)于安全測(cè)試員來(lái)說(shuō)很關(guān)鍵。文件“Config.ini”中有很多可以測(cè)試的字段,我這里首先選擇了“DownloadPath=”,因?yàn)檫@是一個(gè)可以被人明顯注意的地方,一般在程序安裝后,它的默認(rèn)值是“C:\Program Files\PP31\Downloads”。我們知道,Windows默認(rèn)的文件夾、文件完整路徑不超過(guò)255個(gè)字節(jié),而在VC6中有個(gè)宏定義標(biāo)記這個(gè)值為260,而PP點(diǎn)點(diǎn)通恰巧是用VC6編寫(xiě)的,這里我們就不得不考慮是不是會(huì)出現(xiàn)什么問(wèn)題了。利用我的測(cè)試軟件,在測(cè)試中果真發(fā)現(xiàn)PP點(diǎn)點(diǎn)通初始化讀取了這個(gè)文件,并且傳遞了“DownloadPath=”參數(shù),一旦我們修改了這個(gè)默認(rèn)的數(shù)值,PP點(diǎn)點(diǎn)通將會(huì)自動(dòng)新建一個(gè)同名的文件夾作為下載文件夾,那么這就勢(shì)必會(huì)引起對(duì)“DownloadPath=”參數(shù)長(zhǎng)度的限制。很可惜,PP點(diǎn)點(diǎn)通根本沒(méi)有注意到這個(gè),一旦我們將這個(gè)參數(shù)的值改到超過(guò)260個(gè)字節(jié)時(shí),你就會(huì)發(fā)現(xiàn)程序出錯(cuò)了,如圖1所示。
? ?? ?? ? 下載 (41.12 KB)
3?小時(shí)前
? ?? ???圖1
現(xiàn)在看起來(lái),漏洞果真是存在的了。你一定開(kāi)始急得想調(diào)試漏洞,尋找跳轉(zhuǎn)地址,然后放上ShellCode去執(zhí)行了。且慢,如果你現(xiàn)在調(diào)試就會(huì)發(fā)現(xiàn),此時(shí)程序的執(zhí)行已經(jīng)不是簡(jiǎn)單的返回地址被覆蓋了,你沒(méi)發(fā)現(xiàn)上面的報(bào)錯(cuò)內(nèi)容跟以往的不一樣嗎?程序出現(xiàn)棧溢出的地方早已執(zhí)行過(guò)去了,現(xiàn)在出現(xiàn)的錯(cuò)誤只是前面棧溢出引發(fā)的另一個(gè)錯(cuò)誤而已,傳統(tǒng)的溢出利用這里完全不奏效。怎么辦?別急,有兩個(gè)辦法可以幫助我們解決問(wèn)題。第一個(gè)是找到溢出的地方,看能不能引出返回地址被覆蓋的傳統(tǒng)溢出現(xiàn)象,我測(cè)試了這個(gè)辦法,答案是不能。那么就用第二個(gè)辦法,就是所謂“將錯(cuò)就錯(cuò)”,既然這個(gè)是引發(fā)溢出后的另一個(gè)錯(cuò)誤,那么就試圖把它弄成一個(gè)能被我們利用的錯(cuò)誤。還記得我們?cè)趥鹘y(tǒng)溢出中為了執(zhí)行ShellCode的辦法嗎?一個(gè)是利用系統(tǒng)DLL中的jmp xxx(寄存器)或者call xxx(寄存器)的方法,一個(gè)是覆蓋SHE。我們現(xiàn)在既然要?jiǎng)?chuàng)建一個(gè)能被我們利用的錯(cuò)誤,那么也就是尋找上述的兩個(gè)辦法來(lái)執(zhí)行ShellCode,要么我們弄出一個(gè)錯(cuò)誤,讓程序出現(xiàn)jmp xxx或者call xxx出錯(cuò),要么就去覆蓋SHE。這里覆蓋SHE不行,那么就只剩第一個(gè)辦法了。經(jīng)過(guò)我仔細(xì)的反匯編分析,用了將近一天的時(shí)間,終于成功的讓PP點(diǎn)點(diǎn)通程序出現(xiàn)了讓我們興奮的call指令錯(cuò)誤,如圖2所示。
圖2
看到了嗎?圖中黑色的那一行,“call dword ptr[eax+5c]”指令出錯(cuò),而這里的eax是我們能夠控制的指令,勝利的天平已經(jīng)向我們傾斜了??墒巧缘?#xff0c;這里的“call dword ptr[eax+5c]”指令是一個(gè)間接尋址指令,也就是說(shuō)我們必須使得[eax+5c]的值成為一個(gè)指向我們ShellCode的指針數(shù)值,而此時(shí)只有ecx和edi寄存器指向我們可以利用的ShellCode,如圖3所示。
下載 (72.14 KB)
3?小時(shí)前
圖3
所以我們要么能讓“[eax+5c]=edi”或者“[eax+5c]=ecx”,要么就是讓[eax+5c]指向的地方是一個(gè)跳轉(zhuǎn)語(yǔ)句或者call語(yǔ)句,類(lèi)似“call edi”或者“jmp ecx”,讓其變成間接的間接尋址,最終還是會(huì)跑到我們的ShellCode中去就行。說(shuō)到這里我提出一個(gè)面對(duì)這種情況下,如何執(zhí)行ShellCode的方法,因?yàn)檫@不是傳統(tǒng)的“jmp esp”,esp直接就指向ShellCode,這里的情況是我們得間接執(zhí)行ShellCode。按照上面的兩個(gè)方法,我們?yōu)榱藢ふ摇癧eax+5c]=edi”,可以在系統(tǒng)的動(dòng)態(tài)庫(kù)文件中,尋找一些指令,由這些指令組成一個(gè)等于edi值的連續(xù)地址。假設(shè)在user32中,某地址處的指令為“mov eax,ebx pop eax pop ebx ret”,那么它在內(nèi)存中的顯示就是“8B C3 58 5B C3”,而且我們需要的edi值就是“0x5B58C38B”,這個(gè)地址指向我們的ShellCode,那么我們只需要將eax的值賦值為上面user32[某地址-5c]即可,因?yàn)檫@樣“call dword ptr[eax+5c]”獲取的就是我們ShellCode的執(zhí)行權(quán)。同樣道理,我們也可以找一個(gè)“call edi”的指令地址,在系統(tǒng)DLL庫(kù)中找指令組合,然后獲得地址,修改我們的跳轉(zhuǎn)指令。大家仔細(xì)看看圖4和圖5的示意圖就會(huì)明白了。
下載 (18.49 KB)
3?小時(shí)前
圖4
圖5
其實(shí)這里最穩(wěn)定的還是圖5的使用方法,因?yàn)槿绻闶褂脠D4的方法,所獲得的ShellCode地址是相對(duì)穩(wěn)定的,一旦電腦重新啟動(dòng)或者因?yàn)槟承┰?#xff0c;例如堆的參與,很容易造成地址變化,而使用寄存器間接尋址則會(huì)保持穩(wěn)定,因?yàn)榧拇嫫鞯闹凳冀K指向我們的ShellCode地址。在接下來(lái)的時(shí)間里,我們就是尋找這樣的符合我們要求的地址。你可以選擇手工,也可以選擇編個(gè)程序自動(dòng)尋找,總之有了思路,一切皆有可能,最后,我們只需要放上一個(gè)符合格式的ShellCode即可。什么叫符合格式的ShellCode?還記得我們這里測(cè)試的參數(shù)嗎?是一個(gè)路徑值參數(shù)“DownloadPath”,既然是路徑值,那么就不要在其中出現(xiàn)一些特殊符號(hào)啦,不然Windows會(huì)報(bào)警的,這也會(huì)影響我們的ShellCode執(zhí)行。假設(shè)你要尋找符合這樣要求的ShellCode,你可以參考我以前在黑防上發(fā)表的那篇關(guān)于騰訊安全控件漏洞的文章,那里的ShellCode是符合要求的。
現(xiàn)在為了證明我的理論的正確性,我暫時(shí)把ShellCode換成一個(gè)執(zhí)行死循環(huán)的代碼,從偽指令角度來(lái)說(shuō)就是:“l(fā)oop 1=1”,匯編代碼是“EB FE”,這樣一旦我們的這個(gè)ShellCode執(zhí)行了,那么電腦就會(huì)忙得不可開(kāi)交了。現(xiàn)在我們無(wú)非是要找到符合要求的那種所謂的間接再間接尋址指令的地址,我這里尋找的是一個(gè)找尋指向call(寄存器)或者jmp(寄存器)指令的地址,并且我為了保證這個(gè)地址能是一個(gè)比較穩(wěn)定的地址,把尋找的目標(biāo)放到了系統(tǒng)的動(dòng)態(tài)庫(kù)里面,當(dāng)然你也可以尋找別的文件里的,只是一旦環(huán)境稍變化,恐怕你的地址就會(huì)成為錯(cuò)誤的。手工尋找太累了,自己編寫(xiě)一個(gè)程序自動(dòng)查找最好,其實(shí)這個(gè)很好編寫(xiě),就是按照將地址加一,然后取出這個(gè)地址,利用這個(gè)地址找到所指處的十六進(jìn)制代碼是否是“FF D1”“FF D7”“FF E1”“FF E7”,這幾個(gè)代碼其實(shí)就是call ecx、call edi、jmp ecx和jmp edi這些指令的十六進(jìn)制表示,只要我們找到其中的任意一個(gè),我們都是可以利用來(lái)執(zhí)行我們的ShellCode的,因?yàn)閑di和ecx寄存器都指向了我們的ShellCode。經(jīng)過(guò)大約一分鐘的查找,真是太幸運(yùn)了,我們找到了四個(gè)地址,可正如同我說(shuō)的那樣,為了穩(wěn)定最好選擇使用系統(tǒng)動(dòng)態(tài)庫(kù)的地址,這樣我們把目標(biāo)所在了“204D3DE1”,這個(gè)地址其實(shí)是在Windows XP SP2的一個(gè)專(zhuān)門(mén)的動(dòng)態(tài)庫(kù)文件“xpsp2res.dll”中的,不論怎樣這都非常符合我們的要求。現(xiàn)在趕緊修改我們的過(guò)長(zhǎng)字符串,將其中控制eax寄存器值的那個(gè)字符串值改為“204D3D85”,注意這里,這個(gè)值可不直接就是我們剛才找到的那個(gè)地址,還記得前面出錯(cuò)的那個(gè)call指令嗎?因?yàn)槌鲥e(cuò)時(shí),利用的是[eax+5c],所以我們找到的地址一定要減去5c才行,這樣PP點(diǎn)點(diǎn)通出錯(cuò)時(shí)會(huì)自動(dòng)幫我們恢復(fù)成真正要利用的地址。修改好跳轉(zhuǎn)地址后,再修改我們的ShellCode,把我們的死循環(huán)這個(gè)ShellCode放到離跳轉(zhuǎn)地址大約100個(gè)字節(jié)以后,因?yàn)閑di指向的地址比較靠超常字符串的后面,太前了出錯(cuò)時(shí)會(huì)執(zhí)行不到那里。還需要說(shuō)的就是,正因?yàn)閑di指向的地址比較靠后,這樣留給我們放ShellCode的位置就不是很充裕了,如果你要放一個(gè)比較長(zhǎng)的ShellCode,建議你使用先放小ShellCode,此Code的主要目的是跳轉(zhuǎn)后遍歷查詢(xún)大ShellCode,而大ShellCode就可以直接放到控制eax覆蓋的跳轉(zhuǎn)字符串的前面任意位置,那里可以放很長(zhǎng)的字符串,估計(jì)完全夠用。一切就緒后,我們用這個(gè)精心構(gòu)造好的字符串賦值給“config.ini”文件中的“DownloadPath”參數(shù),打開(kāi)PP點(diǎn)點(diǎn)通,然后選擇“退出系統(tǒng)”,你會(huì)發(fā)現(xiàn)你的電腦一下子忙到了100%!我為了更加清楚的反映程序出錯(cuò)時(shí)的狀態(tài),給大家截圖如下,先看第一幅,如圖6所示。程序出錯(cuò)了,還是出錯(cuò)在call指令上,而此時(shí)eax成功被我們控制進(jìn)入xpsp2res.dll中。再看圖7,看到了嗎?我們成功控制程序流程進(jìn)入了call edi指令,注意下方的顯示,此時(shí)edi就指向了我們的簡(jiǎn)單ShellCode。一旦程序進(jìn)入了我們的ShellCode,電腦就會(huì)進(jìn)入一個(gè)死循環(huán),圖8中的任務(wù)管理器真實(shí)的反應(yīng)了這一點(diǎn)。
? ?? ?? ? 下載 (57.71 KB)
3?小時(shí)前
? ?? ???圖6
圖7
下載 (25.31 KB)
3?小時(shí)前
圖8
到這里,表明我們的一切分析確實(shí)都是正確的,只是有時(shí)利用會(huì)出現(xiàn)一定的干擾,這個(gè)大家可以自己研究一下,這里我就不再分析了?,F(xiàn)在大功告成,我們收工了。最后,我提供給大家一個(gè)POC,因?yàn)槊總€(gè)版本的Windows環(huán)境下利用的跳轉(zhuǎn)地址不太一樣,我就偷懶不挨個(gè)測(cè)試了,我直接給出觸發(fā)到call指令的畸形文件,依據(jù)我上面的思路,自己修改練練手,也許你會(huì)有新的發(fā)現(xiàn)的。
轉(zhuǎn)載于:https://blog.51cto.com/yyaidd/309190
總結(jié)
以上是生活随笔為你收集整理的PP点点通畸形文件溢出漏洞0Day的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php win8 下载64位下载,WIN
- 下一篇: ABAP入门步骤