2023年拆炸彈實(shí)驗(yàn)報(bào)告_第1頁(yè)
2023年拆炸彈實(shí)驗(yàn)報(bào)告_第2頁(yè)
2023年拆炸彈實(shí)驗(yàn)報(bào)告_第3頁(yè)
2023年拆炸彈實(shí)驗(yàn)報(bào)告_第4頁(yè)
2023年拆炸彈實(shí)驗(yàn)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩16頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

HUNANUNIVERSITY課程實(shí)驗(yàn)報(bào)告課程名稱:計(jì)算機(jī)組成與結(jié)構(gòu)團(tuán)實(shí)驗(yàn)名稱:拆炸彈專業(yè)班級(jí):姓名:學(xué)號(hào):完成時(shí)間:(一)實(shí)驗(yàn)?zāi)康模撼绦蜻\(yùn)營(yíng)中有6個(gè)關(guān)卡(6個(gè)phase),每個(gè)phase需要用戶在終端上輸入特定的字符或者數(shù)字才干通關(guān),否則會(huì)引爆炸彈!那么如何才干知道輸入什么內(nèi)容呢?這需要你使用gdb工具反匯編出匯編代碼,結(jié)合c語(yǔ)言文獻(xiàn)找到每個(gè)關(guān)卡的入口函數(shù)。然后分

0x08048e5a<+44>:mov0x08048e5a<+44>:mov0x08048e5a<+44>:mov-0xc(%ebp),%eax0x08048e5d<+47>:test%eax,%eax第一段數(shù)據(jù)大于等于0,否則引爆。0x08048e5f<+49>:l3js0x8048e66<phase_4+56>$Oxe,%eax第一段數(shù)據(jù)小于等于14時(shí)跳過(guò)引爆。0x08048e66<+56>:call0x80490dl<expIode_bomb>0x08048e6b<+61>:mov1$0xe,0x8(%esp)Ox08048e73<+69>:mo$0x0,0x4(%esp)Ox08048c7b<4-77>:mov-Oxc(%cbp),%eax0x08048e7e<+8O>:0mov%0x08048e5a<+44>:mov-0xc(%ebp),%eax0x08048e5d<+47>:test%eax,%eax第一段數(shù)據(jù)大于等于0,否則引爆。0x08048e5f<+49>:l3js0x8048e66<phase_4+56>$Oxe,%eax第一段數(shù)據(jù)小于等于14時(shí)跳過(guò)引爆。0x08048e66<+56>:call0x80490dl<expIode_bomb>0x08048e6b<+61>:mov1$0xe,0x8(%esp)Ox08048e73<+69>:mo$0x0,0x4(%esp)Ox08048c7b<4-77>:mov-Oxc(%cbp),%eax0x08048e7e<+8O>:0mov%eax,(%esp)0x08048e81<+83>:cal10x8048b60<func4>這幾行為運(yùn)營(yíng)一個(gè)遞歸函數(shù)func4來(lái)擬定第一Ox08048e86<+88>:cmp$0xl,%eax段數(shù)據(jù)的值。Ox08048e89<+91>:0jne0x8048e91<phase_4+99>0x08048e8b<+93>:cmpl$0x1,-0x10(%ebp)第二個(gè)數(shù)據(jù)等于1則跳過(guò)爆炸。Ox08048e8f<+97>:0je0x8048e9d<phase_4+lll>0x08048e91<+99>:0leaOxO(%esi,%eiz,l),%esi0x08048e98<+106>:cal1x80490d1<explode_bomb>Ox08048e9d<4-111>:1%%ax,%ax%ax,%ax0x08048e9e<+112>:xchg0x08048eaO<+114>:ret以上對(duì)代碼的分析可以看出,第二個(gè)數(shù)據(jù)擬定為1。第一個(gè)數(shù)據(jù)范圍為大于等于0,小于%ax,%ax4,并且由一個(gè)遞歸函數(shù)func4又一次縮小了范圍。但由于這個(gè)遞歸函數(shù)太過(guò)繁雜,而第一個(gè)數(shù)據(jù)范圍又不大,直接將第一個(gè)數(shù)據(jù)從0嘗試到13,得到了三個(gè)數(shù)字8、9、11符合規(guī)定。因此密碼有三組:81,91,111。

<Phase_5>反匯編代碼如下:0x08048db8<+0>:push%ebp0x08048db9<+1>:0mov%esp,%ebp0x08048dbb<+3>:push%esi0x08048dbc<+4>:0push0x08048dbd<+5>:0sub$0x20,%esp0x08048dcO<+8>:lea—OxlO(%ebp),%eaxOx08048dc3mov%eax,Oxc(%esp)此處為第二個(gè)數(shù)。Ox08048dc7<+15>:Iea-Oxc(%ebp),%eax0x08048dca<+l8>:<Phase_5>反匯編代碼如下:0x08048db8<+0>:push%ebp0x08048db9<+1>:0mov%esp,%ebp0x08048dbb<+3>:push%esi0x08048dbc<+4>:0push0x08048dbd<+5>:0sub$0x20,%esp0x08048dcO<+8>:lea—OxlO(%ebp),%eaxOx08048dc3mov%eax,Oxc(%esp)此處為第二個(gè)數(shù)。Ox08048dc7<+15>:Iea-Oxc(%ebp),%eax0x08048dca<+l8>:mov%eax,0x8(%esp)此處為第一個(gè)數(shù)。0x08048dee<+22>:movl$0x804a23e,Ox4(%esp)$0x804a23e內(nèi)為%d%d,即輸入兩個(gè)整數(shù)。0x08048dd6<+30>:mov0x8(%ebp),%eax0x08048dd9<+33>:movax,(%esp)0x08048ddc<+36>:0cal0x8048840<_isoc99_sscanf@plt>0x08048de1<+41>:cmp$0xl,%eax以上兩行保證輸入數(shù)據(jù)多于1組,否則引爆。0x08048de4<+44>:jg0x8048deb<phase_5+51>Ox08048de6<+46>:call0x80490d1<explode_bomb>0x08048deb<+51>:mov-Oxc(%ebp),%eax0x08048dee<+54>:0and$Oxf,%eax按位與,即保存第一個(gè)數(shù)的后四位。0x08048dee<+54>:0and%eaxz-0xc(%ebp)0x08048df1<+57>:0mov0x08048df4<+60>:0cmp$0xfz%eax第一個(gè)數(shù)二進(jìn)制后四位不能為(1111%eaxz-0xc(%ebp)0x08048df7<+63>:jeOx8048e22<phase_5+106>0x08048df9<+65>:0mov$0x0,%ecx0X08048dfe<+70>:(3mov$0x0,%edx0x08048e030X08048dfe<+70>:(3mov$0x0,%edx0x08048e03<+75>:0mov$0x804alc0,%ebxS0x804a1cO指向的是一個(gè)數(shù)組,0x08048e08<+80>:add$0x1,%edx0x08048e0b<+83>:mov0x08048e08<+80>:add$0x1,%edx0x08048e0b<+83>:mov0x08048e0b<+83>:mov(%ebx,%0x08048e0b<+83>:mov(%ebx,%eax,4),%eax0x08048e0e<+86>:0add0x08048e0e<+86>:0add%eax,%ecx0x08048e0e<+86>:0add%eax,%ecx0x08048e10<+88>:cmp0x08048e10<+88>:cmp$0xf,%0x08048e10<+88>:cmp$0xf,%eax0x08048e13<+91>:0j0x08048e13<+91>:0jne0x8048e08<phase_5+80>0x08048e13<+91>:0jne0x8048e08<phase_5+80>以上五行為一個(gè)for循環(huán)語(yǔ)句,0x08048e0x08048e15<+93>:mov0x08048e15<+93>:mov0x08048e15<+93>:mov%eax,-0xc(%ebp)0x08048e18<+96>:(3cmp0x08048e18<+96>:(3cmp$0xf,0x08048e18<+96>:(3cmp$0xf,%edx上述的for循環(huán)要循環(huán)15次。0x08048elb<+99>:jne0x8048e22<phase_5+106>0x08048eldV+0x08048elb<+99>:jne0x8048e22<phase_5+106>0x08048eldV+101>:cmp0x08048eldV+1010x08048eldV+101>:cmp%ecx,-0xl0(%ebp)擬定第二個(gè)數(shù)的值,下面分析。0x08048e20<+104>:je0x8048e27<phase_5+111>Ox08048e22<+106>:c0x08048e20<+104>:je0x8048e27<phase_5+111>Ox08048e22<+106>:cOx08048e22<+106>:caII0x80490dl<expIode_bomb>0x08048e27<+lll>:add$0x20,%esp0x08048e2a<+114>:pop%ebx0x08048e2b<+115>:pop%esiOx08048e2c<+ll6>Ox08048e22<+106>:caII0x80490dl<expIode_bomb>0x08048e27<+lll>:add$0x20,%esp0x08048e2a<+114>:pop%ebx0x08048e2b<+115>:pop%esiOx08048e2c<+ll6>:Pop%ebp0x08048e2d<+117>:r從代碼的分析中可知:需要輸入兩個(gè)數(shù),并且第一個(gè)數(shù)的后四位不能為1111,若為1111則引爆炸彈。在程序中我們會(huì)碰到一個(gè)給定值0x804alc0。我們可以查看其值為:(gdb)p*0x8O4alc0016$8={10,2,14,7,8,12,15,11,0,4,1,13,3,9,6,5}查看16個(gè)值,由于發(fā)現(xiàn)后面的循環(huán)中需要循環(huán)遍歷使用16個(gè)數(shù)。其中最難懂的代碼就是Ox08048e0b<+83>:mov(%ebx,%eax,4),%eax這一行代碼,ebx相應(yīng)的是0x804alc0相應(yīng)的首地址。這句話的意思解釋為C語(yǔ)言的意思就是n=a[n]o寄存器ecx保存的是計(jì)算得sum的總值。這段代碼翻譯成c語(yǔ)言類似于:sum=0;for(i=1;n=15;i++)(n=a[n];sum+=n;)其中第一次n取的值應(yīng)為用戶輸入的第一個(gè)數(shù)二進(jìn)制下的后四位。之后每次都等于a[n],sum為除去第一次之外所有n取值的和。采用逆推的方法來(lái)求出n第一次取的值。序號(hào)0123456789111111012345數(shù)組1217811104113965042513for循環(huán)當(dāng)n為15時(shí)終止,因此最后一個(gè)n為:15,相應(yīng)序號(hào)為上一個(gè)n,即6。同理,可以得到,n從第一個(gè)到最后一個(gè)為:5123711139480101214615。sum=15*16/2-5=115。即用戶輸入的第二個(gè)數(shù)為115。用戶輸入第一個(gè)數(shù)二進(jìn)制下的后四位為0101(即第一個(gè)n=5),由于第一位只要滿足輸入的數(shù)的后四位不為1111,第二個(gè)數(shù)為115即可,如:10115,5115o<Phase_6>反匯編代碼如下:0X08048C89<+0>:push%ebp0x08048c8a<+l>:mov%esp,%ebp0x08048c8c<+3>:push%edi0x08048c8d<+4>:0pus%esiOx08048c8e<+5>:0push%ebx0x08048c8f<+6>:@sub$0x5c,%esp0x08048c92<+9>:lea-0x30(%ebp),%eax0x08048c95<+12>:0mov%eax,0x4(%esp)0x08048c99<+l6>:0mov0x8(%ebp),%eax0x08048c9c<+19>:mov%eax,(%esp)Ox08048c9f<+22>:cal0x804910b<readsixnumbers>0x08048ca4<+27>:mov$0x0,%esiOx08048ca9<+32>:(3lea-0x30(%ebp),%edi0x08048cac<+35>:0mov(%edi,%esi,4),%eax第esi+1個(gè)數(shù)給eax。開始外層for循環(huán)o0x08048caf<+38>:0sub$0x1,%eaxeax-o0x08048cb2<+41>:cm$0x5,%eaxeax小于等于5跳過(guò)炸彈,即第esi+1個(gè)數(shù)小于等于6a0x08048cb5<+44>:jbe0x8048cbc<phase_6+51>0x08048cb7<+46>:國(guó)ca10x80490dl<explode_bomb>0x08048cbc<+51>:0add$0xl,%esiesi++。0x08048cbf<+54>:cmp$0x6,%esiesi不等于6時(shí)不跳轉(zhuǎn)。等于0x08048cbf<+54>:cmp轉(zhuǎn)至0x8048ce6o0x08048cc2<+57>:0je0x8048ce6<phase_6+93>0x08048cc4<+59>:1ea0x08048cc4<+59>:1ea0x08048cc7<+62>:mov%esi0x4c(%ebp)(%edi,%esi,4),%ebx第esi+1個(gè)數(shù)給ebx。0x0x08048cca<+65>:0mov開始內(nèi)層for循環(huán)。-0x4(%edi,%esi,4),%eax第esi個(gè)數(shù)給eax。0x08048cce<+69>:0cmp0x08048cce<+69>:0cmp(%ebx),%eax若eax和ebx不相等則跳過(guò)炸彈。0x08048cd0<+71>:jne0x8048cd7<phase_6+78>0x08048cd2<+73>:caII0x80490dl<exp1ode_bomb>0x08048cd7<+78>:addI$0x1,-0x4c(%ebp)每次加1。0x08048cdb<+82>:0add$0x4,%ebxebx+=4o0x08048cde<4-85>:0cmpl$0x5,-0x4c(%ebp)小于等于5時(shí)跳轉(zhuǎn),即能循環(huán)0x08048cde<4-85>:0cmpl0x08O48ce2<+89>:j1e0x8048cca<phase_6+65>0x08048c0x08O48ce2<+89>:j1e0x8048cca<phase_6+65>0x08048c0x08048c0x8048cac<phase_6+35>0x08048ce60x08048c0x8048cac<phase_6+35>0x08048ce60x08048ce6<+93>:0mov$0x0,%ebx0x08048ceb<+98>:01e-0x30(%ebp),%edi0x08048ce6<+93>:0mov$0x0,%ebx0x08048ceb<+98>:01e-0x30(%ebp),%ediOx08048cee<4-101>:jmp0x8048d06<phase_6+125>跳轉(zhuǎn)到第Ox8048d06行。0x08048cf0<+103>:0x8(%edx),%edx0x08048cf0<+103>:通過(guò)用戶0x08048cf3<+106>:add$0x1,%eax輸入的六個(gè)數(shù)字來(lái)調(diào)整鏈表中6個(gè)元素的位置。0x08048cf6<+109>:cmp%eex,%eax0x08048cf8<+l10x08048cf6<+109>:cmp%eex,%eax0x08048cf8<+l11>:jne0x8048cf0<phase_6+103>movmov%edx/mov%edx/—Ox48(%ebp,%esi,4)Ox08048cfe<+117>:Ox08048cfe<+117>:add$0x1,%ebx0x08048d01<+120>:cmpOx08048cfe<+117>:add$0x1,%ebx0x08048d01<+120>:cmp$0x6,%ebx0x08048d04<+l23>:je0x08048d04<+l23>:je0x8048dlc<phase_6+147>0x08048d06<+l25>0x08048d04<+l23>:je0x8048dlc<phase_6+147>0x08048d06<+l25>:mov0x08048d06<+l25>:0x08048d06<+l25>:mov%ebx,%esi(%edi,%ebx,4),%ecx0x08048d08<+127>:mov(%edi,%ebx,4),%ecxOx08048dOb<+130>:movOx08048dOb<+130>:mov$0x804c0c4,%edx0x804c0c4Ox08048dOb<+130>:mov0x08048dl0<+135>:mov$0xlz%eax0x08048d15<+140>:cmp$0xl,%ecx0x08048d18<+143>:g0x8048cfO<phase_6+103>0x08048dla<+145>:mp0x8048cfa<phase_6+l13>Ox08048dlc<+147>:mov-Ox48(%ebp),%ebx重新排列鏈表的值。0x08048dlf<+150>:mov—0x44(%ebp),%eax0x08048d22<+153>:mov%eax,0x8(%ebx)0x08048d25<+156>:movOx08048d28<+159>0x08048d25<+156>:movOx08048d28<+159>:m0x08048d2b<+162>:mov0x08048d2e<+165>:mov0x08048d31<+168>:mov0x08048d34<+171>:movOx08048d37<+174>:mov0x08048d3a<+177>:mov%eax,0x8(%(0x08048d3d<+180>:movl$0x0,0x8(%eax)0x08048d44<+187>:mov$0x0,%esi-0x40(%ebp),%edxov%edx,0x8(%eax)-0x3c(%ebp),%eax%eax,0x8(%edx)-0x38(%ebp),%edx%edx,0x8(%eax)-0x34(%ebp),%eaxx)對(duì)鏈表的值進(jìn)行檢測(cè)。0x08048d49<+192>:mov0x08048d4c<+195>0x08048d49<+192>:mov0x08048d4c<+195>:mov0x08048d4e<+197>:cmp0x08048d50<+199>:jge0x08048d52<+201>:cal10x8(%ebx),%eax(%ebx),%edx(%eax),%edx0x8048d57<phase_6+206>0x80490dl<expIode_bomb0x8(%ebx),%ebx0x08048d57<+206>:mov0x8(%ebx),%ebx$0xl,%esi0X08048d5a<+209>:add0x08048d5d<+212>:cmp$0x5,%esi0xO8048d6O<+215>:jne0x8048d49<phase_6+192>$0xl,%esi0x08048d62<+217>:add$0x5cz%espOx08048d65<+220>:pop%ebx0x08048d66<+221>:pop%esi0x08048d67<+222>:pop%edi0x08048d68<+223>:pop%ebp0x08048d69<+224>:ret該代碼實(shí)現(xiàn)的功能是將鏈表中的值得順序按照你給定的順序然后重新排列,使得鏈表中的數(shù)據(jù)按從小到大的順序排列。輸入x0x804cOc4查看鏈表頭部的值為:0x1a7(gdb)x/xw0x804cOc4Ox804c0c4<nodel>:0x000001a7Ox804c0c4+0x8即可得到0x804c0c4指向的下一個(gè)鏈表的指針,*(0x804c0c4+0x8)可取其相應(yīng)的值:0x6c(gdb)x/xw*(Ox804c0c4+0x8)Ox804cOb8<node2>:0x0000006c同理要得到相應(yīng)的下一個(gè)鏈表中存放的值,則輸入*(*(0x804coe4+0x8)+0x8),相應(yīng)的值為Ox55(gdb)x/xw*(*(0x804c0c4+0x8)+0x8)0x804c0ac<node3>:0x00000155同理得到剩下的3個(gè)值為:0xl87Ox3bd0x255用戶給定值:561432則鏈表中的數(shù)據(jù)則將0x3bd移動(dòng)到1號(hào)位置,而將Ox255移動(dòng)到2號(hào)位置。從而將鏈表中的值從大到小的順序排列應(yīng)當(dāng)為:3bd2551a71871556c。則輸入為561432o拆炸彈的結(jié)果為:szm@ubuntu:~/LAB3$./bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!WehavetostandwithourNorthKoreanallies.Phase1defused.Howaboutthenextone?011235That'snumber2.Keepgoing!0147Halfwaythere!81Soyougotthatone.Trythisone.5115Goodwork!Ontothenext...561432Congratulations!You'vedefusedthebomb!szm@ubuntu:~/LAB3$實(shí)驗(yàn)總結(jié):通過(guò)這次實(shí)驗(yàn),對(duì)匯編語(yǔ)言有了一個(gè)更好的理解,與其說(shuō)是理解,倒不如說(shuō)是自己克服了看到匯編代碼的那種恐驚感。由于以前沒(méi)有接觸過(guò)匯編語(yǔ)言,就像當(dāng)初剛剛開始的時(shí)候接觸c語(yǔ)言同樣,碰到很長(zhǎng)很難的代碼就容易引發(fā)抵制的情緒,這次實(shí)驗(yàn)自己很好的克制了這種情緒。由于第一次實(shí)驗(yàn)的經(jīng)驗(yàn),使得對(duì)于匯編語(yǔ)言中的基本指令有了基本的掌握,才使得這次實(shí)驗(yàn)可以順利的進(jìn)行下去。這次實(shí)驗(yàn)雖然說(shuō)是一個(gè)拆炸彈的游戲,但事實(shí)上是一個(gè)提高自己匯編語(yǔ)言能力的一次很好的機(jī)會(huì),平時(shí)很難有機(jī)會(huì)完整的看完一整頁(yè)一整頁(yè)的匯編代碼,通過(guò)這次實(shí)驗(yàn),自己的確學(xué)到了很多。當(dāng)然這次實(shí)驗(yàn)中也碰到了很多的困難,在看到第三題的時(shí)候由于那個(gè)類似switch的核心代碼的跳轉(zhuǎn)指令沒(méi)有看懂而導(dǎo)致久久的停留在那個(gè)實(shí)驗(yàn)而浪費(fèi)了很多的時(shí)間,最終在同學(xué)的幫助下,成功的解決了這個(gè)問(wèn)題。析匯編代碼,找到在每個(gè)phase程序段中,引導(dǎo)程序跳轉(zhuǎn)到“explode_bomb”程序段的地方,并分析其成功跳轉(zhuǎn)的條件,以此為突破口尋找應(yīng)當(dāng)在命令行輸入何種字符通關(guān)。(-)實(shí)驗(yàn)環(huán)境:虛擬機(jī)ubuntu系統(tǒng)下32位操作系統(tǒng),終端,gdb工具。(三)實(shí)驗(yàn)?zāi)康暮筒僮鳎翰鹫◤棞?zhǔn)備操作:查看給出的bomb工中的代碼,得知控制檢測(cè)密碼正誤的6個(gè)函數(shù)分別為:phase_1,phase_2,phase_3,phase_4,phase_5,phase_6o使用gbd工具對(duì)可執(zhí)行文獻(xiàn)bomb進(jìn)行反匯編:打開bomb可執(zhí)行文獻(xiàn)所在的文獻(xiàn)夾輸入反匯編命令objdump-dbomb后,出現(xiàn)了大量匯編代碼,在終端窗口可以看到很多行的匯編代碼。也可以使用匯編指令。bjdump-dbomb>1.txt將匯編代碼輸出到服務(wù)器上一個(gè)自動(dòng)生成的叫1.txt的文獻(xiàn)中。?C?szm(O)ubuntu:~/LAB38049faf:83f8ffcmp$6xffffffff,%eax8。49fb2:75f4jne8049fa8<_do_global_ctors_aux+Ox18>8049fb4:83c404add$0x4,%esp8。49fb7:5bPOP%ebx8049fb8:5dPOP%ebp8。49fb9:C3ret8049fba:96nop8049fbb:90nopDisassemblyofsectior\.fini??*08049fbc<_ftni>:8049fbc:53push%ebx8049fbd:83ec08sub$0x8,%esp8049fc6:e800000000call8049fc5<_fini+0x9>8049fc5:5bpop%ebx8049fc6:81c32f206000add$Gx202f,%ebx8049fcc:e85fe9ffffcall8048930<_do_gl.obal_dtors_aux>8049fdl:83C408add$0x8,%esp8049fd4:5bpop%ebx8049fd5:C3retszm@ubuntu:~/LAB3$objdump-dbomb>l.txtIszm@ubuntu:~/LAB3$a|開始拆炸彈:<phas°」〉:的反匯編代碼如下:0x08048f61<+O>:0push%ebp0x08048f62<+l>:mov%esp,%ebp0xO8048f64<+3>:sub$0x18,%esp0x08048f67<+6>:0mov1Ox804a15c,0x4(%esp)//sp寄存器地址指向$0x804a15c0x08048f6f<+14>:0mov0x8(%ebp),%eax將$0x804al5c的數(shù)據(jù)移給eax寄存器0x08048f72<+17>:0mov%eax,(%esp)(3//函數(shù)條用的準(zhǔn)備過(guò)程0x08048f75<+2O>:0callx8048fab<strings_not_equal>0x08048f7a<+25>:test%eax,%eax//與這一行比較用戶輸入和$0x804a15c中的值Ox08048f7c<+27>:je0x8048f83<phase_l+34>Ox08048f7e<+29>:Scalix80490d1<explode_bomb>Ox08048f83<+34>:01eave0x08048f84<+35>:0ret通過(guò)度析代碼可知:phase_1的密碼是固定儲(chǔ)存在$0x804al5c中的。令$0x804al5c中的數(shù)據(jù)與用戶輸入的數(shù)據(jù)比較,若相同則跳過(guò)exp1ode_bomb,避開炸彈。用命令x/s0x804al5c查看其中的數(shù)據(jù)如下:(gdb)x/s0x864al5cOx804al5c:MWehavetostandwithourNorthKoreanallies,(gdb)輸入WehavetostandwithourNorthKoreanaliies.結(jié)果為:(gdb)rStartingprogram:/home/szm/LAB3/bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!WehavetostandwithourNorthKoreanallies.Phase1defused.Howaboutthenextone?

結(jié)果對(duì)的。<phase_2>反匯編代碼如下:Ox08048d6a<+O>:0push%ebp%%esp,%ebp%esp,%ebp0x08048d6b<+l>:0mov0x08048d6d<+3>:0push%esiOx08048d6e<+4>:(3push%ebx%esp,%ebp0x08048d72<+8>:lea-0x20(%ebp),%eax0x08048d75<+ll>:mov%eax,0x4(%esp)0x08048d79<+15>:mov0x8(%ebp),%eax0x08048d7c<+18>:mov%eax,(%esp)0x08048d7f<+21>:0call0x80491Ob<read_six_numbers>讀取六個(gè)數(shù)字0x08048d84<+26>:cmpl$OxO,-Ox20(%ebp)0和第一個(gè)數(shù)字比較,不相等則爆炸。0x08048d88<+30>:jne0x8048d90<phase_2+38>0x08048d8a<+32>:0cmpI$0xl,-0xlc(%ebp)1和第二個(gè)數(shù)字比較,相等則跳過(guò)爆炸。0x08048d8e<+36>:je0x08048d90<+38>:call0x08048d8e<+36>:je0x08048d90<+38>:call0x80490dl<explode_bomb>0x08048d95<+43>:lea-0xl8(%ebp),%ebxebx指向第三個(gè)數(shù)字。esi指向第六個(gè)數(shù)字再向后移Ox08048d98<+46>:lea-0x8(%ebp),%esiesi指向第六個(gè)數(shù)字再向后移Ox08048d9b<+49>:movOx08048d9b<+49>:mov0x08048d9e<+52>:add-0x8(%ebx),%eaxeax再加上ebx向前第二位的數(shù)字。

比較ebx前兩位的和與ebx0x08048da1<+55>:@cmp%eax,(%比較ebx前兩位的和與ebx0x8048daa<phase_2+64>相等則跳過(guò)爆炸(exp10x80490d1<explode_bomb>0x8048daa<phase_2+64>相等則跳過(guò)爆炸(exp10x80490d1<explode_bomb>0x08048da5<+59>:Hcal10x08048daa<+64>:0add$0x4,%ebxebx地址向后移動(dòng)一位(四個(gè)字節(jié))。0x08048dad<+67>:cmp%esi,%ebx假如尚未超過(guò)第六位數(shù)字,則跳轉(zhuǎn)0x8048d9行。0x08048daf<+690x08048daf<+69>:jne0x08048dbl<+71>:add0x08048db4<+74>:pop0x08048db5<+75>:pop0x08048db6<+76>:pop0x08048db7<+77>:ret0x8048d9b<phase_2+49>$0x30,%esp%esi%ebpphase_2的密碼需要輸入六位數(shù)字,并且第一個(gè)是0,第二個(gè)是1燃后執(zhí)行到Ox8048d9b這一行代碼發(fā)現(xiàn)往下運(yùn)營(yíng)會(huì)出現(xiàn)一個(gè)循環(huán),兩條重要指令是imull-0x4(%esi,%edx,4),%eax和cmp%eax,(%esi,%edx,4),其中%eax和%6(^(在每次循環(huán)中加1直到寄存器中值超過(guò)6,程序執(zhí)行完畢。在循環(huán)中執(zhí)行的是一個(gè)數(shù)等于前兩個(gè)數(shù)之和,寄存器ebx每次循環(huán)將向前第一位的數(shù)字賦給寄存器eax。從而實(shí)現(xiàn)了計(jì)算前6位的斐波那契數(shù)列的值為:011235o執(zhí)行結(jié)果如下:Phase1defused.Howaboutthenextone?011235That'snumber2.Keepgoing!<phase_3>反匯編代碼如下:0x08048eal<+0>:pus%ebp0x08048ea2<+l>:mov%esp,%ebp0x08048ea4<+3>:0sub$0x28,%espOx08048ea7<+6>:Iea-Ox10(%ebp),%eax0x08048eaa<+9>:0mov0x08048eae<+13>:1ea—0xc(%ebp),%eax0x08048eb1<+16>:mov%eax,0x8(%esp)此處為第一個(gè)數(shù)字。0x08048eb5<+20>:movl$0x804a23e,0x4(%esp)用x/sOx804a23e命令查#$Ox804a23e為0x08048ebd<+28>:mov0x8(%ebp)eax%d%d,即要輸入兩個(gè)整0x08048eaa<+9>:0mov0x08048eae<+13>:1ea—0xc(%ebp),%eax0x08048eb1<+16>:mov%eax,0x8(%esp)此處為第一個(gè)數(shù)字。0x08048eb5<+20>:movl$0x804a23e,0x4(%esp)用x/sOx804a23e命令查#$Ox804a23e為0x08048ebd<+28>:mov0x8(%ebp)eax%d%d,即要輸入兩個(gè)整數(shù),上面已經(jīng)指出。0x08048ec0<+31>:0mov%eax,(%esp)0x08048ec3<+34>:回cal0x8048840<_isoc99_sscanf@plt>0x08048ec8<+39>:cmp$0x1,%eax以上兩行即規(guī)定輸入至少兩組數(shù)據(jù),否則引爆。0x08048ecb<+42>:jg0x8048ed2<phase_3+49>0x08048ecd<+44>:cal10x80490dl<explode_bomb>0x08048ed2<+49>:cmplS0x7,-Oxc(%ebp)第一個(gè)數(shù)大于7引爆,即%eax,0xc(%esp)此處為第二個(gè)數(shù)字。0x08048ed6<+53>:0x08048ed8<+55>:mov-0xc(%ebp),%eax第一個(gè)數(shù)小于等于0x08048ed6<+53>:0x08048ed8<+55>:mov-0xc(%ebp),%eaxOx8048f43<phase_3+162>0x08048edb<+58>:jmp*0x804ala0(,%eax,4)跳轉(zhuǎn)至0x804ala0+eax*4(第一個(gè)數(shù))內(nèi)數(shù)據(jù)所0x08048edb<+58>:jmpOx08048ee2<+65>:0mov$0xO,%eax指的行數(shù)。0x08048ee7<+70>:0jmp0x8048f3c<phase_3+l55>$OxO,%eax0x08048ee9<+72>:mov%ax,%ax$OxO,%eax%ax,%ax%ax,%ax0x08048eee<+77>:0xchg%ax,%ax0x08048ef0<+79>:jmpOx8048f37<phase_3+150>0x08048ef2<+81>:0mov$0x0,%eax0x08048ef7<+86>:0jmp0x8048f32<phase_3+145>0x08048ef9<+88>:0mov$0x0,%eaxOx08048efe<+93>:%ax,%ax0x08048f00<+95>:jmp0x8048f2d<phase_3+140>$0x0,%$0x0,%eaxOx08048f07<+102>:jmp0x8048f28<phase_3+135>Ox08048f07<+102>:jmp0x08048f09<+104>:$0x0,%eax0xO8048fOe<+109>:xchg%ax,%ax0x08048f10<+lll>:jmp0x8048f23<phase_3+130>0x08048f12<+113>:mov$0x314,%eax當(dāng)?shù)谝粋€(gè)數(shù)為0時(shí)跳轉(zhuǎn)到此處,第二個(gè)數(shù)x=788。0x08048fl7<+118>:jmp0x8048fle<phase_3+125>跳轉(zhuǎn)到0x8048fleo0x08048f19<4-120>:mov$0x0?%eax0x08048fle<+125>:sub$0x35a,%eaxx=x-8580x08048f23<+l30>:add$0x2ef>%eaxx=x+7510x08048f28<+135>:su$0x216,%eaxx=x-5340x08048f2d<+140>:add$0x216,%eaxx=x+5340x08048f32<+l45>:sub$0x216,%eaxx=x-5340x08048f37<+150>:add$0x216,%eaxx=x+5340x08048f3c<+155>:sub$0x216,%eaxx=x-5340x08048f41<+160>:jmp0x8048f4d<phase_3+172>跳轉(zhuǎn)到0x8048f4d行。0x08048f43<+l62>:call0x80490dl<explode_bomb>0x08048f48<+167>:mov$0x0,%eax0x08048f4d<+172>:cmpl$0x5,-Oxc(%ebp)第一個(gè)數(shù)大于5引爆,即第一個(gè)數(shù)小于等于5。0X08048f51<+176>:jg0x8048f

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論