版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
深入理解計(jì)算機(jī)系統(tǒng)LAB2LAB1實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)?zāi)康模菏褂谜n程知識(shí)拆除一個(gè)“BinaryBombs”來(lái)增強(qiáng)對(duì)程序的機(jī)器級(jí)表示、匯編語(yǔ)言、調(diào)試器和逆向工程等理解。實(shí)驗(yàn)簡(jiǎn)介: 一個(gè)“BinaryBombs”(二進(jìn)制炸彈,簡(jiǎn)稱炸彈)是一個(gè)Linux可執(zhí)行C程序,包含phase1~phase6共6個(gè)階段。炸彈運(yùn)行各階段要求輸入一個(gè)字符串,若輸入符合程序預(yù)期,該階段炸彈被“拆除”,否則“爆炸”。實(shí)驗(yàn)?zāi)繕?biāo)是你需要拆除盡可能多的炸彈。運(yùn)行結(jié)果: 通關(guān)密碼儲(chǔ)存在0014301-151420131.txt文件中。 成功運(yùn)行結(jié)果截圖: 實(shí)驗(yàn)中的六組密碼:PHASE1:字符串比較 本關(guān)比較簡(jiǎn)單,根據(jù)課件中的提示用GDB將最先壓棧的那個(gè)字符串常量打印出來(lái),然后將其作為密碼輸入,比較成功后即通關(guān)。08048ab2<phase_1>:8048ab2: 83ec14 sub$0x14,%esp8048ab5: 68049f0408 push$0x8049f048048aba: ff74241c pushl0x1c(%esp)8048abe: e84d040000 call8048f10<strings_not_equal> 將地址0x8049f04中的值打印出來(lái): 即“Thefuturewillbebettertomorrow.”P(pán)HASE2:循環(huán) 在查看匯編語(yǔ)言的時(shí)候,會(huì)看到有調(diào)用一個(gè)read_six_number函數(shù),猜測(cè)此題是讓輸入六個(gè)數(shù)字。08048ad3<phase_2>:8048ad3: 56 push%esi8048ad4: 53 push%ebx8048ad5: 83ec2c sub$0x2c,%esp8048ad8: 8d442410 lea0x10(%esp),%eax8048adc: 50 push%eax8048add: ff74243c pushl0x3c(%esp)8048ae1: e846050000 call804902c<read_six_numbers>8048ae6: 83c410 add$0x10,%esp8048ae9: 837c240801 cmpl$0x1,0x8(%esp)------判定是否為18048aee: 741e je8048b0e<phase_2+0x3b>8048af0: e812050000 call8049007<explode_bomb>8048af5: eb17 jmp8048b0e<phase_2+0x3b>8048af7: 8b03 mov(%ebx),%eax8048af9: 01c0 add%eax,%eax----進(jìn)行自加,擴(kuò)大兩倍8048afb: 394304 cmp%eax,0x4(%ebx)8048afe: 7405 je8048b05<phase_2+0x32>8048b00: e802050000 call8049007<explode_bomb>8048b05: 83c304 add$0x4,%ebx8048b08: 39f3 cmp%esi,%ebx8048b0a: 75eb jne8048af7<phase_2+0x24>8048b0c: eb0a jmp8048b18<phase_2+0x45>8048c83: 83ec1c sub$0x1c,%esp8048c86: 8d442408 lea0x8(%esp),%eax8048c8a: 50 push%eax8048c8b: 8d442410 lea0x10(%esp),%eax8048c8f: 50 push%eax8048c90: 680fa10408 push$0x804a10f--地址參數(shù)8048c95: ff74242c pushl0x2c(%esp)8048c99: e822fbffff call80487c0<__isoc99_sscanf@plt> 同樣函數(shù)sscanf,其中有兩個(gè)參數(shù),有一個(gè)是地址0x804a10f,先記下等會(huì)可能會(huì)用到。8048c9e: 83c410 add$0x10,%esp8048ca1: 83f801 cmp$0x1,%eax8048ca4: 7f05 jg8048cab<phase_5+0x28>8048ca6: e85c030000 call8049007<explode_bomb>8048cab: 8b44240c mov0xc(%esp),%eax8048caf: 83e00f and$0xf,%eax---------取低四位8048cb2: 8944240c mov%eax,0xc(%esp)8048cb6: 83f80f cmp$0xf,%eax---------不能等于158048cb9: 742e je8048ce9<phase_5+0x66>8048cbb: b900000000 mov$0x0,%ecx8048cc0: ba00000000 mov$0x0,%edx8048cc5: 83c201 add$0x1,%edx---------計(jì)數(shù)用的8048cc8: 8b0485c09f0408 mov0x8049fc0(,%eax,4),%eax尋址8048ccf: 01c1 add%eax,%ecx---------求和用的8048cd1: 83f80f cmp$0xf,%eax8048cd4: 75ef jne8048cc5<phase_5+0x42>8048cd6: c744240c0f0000 movl$0xf,0xc(%esp)8048cdd: 008048cde: 83fa0f cmp$0xf,%edx---------到15跳出8048ce1: 7506 jne8048ce9<phase_5+0x66>8048ce3: 3b4c2408 cmp0x8(%esp),%ecx8048ce7: 7405 je8048cee<phase_5+0x6b>8048ce9: e819030000 call8049007<explode_bomb>8048cee: 83c41c add$0x1c,%esp8048cf1: c3 ret 個(gè)別地方不是太清楚,不過(guò)已經(jīng)基本可以猜出來(lái)程序的目的,設(shè)置一個(gè)計(jì)數(shù)器進(jìn)行計(jì)數(shù),每次按照變量的偏移尋址,找到之后變成新的變量,之后按照新的變量進(jìn)行尋址,如此循環(huán)。沒(méi)找到一個(gè)變量,求和。當(dāng)變量剛好等于15的時(shí)候跳出,不過(guò)跳出的時(shí)候還需要看一下計(jì)數(shù)器有沒(méi)有達(dá)到15,也就是說(shuō)要循環(huán)15次才可以跳出,這為我們猜測(cè)其值提供了方便。 所以我們需要做的是找到初始的變量和以這個(gè)變量開(kāi)始循環(huán)所得到的總和。 根據(jù)GDB輸出的情況,我做了一個(gè)表格:01234567102147812151189101112131415041133965 其中首行是相對(duì)于首地址便宜的字節(jié),下面是其對(duì)應(yīng)的常數(shù)。當(dāng)變量為15的時(shí)候跳出,那么我們可以從15向后推:1561421100849131173125不難看出15個(gè)循環(huán)之后是5,因此第一個(gè)參數(shù)是5。之后把這十五個(gè)參數(shù)的值相加。最開(kāi)始的時(shí)候,我犯了個(gè)錯(cuò)誤就是直接把這十五個(gè)數(shù)相加,后來(lái)不通過(guò),經(jīng)過(guò)分析發(fā)現(xiàn)是15個(gè)偏移量對(duì)應(yīng)的地址中的常數(shù),所以為115。PHASE6:鏈表/指針/結(jié)構(gòu) 這一關(guān)看提示就覺(jué)得很難,首先對(duì)這三個(gè)詞進(jìn)行聯(lián)想,“鏈表+結(jié)構(gòu)”這個(gè)比較好聯(lián)想,應(yīng)該使用結(jié)構(gòu)體定義了一個(gè)鏈表結(jié)構(gòu)。至于“指針”,這個(gè)我猜測(cè)應(yīng)該是和上一關(guān)所說(shuō)的意思可能有相似之處,應(yīng)給就是不停地變換地址比較之類(lèi)的。 這一關(guān)的匯編語(yǔ)言比較長(zhǎng),其中有一大部分都是對(duì)結(jié)構(gòu)體的定義,所以這里只摘錄要點(diǎn)進(jìn)行解釋說(shuō)明。08048cf2<phase_6>:8048cf2: 56 push%esi8048cf3: 53 push%ebx8048cf4: 83ec3c sub$0x3c,%esp8048cf7: 8d442420 lea0x20(%esp),%eax8048cfb: 50 push%eax8048cfc: ff74244c pushl0x4c(%esp)8048d00: e827030000 call804902c<read_six_numbers> 又是這個(gè)參數(shù),這道題還是讓你輸入六個(gè)數(shù)8048d05: 83c410 add$0x10,%esp8048d08: be00000000 mov$0x0,%esi8048d0d: 8b44b418 mov0x18(%esp,%esi,4),%eax8048d11: 83e801 sub$0x1,%eax8048d14: 83f805 cmp$0x5,%eax8048d17: 7605 jbe8048d1e<phase_6+0x2c>8048d19: e8e9020000 call8049007<explode_bomb>8048d1e: 83c601 add$0x1,%esi8048d21: 83fe06 cmp$0x6,%esi8048d24: 741b je8048d41<phase_6+0x4f>8048d26: 89f3 mov%esi,%ebx8048d28: 8b449c18 mov0x18(%esp,%ebx,4),%eax8048d2c: 3944b414 cmp%eax,0x14(%esp,%esi,4)8048d30: 7505 jne8048d37<phase_6+0x45>8048d32: e8d0020000 call8049007<explode_bomb>8048d37: 83c301 add$0x1,%ebx8048d3a: 83fb05 cmp$0x5,%ebx8048d3d: 7ee9 jle8048d28<phase_6+0x36>8048d3f: ebcc jmp8048d0d<phase_6+0x1b>8048d41: 8d442418 lea0x18(%esp),%eax到這里為止,是一個(gè)循環(huán),是對(duì)輸入的六個(gè)數(shù)字進(jìn)行判定,從這里可以看出,要求是0到6這幾個(gè)數(shù)字符合要求,是這六個(gè)數(shù)字的一種組合。8048d45: 8d5c2430 lea0x30(%esp),%ebx8048d49: b907000000 mov$0x7,%ecx8048d4e: 89ca mov%ecx,%edx8048d50: 2b10 sub(%eax),%edx8048d52: 8910 mov%edx,(%eax)8048d54: 83c004 add$0x4,%eax8048d57: 39d8 cmp%ebx,%eax8048d59: 75f3 jne8048d4e<phase_6+0x5c> 這一段很重要,第一次讀的時(shí)候不明所以,不知道是在做什么,之后忽視去看后面的,發(fā)現(xiàn)結(jié)果怎么輸入都不對(duì)?;剡^(guò)頭來(lái)看,發(fā)現(xiàn)問(wèn)題在這里,假如輸入的是x,這里是將其變?yōu)?-x。即這個(gè)循環(huán)是做了一個(gè)置換,將我們所輸入的數(shù)字置換了。8048d75: 7417 je8048d8e<phase_6+0x9c>8048d77: 89de mov%ebx,%esi8048d79: 8b4c9c18 mov0x18(%esp,%ebx,4),%ecx8048d7d: b801000000 mov$0x1,%eax8048d82: ba3cb20408 mov$0x804b23c,%edx8048d87: 83f901 cmp$0x1,%ecx8048d8a: 7fd6 jg8048d62<phase_6+0x70>這是結(jié)構(gòu)體中的一段,其中有地址常量,這個(gè)應(yīng)該是結(jié)構(gòu)體鏈表的首地址,不防輸出進(jìn)行查看: 可以看出,這是由學(xué)號(hào)生成的一個(gè)有著六個(gè)元素的鏈表,元素分別是:123456706624911915549098048daf: be05000000 mov$0x5,%esi8048db4: 8b4308 mov0x8(%ebx),%eax8048db7: 8b00 mov(%eax),%eax8048db9: 3903 cmp%eax,(%ebx)8048dbb: 7d05 jge8048dc2<phase_6+0xd0>8048dbd: e845020000 call8049007<explode_bomb>8048dc2: 8b5b08 mov0x8(%ebx),%ebx8048dc5: 83ee01 sub$0x1,%esi8048dc8: 75ea jne8048db4<phase_6+0xc2>8048dca: 83c434 add$0x34,%esp8048dcd: 5b pop%ebx8048dce: 5e pop%esi8048dcf: c3 ret 這一段又是一個(gè)循環(huán),是對(duì)鏈表的一個(gè)排序,到這里就分析的差不多了,也就是說(shuō)我們輸入的是鏈表的次序,不過(guò)這個(gè)次序要被7減。 比較大小,有: 162435隱藏關(guān)卡: 這個(gè)如果沒(méi)有提示應(yīng)該是看不出來(lái)了。不過(guò)當(dāng)時(shí)在分析PHASE6的時(shí)候看到下面有一個(gè)func7。但是PHASE6并沒(méi)有用到,覺(jué)得很奇怪,看到提示后,又向后翻了翻,發(fā)現(xiàn)了func7是被secret_phase調(diào)用的。但是程序運(yùn)行從開(kāi)始到結(jié)束都沒(méi)有進(jìn)入這里。我檢索了一下secret_phase關(guān)鍵字,找到了調(diào)用它的函數(shù)。08049160<phase_defused>:8049160: 833de8b4040806 cmpl$0x6,0x804b4e88049167: 7573 jne80491dc<phase_defused+0x7c>8049169: 83ec78 sub$0x78,%esp804916c: 8d44241c lea0x1c(%esp),%eax8049170: 50 push%eax8049171: 8d442418 lea0x18(%esp),%eax8049175: 50 push%eax8049176: 8d442420 lea0x20(%esp),%eax804917a: 50 push%eax804917b: 6869a10408 push$0x804a169-----”%d%d%s”8049180: 68f0b50408 push$0x804b5f0-----”1037”8049185: e836f6ffff call80487c0<__isoc99_sscanf@plt>804918a: 83c420 add$0x20,%esp804918d: 83f803 cmp$0x3,%eax--有三個(gè)參數(shù)8049190: 753a jne80491cc<phase_defused+0x6c>從這里可以看出只有通過(guò)了第六關(guān)才能到達(dá)隱藏關(guān)口,而且隱藏的關(guān)口需要收入三個(gè)參數(shù),從提示中可以知道這三個(gè)參數(shù)是從第四行讀取的,所以需要再在第四行添加一個(gè)字符串,至于這個(gè)字符串是什么,需要打印相應(yīng)的地址查看。8049192: 83ec08 sub$0x8,%esp8049195: 6872a10408 push$0x804a172804919a: 8d44241c lea0x1c(%esp),%eax804919e: 50 push%eax804919f: e86cfdffff call8048f10<strings_not_equal80491a4: 83c410 add$0x10,%esp80491a7: 85c0 test%eax,%eax80491a9: 7521 jne80491cc<phase_defused+0x6c>80491ab: 83ec0c sub$0xc,%esp80491ae: 6838a00408 push$0x804a03880491b3: e8a8f5ffff call8048760<puts@plt>80491b8: c7042460a00408 movl$0x804a060,(%esp)80491bf: e89cf5ffff call8048760<puts@plt>80491c4: e858fcffff call8048e21<secret_phase>80491c9: 83c410 add$0x10,%esp80491cc: 83ec0c sub$0xc,%esp80491cf: 6898a00408 push$0x804a09880491d4: e887f5ffff call8048760<puts@plt>80491d9: 83c47c add$0x7c,%esp80491dc: f3c3 repzret 上面這些是判定字符是否相等,之后輸入一些信息,并且進(jìn)入函數(shù)func7。打印相關(guān)地址: 可知,需要輸入字符串是“DrEvil”。 之后分析方程7:08048dd0<fun7>:8048dd0: 53 push%ebx8048dd1: 83ec08 sub$0x8,%esp8048dd4: 8b542410 mov0x10(%esp),%edx8048dd8: 8b4c2414 mov0x14(%esp),%ecx8048ddc: 85d2 test%edx,%edx8048dde: 7437 je8048e17<fun7+0x47>8048de0: 8b1a mov(%edx),%ebx8048de2: 39cb cmp%ecx,%ebx8048de4: 7e13 jle8048df9<fun7+0x29>8048de6: 83ec08 sub$0x8,%esp8048de9: 51 push%ecx8048dea: ff7204 pushl0x4(%edx)8048ded: e8deffffff call8048dd0<fun7>8048df2: 83c410 add
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年特種粉末及粉末冶金制品合作協(xié)議書(shū)
- 2025年節(jié)能、高效干燥設(shè)備項(xiàng)目建議書(shū)
- 寒涼性體質(zhì)的溫補(bǔ)食物建議
- 多囊卵巢的生育管理
- 員工績(jī)效管理培訓(xùn)課件
- 2025年年石化倉(cāng)儲(chǔ)項(xiàng)目合作計(jì)劃書(shū)
- 2025年減震系統(tǒng)材料項(xiàng)目合作計(jì)劃書(shū)
- 中醫(yī)內(nèi)科護(hù)理并發(fā)癥預(yù)防
- 骨折患者的康復(fù)治療記錄
- 基礎(chǔ)護(hù)理中的職業(yè)暴露預(yù)防
- 廚師專(zhuān)業(yè)職業(yè)生涯規(guī)劃與管理
- 《恒X地產(chǎn)集團(tuán)地區(qū)公司管理辦法》(16年12月發(fā)文版)
- 2025年10月自考00688設(shè)計(jì)概論試題及答案
- 六西格瑪設(shè)計(jì)實(shí)例
- 海南檳榔承包協(xié)議書(shū)
- 工業(yè)交換機(jī)產(chǎn)品培訓(xùn)
- 2025浙江溫州市龍港市國(guó)有企業(yè)招聘產(chǎn)業(yè)基金人員3人筆試歷年備考題庫(kù)附帶答案詳解試卷3套
- 《十五五規(guī)劃》客觀測(cè)試題及答案解析(二十屆四中全會(huì))
- DB32-T 1086-2022 高速公路建設(shè)項(xiàng)目檔案管理規(guī)范
- 代碼開(kāi)發(fā)安全培訓(xùn)課件
- (2025年標(biāo)準(zhǔn))科研資助經(jīng)費(fèi)協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論