




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Practice1 上周做了,復(fù)制過(guò)來(lái)。前面得key1=3、key2=777下面我們繼續(xù)往后面看代碼,并且通過(guò)提示我們了解到我們需要想辦法使程序進(jìn)入并執(zhí)行msg2 = extract_message2(start, stride);但是從正常的程序邏輯上看,我們無(wú)法使msg1為空而順利進(jìn)入到條件碼中。那么我們需要考慮應(yīng)該在process_keys34中做出調(diào)整。我們能否在執(zhí)行完process_keys34后偷偷的改變msg1的值呢?在看了這段函數(shù)的代碼后,我們發(fā)現(xiàn)這個(gè)函數(shù)中兩個(gè)變量的范圍相差太大了,一個(gè)是全局變量message(msg1的實(shí)際指向),一個(gè)是局部變量key3。那么我們需要換一個(gè)思
2、路,能否讓函數(shù)在返回的時(shí)候直接跳轉(zhuǎn)到目標(biāo)代碼呢?如果要這么做,我們就需要修改程序在運(yùn)行過(guò)程中的棧幀結(jié)構(gòu)中的存儲(chǔ)數(shù)據(jù)了。現(xiàn)在讓我們來(lái)分析一下程序在調(diào)用process_keys34之前的棧幀結(jié)構(gòu):從匯編碼中我們可以看到在調(diào)用之前整個(gè)棧幀結(jié)構(gòu)中數(shù)據(jù)的存儲(chǔ)細(xì)節(jié)。首先是將參數(shù)key3、key4壓入棧中保存,然后在傳入這些參數(shù)。然而這些參數(shù)的傳遞都是傳地址的,所以我們?cè)趐rocess_keys34中可以通過(guò)&key3的相對(duì)定位來(lái)改動(dòng)調(diào)用者的棧幀數(shù)據(jù)。在這之前讓我們來(lái)想想調(diào)用時(shí)的棧幀結(jié)構(gòu):我們可以看到,如果我們能夠修改返回地址使它返回到我們期望的位置就可以了。那么我們現(xiàn)在需要確定這個(gè)返回地址相對(duì)于key3的
3、距離是多少,通過(guò)圖我們可以看到這個(gè)地址就在key3的下面,只需要在key3基礎(chǔ)上減一(這個(gè)減一是在int下的,實(shí)際上在地址層面應(yīng)該是-4)就好了。所以我們得到了key3的值-1.另外我們需要感謝出題者,他一直給我們提供充足的相對(duì)數(shù)據(jù)。在這里我們只需要在原返回地址上面加上一個(gè)合適的值就好了。從上圖中,我們可以看到原先的返回地址和我們需要抵達(dá)的返回地址0040138e是原先保存在棧幀中的返回地址,而我們期望程序返回時(shí)直接到達(dá)0x004013bb。這樣我們就得到了key4的具體值:Key4=(0x004013bb-0040138e)/4=45。所以key1234分別就是 3 777 -1 45。Pr
4、actice200951850 push ebp將ebp壓入棧頂位置。EIP跳到00951851。棧頂ESP變?yōu)?091FD6800951851 movebp,esp將ESP的值賦值給EBP,棧底EBP變?yōu)?091FD6800951853 sub esp,0D8h將ESP的值減小0D8h,變?yōu)?0D2FBF800951859 push ebx0095185A push esi0095185B push edi將當(dāng)前的EBX,ESI,EDI值逐個(gè)壓入到棧里。得到ESP為00D2FBECMain()0095185C lea edi,ebp-0D8hEDI=EBP-0D8h為與棧底相隔0D8hbyt
5、es的位置00951862 mov ecx,36h將ECX賦值為36h.00951867 mov eax,0CCCCCCCCh將EAX賦值為0CCCCCCCCh0095186C rep stosdwordptres:edi從EDI的位置開(kāi)始賦值,每次EDI+4,ECX-1,直到ECX為0為止。執(zhí)行完后EDI=00D2FCD0、EFL=000002120095186E movdwordptr a,1將1賦值給a的位置00951875 movdwordptr b,2將2賦值給b的位置0095187C moveax,dwordptr b將(b位置中的)2賦值給EAX=000000020095187F
6、 push eax將EAX放入棧中, ESP變?yōu)?0D2FBE800951880 movecx,dwordptr a將(a位置中的)1賦值給ECX=0000000100951883 push ecx將ecx壓入棧頂,ESP變?yōu)?0D2FBE400951884 call swap1 (0951307h)執(zhí)行swap1函數(shù)00951889 add esp,8ESP加8,ESP變?yōu)?0D2FBEC0095188C moveax,dwordptr b將(b位置中的)2賦值給EAX=000000020095188F push eax將eax壓入棧頂,esp變?yōu)?0D2FBE800951890 movec
7、x,dwordptr a將(a位置中的)1賦值給ECX=0000000100951893 push ecx將ecx壓入棧頂,esp變?yōu)?0D2FBE400951894 push 956B30h00951899 call _printf (0951325h)調(diào)用printf()函數(shù)EAX=00000015 EBX=7ED8F000 ECX=0D0AE50D EDX=5447181C ESI=00951046 EDI=00D2FCD0 EIP=0095189E ESP=00D2FBE0 EBP=00D2FCD0 EFL=000002440095189E add esp,0Ch棧頂ESP置為ESP+
8、0Ch,清除之前放入的形參009518A1 lea eax,bEax = b(00D2FCBC)009518A4 push eax將eax壓入棧頂,esp變?yōu)?0D2FBE8009518A5 lea ecx,aEcx=a(00D2FCC8)009518A8 push ecx將ecx壓入棧頂,esp變?yōu)?0D2FBE4009518A9 call swap2 (0951339h) 跳轉(zhuǎn)執(zhí)行swap2函數(shù)009518AE add esp,8 棧頂ESP置為ESP+8,清除之前放入的形參009518B1 moveax,dwordptr b將(b位置中的)1賦值給EAX=00000001009518B4
9、 push eax將eax壓入棧頂,esp變?yōu)?0D2FBE8009518B5 movecx,dwordptr a將(a位置中的)2賦值給ECX=00000002009518B8 push ecx將ecx壓入棧頂,esp變?yōu)?0D2FBE4009518B9 push 956B30h 009518BE call _printf (0951325h)調(diào)用printf()函數(shù)EAX=00000015 EBX=7ED8F000 ECX=0D0AE50D EDX=5447181C ESI=00951046 EDI=00D2FCD0 EIP=009518C3 ESP=00D2FBE0 EBP=00D2FC
10、D0 EFL=00000244009518C3 add esp,0Ch棧頂ESP置為ESP+0Ch,清除之前放入的形參009518D7 pop eax009518D8 pop edx009518D9 pop edi009518DA pop esi009518DB pop ebx棧壓出EDI,ESI,EBX以前的值放入EDI,ESI,EBX中009518DC add esp,0D8h ESP = ESP+0D8h 009518E2 cmpebp,esp比較EBP和ESP009518E4 call _RTC_CheckEsp (0951113h)檢查函數(shù)有沒(méi)有出錯(cuò)009518E9 movesp,e
11、bpESP = EBP009518EB pop ebpEBP = 棧頂壓出的值009518EC ret跳轉(zhuǎn)執(zhí)行棧頂壓出的值指向的代碼Practice3 題目中已經(jīng)說(shuō)了,“分析這個(gè)程序,可以得知,正常情況下,這個(gè)函數(shù)會(huì)在getbuf中,調(diào)入getxs函數(shù)讀入數(shù)字對(duì),然后不管任何情況下,都會(huì)對(duì)test函數(shù)返回0x1,”那我們?cè)撛趺崔k了?我們馬上可以想到在getbuf這個(gè)函數(shù)里定義的char buf16上做手腳,可以看到在getxs函數(shù)里的while循環(huán),結(jié)束條件只是以回車(chē)或者是eof結(jié)束符為判斷標(biāo)準(zhǔn),所以,根本沒(méi)對(duì)char輸入的數(shù)量做判斷!這樣的話(huà),我們可以輸入多于16個(gè)的數(shù),從而緩沖區(qū)溢出! 在
12、這里還是提一下幀棧結(jié)構(gòu),如下:+-+高地址|函數(shù)參數(shù) n 個(gè)|+-+|函數(shù)參數(shù)第 n-1 個(gè)|+-+| .| . | .|+-+|函數(shù)參數(shù)第1個(gè)|+-+|return 返回地址|+-+|ebp指針入棧|+-+|local var(局部變量)|+-+| others|+-+低地址 按照上面說(shuō)的函數(shù)棧的存放情況,在getbuf這個(gè)函數(shù)里,函數(shù)參數(shù)沒(méi)有,我們不管,然后就是return返回地址,然后就是ebp指針,然后就是charbuf16。+-+低地址|return 返回地址|+-+|ebp指針入棧|+-+| buf15|+-+| buf14 |+-+ : : :+-+| buf0 |+-+| ot
13、hers|+-+高地址 如果我們對(duì)buf溢出,能改寫(xiě)ebp和return地址!下面看看,ebp是多少,return地址是多少。 要知道這里的%ebp存的是test函數(shù)的%ebp,因而我們?cè)谡{(diào)試的時(shí)候就可以在test函數(shù)得到%ebp的值,它應(yīng)該是我們寫(xiě)入的buf16-buf19的值,而且它要保持原來(lái)的值,不然返回之后就亂套了,在我機(jī)器上是0x0040100f。這個(gè)很容易,解決了第一步。 下面我們?cè)賮?lái)看返回地址,先看一段匯編碼(不同的機(jī)器有所不同):在getbuf()返回后,肯定會(huì)接著執(zhí)行0040126a,我們能讓它從這執(zhí)行嗎?當(dāng)然不行!不然就要push eax,那是我們不想看到的,因?yàn)閑ax的值
14、就是1。因而我們會(huì)想到能不能跳過(guò)這?當(dāng)然能,改返回地址?。№?biāo)浦?,我們通過(guò)buf數(shù)組來(lái)覆蓋返回地址。此時(shí),我們想要它直接跳到00401271處,因而可以通過(guò)設(shè)置buf19-buf22的值來(lái)覆蓋返回地址。到了考慮如何加進(jìn)deadbeef了,在返回后,將直接執(zhí)行push offset string getbuf returned 0x%xn (0042301c),沒(méi)eax怎么行了?不然printf函數(shù)就少了參數(shù)。再回到幀棧結(jié)構(gòu)一下,printf在調(diào)用之前,要壓入?yún)?shù),先壓入val,再壓入offset string getbuf returned 0x%xn,也就是說(shuō)參數(shù)val(等同那個(gè)eax)在offset string getbuf returned 0x%xn“之上,而且緊挨著。此時(shí)我們可以想到,既然返回之后(返回地址及其以下的元素都已彈出,返回地址的上一個(gè)字節(jié)成了棧頂)就執(zhí)行pushoffset string getbuf r
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)氣動(dòng)執(zhí)行器對(duì)夾蝶閥行業(yè)投資前景及策略咨詢(xún)研究報(bào)告
- 2025至2030年中國(guó)毛線(xiàn)餐椅座墊市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2025至2030年中國(guó)歐式花灑行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)橙汁藕粉行業(yè)發(fā)展研究報(bào)告
- 2025至2030年中國(guó)樓面鋼承板機(jī)市場(chǎng)調(diào)查研究報(bào)告
- 2025至2030年中國(guó)桑拿蒸汽沖淋兩用房行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)柴架市場(chǎng)現(xiàn)狀分析及前景預(yù)測(cè)報(bào)告
- 2025至2030年中國(guó)果苗數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025至2030年中國(guó)條碼母片行業(yè)投資前景及策略咨詢(xún)報(bào)告
- 2025至2030年中國(guó)木石防火裝飾板市場(chǎng)分析及競(jìng)爭(zhēng)策略研究報(bào)告
- 2021年山東省青島市中考地理試卷(附答案)
- 24所浙江高校三位一體線(xiàn)上面試真題匯總
- 治療小兒遺尿九十九法
- AFC系統(tǒng)介紹教學(xué)課件
- 雙流中學(xué)初一新生入學(xué)考試語(yǔ)文試題
- 無(wú)人機(jī)航拍技術(shù)理論考核試題題庫(kù)及答案
- 高填方路基施工質(zhì)量控制培訓(xùn)二
- 金陵十二釵判詞欣賞
- 500噸每日小區(qū)生活污水處理工程設(shè)計(jì)大學(xué)本科畢業(yè)論文
- 耶路撒冷問(wèn)題
- 《結(jié)業(yè)證書(shū)》模板范本
評(píng)論
0/150
提交評(píng)論