華中科技大學(xué)計算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報告_第1頁
華中科技大學(xué)計算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報告_第2頁
華中科技大學(xué)計算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報告_第3頁
華中科技大學(xué)計算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報告_第4頁
華中科技大學(xué)計算機(jī)系統(tǒng)基礎(chǔ)實(shí)驗(yàn)報告_第5頁
已閱讀5頁,還剩16頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

./課程實(shí)驗(yàn)報告課程名稱:計算機(jī)系統(tǒng)基礎(chǔ)專業(yè)班級:學(xué)號:姓名:指導(dǎo)教師:報告日期:2016年5月24日計算機(jī)科學(xué)與技術(shù)學(xué)院目錄實(shí)驗(yàn)1:2實(shí)驗(yàn)2:9實(shí)驗(yàn)3:22實(shí)驗(yàn)總結(jié)30.實(shí)驗(yàn)1:數(shù)據(jù)表示1.1實(shí)驗(yàn)概述本實(shí)驗(yàn)的目的是更好地熟悉和掌握計算機(jī)中整數(shù)和浮點(diǎn)數(shù)的二進(jìn)制編碼表示。實(shí)驗(yàn)中,你需要解開一系列編程"難題"——使用有限類型和數(shù)量的運(yùn)算操作實(shí)現(xiàn)一組給定功能的函數(shù),在此過程中你將加深對數(shù)據(jù)二進(jìn)制編碼表示的了解。實(shí)驗(yàn)語言:c;實(shí)驗(yàn)環(huán)境:linux1.2實(shí)驗(yàn)容需要完成bits.c中下列函數(shù)功能,具體分為三大類:位操作、補(bǔ)碼運(yùn)算和浮點(diǎn)數(shù)操作。1.3實(shí)驗(yàn)設(shè)計源碼如下:/**lsbZero-set0totheleastsignificantbitofx*Example:lsbZero<0x87654321>=0x87654320*Legalops:!~&^|+<<>>*Maxops:5*Rating:1*/intlsbZero<intx>{//x右移一位再左移一位實(shí)現(xiàn)把最低有效位置0x=x>>1;x=x<<1;returnx;}/**byteNot-bit-inversiontobytenfromwordx*Bytesnumberedfrom0<LSB>to3<MSB>*Examples:getByteNot<0x12345678,1>=0x1234A978*Legalops:!~&^|+<<>>*Maxops:6*Rating:2*/intbyteNot<intx,intn>{//x第n個字節(jié)每位都和1異或?qū)崿F(xiàn)取反inty=0xff;n=n<<3;y=y<<n;x=<x^y>;returnx;}/**byteXor-comparethenthbyteofxandy,ifitissame,return0,ifnot,return1*example:byteXor<0x12345678,0x87654321,1>=1* byteXor<0x12345678,0x87344321,2>=0*Legalops:!~&^|+<<>>*Maxops:20*Rating:2*/intbyteXor<intx,inty,intn>{//把x和y的第n個字節(jié)取出來異或,再轉(zhuǎn)換為邏輯的0和1n=n<<3;x=x>>n;y=y>>n;x=x&<0xff>;y=y&<0xff>;return!!<x^y>;}/**logicalAnd-x&&y*Legalops:!~&^|+<<>>*Maxops:20*Rating:3*/intlogicalAnd<intx,inty>{//把x和y分別轉(zhuǎn)化為邏輯的0和1,再相與x=<!<!x>>&<!<!y>>;returnx;}/**logicalOr-x||y*Legalops:!~&^|+<<>>*Maxops:20*Rating:3*/intlogicalOr<intx,inty>{//把x和y分別轉(zhuǎn)化為邏輯的0和1,再相或x=<!<!x>>|<!<!y>>;returnx;}/**rotateLeft-Rotatextotheleftbyn*Canassumethat0<=n<=31*Examples:rotateLeft<0x87654321,4>=0x76543218*Legalops:~&^|+<<>>!*Maxops:25*Rating:3*/introtateLeft<intx,intn>{//先構(gòu)造低n位為1,高〔32-n位為0的數(shù)z,x左移n位后的數(shù)加上x右移〔32-n位的數(shù)&z即可intz;z=~<<<1<<31>>>31><<n>;x=<<x>><32+<~n+1>>>&z>+<x<<n>;returnx;}/**parityCheck-returns1ifxcontainsanoddnumberof1's*Examples:parityCheck<5>=0,parityCheck<7>=1*Legalops:!~&^|+<<>>*Maxops:20*Rating:4*/intparityCheck<intx>{//每次將數(shù)的低半數(shù)位與高半數(shù)位比較,再把y右移31位,最后把y轉(zhuǎn)化為邏輯的0和1inty;y=x<<16;y=y^x;y=y^<y<<8>;y=y^<y<<4>;y=y^<y<<2>;y=y^<y<<1>;y=y>>31;return!<!y>;}/**mul2OK-Determineifcancompute2*xwithoutoverflow*Examples:mul2OK<0x30000000>=1*mul2OK<0x40000000>=0**Legalops:~&^|+<<>>*Maxops:20*Rating:2*/intmul2OK<intx>{//把x第31位和30位分別和1做按位與,再異或,再和1異或intm;m=<<x>>31>&0x1>^<<x>>30>&0x1>;returnm^0x1;}/**mult3div2-multipliesby3/2roundingtoward0,*ShouldexactlyduplicateeffectofCexpression<x*3/2>,*includingoverflowbehavior.*Examples:mult3div2<11>=16*mult3div2<-9>=-13*mult3div2<1073741824>=-536870912<overflow>*Legalops:!~&^|+<<>>*Maxops:12*Rating:2*/intmult3div2<intx>{//左移一位再+x即x*3,右移一位的時候,當(dāng)y的最高位和最低位都為0時還要+1inty=<x<<1>+x;y=<y>>1>+<<<y>>31>&1>&<<<y<<31>>>31>&1>>;returny;}/**subOK-Determineifcancomputex-ywithoutoverflow*Example:subOK<0x80000000,0x80000000>=1,*subOK<0x80000000,0x70000000>=0,*Legalops:!~&^|+<<>>*Maxops:20*Rating:3*/intsubOK<intx,inty>{//x的最高有效位和y的最高有效位不同且x和〔x-y的最高位不同才能判斷溢出intm=<x>>31>&1;intn=<y>>31>&1;x=<m^n>&<m^<<<x+<~y+1>>>>31>&1>>;return<!x>;}/**absVal-absolutevalueofx*Example:absVal<-1>=1.*Youmayassume-TMax<=x<=TMax*Legalops:!~&^|+<<>>*Maxops:10*Rating:4*/intabsVal<intx>{//x最高位為0時就是x,最高位為1時是~x+1inty=x>>31;x=<y&<~x+1>>+<<~y>&x>;returnx;}/**float_abs-Returnbit-levelequivalentofabsolutevalueofffor*floatingpointargumentf.*Boththeargumentandresultarepassedasunsignedint's,but*theyaretobeinterpretedasthebit-levelrepresentationsof*single-precisionfloatingpointvalues.*WhenargumentisNaN,returnargument..*Legalops:Anyinteger/unsignedoperationsincl.||,&&.alsoif,while*Maxops:10*Rating:2*/unsignedfloat_abs<unsigneduf>{intx=uf&<~<1<<31>>;if<x>0x7f800000>{returnuf;}elsereturnx;}/**float_f2i-Returnbit-levelequivalentofexpression<int>f*forfloatingpointargumentf.*Argumentispassedasunsignedint,but*itistobeinterpretedasthebit-levelrepresentationofa*single-precisionfloatingpointvalue.*Anythingoutofrange<includingNaNandinfinity>shouldreturn*0x80000000u.*Legalops:Anyinteger/unsignedoperationsincl.||,&&.alsoif,while*Maxops:30*Rating:4*/intfloat_f2i<unsigneduf>{unsignednum=0x80000000;intx=<uf&0x007fffff>^0x00800000;intorder=0;order=<uf&0x7f800000>>>23;if<order>158>{returnnum;}if<order<127>return0;elseif<<<uf>>31>&1>==1>{if<order>150>{return~<x<<<order-150>>+1;}elsereturn~<x>><150-order>>+1;}else{if<order>150>returnx<<<order-150>;elsereturnx>><150-order>;}}1.4實(shí)驗(yàn)過程編寫源碼,運(yùn)行btest,得出實(shí)驗(yàn)結(jié)果。1.5實(shí)驗(yàn)結(jié)果可見13個函數(shù)全部正確。1.6實(shí)驗(yàn)小結(jié)此次實(shí)驗(yàn)主要考查的是對數(shù)據(jù)的處理,對此需要掌握數(shù)據(jù)在機(jī)器中的表示,運(yùn)用合理的位運(yùn)算來實(shí)現(xiàn)相應(yīng)的功能。實(shí)驗(yàn)2:BinaryBombs2.1實(shí)驗(yàn)概述本實(shí)驗(yàn)中,你要使用課程所學(xué)知識拆除一個"binarybombs"來增強(qiáng)對程序的機(jī)器級表示、匯編語言、調(diào)試器和逆向工程等方面原理與技能的掌握。一個"binarybombs"〔二進(jìn)制炸彈,下文將簡稱為炸彈是一個Linux可執(zhí)行C程序,包含了6個階段〔phase1~phase6。炸彈運(yùn)行的每個階段要求你輸入一個特定的字符串,若你的輸入符合程序預(yù)期的輸入,該階段的炸彈就被"拆除",否則炸彈"爆炸"并打印輸出"BOOM!!!"字樣。實(shí)驗(yàn)的目標(biāo)是拆除盡可能多的炸彈層次。每個炸彈階段考察了機(jī)器級語言程序的一個不同方面,難度逐級遞增:*階段1:字符串比較*階段2:循環(huán)*階段3:條件/分支*階段4:遞歸調(diào)用和棧*階段5:指針*階段6:鏈表/指針/結(jié)構(gòu)另外還有一個隱藏階段,但只有當(dāng)你在第4階段的解之后附加一特定字符串后才會出現(xiàn)。為了完成二進(jìn)制炸彈拆除任務(wù),你需要使用gdb調(diào)試器和objdump來反匯編炸彈的可執(zhí)行文件,并單步跟蹤調(diào)試每一階段的機(jī)器代碼,從中理解每一匯編語言代碼的行為或作用,進(jìn)而設(shè)法"推斷"出拆除炸彈所需的目標(biāo)字符串。這可能需要你在每一階段的開始代碼前和引爆炸彈的函數(shù)前設(shè)置斷點(diǎn),以便于調(diào)試。實(shí)驗(yàn)語言:C語言實(shí)驗(yàn)環(huán)境:linux2.2實(shí)驗(yàn)容反匯編bomb,得到匯編代碼,根據(jù)匯編代碼完成拆炸彈任務(wù)。2.2.1階段1字符串比較1.任務(wù)描述:找到與輸入的字符串進(jìn)行比較的存儲的字符串的首地址,進(jìn)而得到存儲的字符串,得到結(jié)果。2.實(shí)驗(yàn)設(shè)計:根據(jù)反匯編代碼一步一步分析,具體見實(shí)驗(yàn)過程。3.實(shí)驗(yàn)過程:將bomb反匯編輸出到asm.txt文件中,在反匯編代碼中查找phase_1的位置:從上面的語句可以看出<strings_not_equal>所需要的兩個變量是存在于%ebp所指的堆棧存儲單元里,在main函數(shù)中:得知%eax里存儲的是調(diào)用read_line<>函數(shù)后返回的結(jié)果,就是輸入的字符串,所以得知和用戶輸入字符串比較的字符串的存儲地址為0x804a204,可用gdb查看這個地址存儲的數(shù)據(jù)容:翻譯過后的結(jié)果為Thefuturewillbebettertomorrow.4.實(shí)驗(yàn)結(jié)果:可見結(jié)果正確。2.2.2階段2循環(huán)1.任務(wù)描述:完成炸彈2的拆除2.實(shí)驗(yàn)設(shè)計:觀察分析phase_2代碼,使用gdb調(diào)試分析結(jié)果3.實(shí)驗(yàn)過程:找到phase_2代碼:由read_six_numbers知是要輸入6個數(shù)字,觀察:可知輸入的第一個和第二個必須依次為0,1觀察這兩個循環(huán)可知只有當(dāng)輸入的數(shù)為前兩個數(shù)之和時才不會bomb,故得到序列0,1,1,2,3,54.實(shí)驗(yàn)結(jié)果:輸入上述序列后得:可知結(jié)果正確。2.2.3階段3條件/分支1.任務(wù)描述:完成炸彈3的拆除2.實(shí)驗(yàn)設(shè)計:觀察分析phase_3代碼,使用gdb調(diào)試分析結(jié)果3.實(shí)驗(yàn)過程:找到phase_3代碼如下:08048c0a<phase_3>:8048c0a: 83ec3c sub$0x3c,%esp8048c0d: 8d44242c lea0x2c<%esp>,%eax8048c11: 89442410 mov%eax,0x10<%esp>8048c15: 8d442427 lea0x27<%esp>,%eax8048c19: 8944240c mov%eax,0xc<%esp>8048c1d: 8d442428 lea0x28<%esp>,%eax8048c21: 89442408 mov%eax,0x8<%esp>8048c25: c74424044ea204 movl$0x804a24e,0x4<%esp>由此行代碼查看輸入容:可知輸入的依次是數(shù)字、字符、數(shù)字8048c43: 837c242807 cmpl$0x7,0x28<%esp>8048c48: 0f87f5000000 ja8048d43<phase_3+0x139>…8048d43: e88d040000 call80491d5<explode_bomb>可見輸入的第一個數(shù)一定小于78048c4e: 8b442428 mov0x28<%esp>,%eax8048c52: ff248560a20408 jmp*0x804a260<,%eax,4>假設(shè)輸入的第一個數(shù)為0,即<%eax>=0,所以:8048c59: b876000000 mov$0x76,%eax8048c5e: 817c242c040100 cmpl$0x104,0x2c<%esp>所以第二個字符ascll碼為0x76,即字符'v'而第三個數(shù)為0x104,即2604.實(shí)驗(yàn)結(jié)果:從實(shí)驗(yàn)結(jié)果來看結(jié)果正確,拆彈成功。2.2.4階段4遞歸調(diào)用和棧1.任務(wù)描述:拆除炸彈42.實(shí)驗(yàn)設(shè)計:觀察分析phase_4代碼,使用gdb調(diào)試分析結(jié)果3.實(shí)驗(yàn)過程:用x/sb0x804a3cf來查詢有幾個輸入以及輸入的類型,如下所示:由此可見輸入是兩個整數(shù)。再由phase_4中:知道func4第二個參數(shù)值為1f,即37再仔細(xì)研究func4函數(shù),發(fā)現(xiàn)其實(shí)現(xiàn)了遞歸調(diào)用:08048d5c<func4>:8048d5c: 56 push%esi8048d5d: 53 push%ebx8048d5e: 83ec14 sub$0x14,%esp8048d61: 8b542420 mov0x20<%esp>,%edx/ebx是傳遞的參數(shù)/8048d65: 8b442424 mov0x24<%esp>,%eax8048d69: 8b742428 mov0x28<%esp>,%esi8048d6d: 89f1 mov%esi,%ecx8048d6f: 29c1 sub%eax,%ecx8048d71: 89cb mov%ecx,%ebx8048d73: c1eb1f shr$0x1f,%ebx/ebx右移31位/8048d76: 01d9 add%ebx,%ecx8048d78: d1f9 sar%ecx8048d7a: 8d1c01 lea<%ecx,%eax,1>,%ebx8048d7d: 39d3 cmp%edx,%ebx8048d7f: 7e17 jle8048d98<func4+0x3c>8048d81: 8d4bff lea-0x1<%ebx>,%ecx8048d84: 894c2408 mov%ecx,0x8<%esp>8048d88: 89442404 mov%eax,0x4<%esp>8048d8c: 891424 mov%edx,<%esp>8048d8f: e8c8ffffff call8048d5c<func4>8048d94: 01d8 add%ebx,%eax8048d96: eb1b jmp8048db3<func4+0x57>8048d98: 89d8 mov%ebx,%eax8048d9a: 39d3 cmp%edx,%ebx8048d9c: 7d15 jge8048db3<func4+0x57>8048d9e: 89742408 mov%esi,0x8<%esp>8048da2: 8d4301 lea0x1<%ebx>,%eax8048da5: 89442404 mov%eax,0x4<%esp>8048da9: 891424 mov%edx,<%esp>8048dac: e8abffffff call8048d5c<func4>8048db1: 01d8 add%ebx,%eax8048db3: 83c414 add$0x14,%esp8048db6: 5b pop%ebx8048db7: 5e pop%esi8048db8: c3 ret下面就來剖析func4,這個函數(shù)在確定棧之后,首先取出來傳遞給它的參數(shù),依次放在eax,edx,esi.中,從一個jle和一個jge可以看出,這個遞歸函數(shù)跳出的條件根據(jù)func4的第二個參數(shù)和第二個參數(shù)進(jìn)過種種運(yùn)算的結(jié)果等于第一個參數(shù)即可。注意在遞歸過程中第一個參數(shù)是不變的,最后返回值是經(jīng)過運(yùn)算后的ebx加上第一個參數(shù)。當(dāng)時做實(shí)驗(yàn)時推出了具體的表達(dá)式,未記錄下來,只記錄了最后得出fun<11>=31。運(yùn)行結(jié)果如下:由此可見,phase_4拆除成功!4.實(shí)驗(yàn)結(jié)果:給出階段x的實(shí)驗(yàn)結(jié)果和必要的結(jié)果分析2.2.5階段5phase_51.任務(wù)描述:拆除一個關(guān)于指針的炸彈。2.實(shí)驗(yàn)設(shè)計:此階段實(shí)驗(yàn)與指針相關(guān),又根據(jù)靜態(tài)調(diào)試跟蹤可知,需借助gdb的動態(tài)調(diào)試跟蹤來查找相關(guān)地址中存放的數(shù)據(jù)的值,進(jìn)而分析出最終的拆彈密碼。3.實(shí)驗(yàn)過程:首先觀察代碼,分析代碼時發(fā)現(xiàn)有多個跳轉(zhuǎn)指令,具體為x>15時,bomb;x>=1時,取x低4位;使用gdb調(diào)試發(fā)現(xiàn),要輸入的是兩個%d數(shù)。由后面的步驟知輸入第一個數(shù)為初始數(shù)組下標(biāo),第二個數(shù)為循環(huán)15次累加求的和。再接著:8048e70: 8b048580a20408 mov0x804a280<,%eax,4>,%eax,這句就是從<0x804a280+eax*4>里面拿數(shù)據(jù)出來,加到eax上。因?yàn)閑ax只能是0~F的數(shù),所以0x804a260這個地址里面存的應(yīng)該是一個數(shù)據(jù)大小為16的數(shù)組,用gdb看,得到:觀察到果然是一個數(shù)組,然后下面就是把5個輸入對應(yīng)ascll碼的低4位轉(zhuǎn)換的十進(jìn)制數(shù)對應(yīng)的數(shù)值一個一個的轉(zhuǎn)化為這個數(shù)組,得到累加值ecx。觀察循環(huán)部分:由此知當(dāng)退出循環(huán)的條件是取出的數(shù)eax為15,而且循環(huán)次數(shù)為15次由于115=12+3+7+11+13+9+4+8+10+1+2+14+6+15=a<5>+a<12>+a<6>最后得到的ecx值是115,輸入的初始數(shù)組下標(biāo)為5。所以答案為:51154.實(shí)驗(yàn)結(jié)果:可知結(jié)果正確。2.2.6階段6phase_61.任務(wù)描述:拆除一個關(guān)于鏈表/指針/結(jié)構(gòu)的炸彈。2.實(shí)驗(yàn)設(shè)計:初步靜態(tài)分析,此階段代碼有些過長,所以單純通過靜態(tài)調(diào)試跟蹤有些困難,因此我首先找到幾個循環(huán)體,通過靜態(tài)調(diào)試跟蹤和動態(tài)調(diào)試跟蹤的方法來確認(rèn)循環(huán)體的功能,最后將循環(huán)體結(jié)合起來,拆除此階段炸斷。3.實(shí)驗(yàn)過程:由于代碼較長,為便于分析,先總結(jié)一下,phase_6分為:參數(shù)讀取,一個雙層循環(huán),三個單層循環(huán)。首先是參數(shù)讀取:由此可見,readsix_number所有參數(shù)均小于6且不相等。由于后面代碼部分過多,便采用gdb單步執(zhí)行來了解代碼的功能。在此,觀察到后面:可以看到輸入六個數(shù)字的初始地址值在0x804c13c,再由for循環(huán)中:8048ebf: 8b5208 mov0x8<%edx>,%edx可以看出六個數(shù)字按8個字節(jié)的順序進(jìn)行排列,因此分別調(diào)用gdb查看<0x804c13c>、*<0x804c13c+0x8>、*<*<0x804c13c+0x8>+0x8>、*<*<*<0x804c13c+0x8>+0x8>+0x8>、*<*<*<*<0x804c13c+0x8>+0x8>+0x8>+0x8>、*<*<*<*<*<0x804c13c+0x8>+0x8>+0x8>+0x8>+0x8>的值即可。如圖所示:在下面檢測鏈表值時,要求鏈表值從大到小排列。由上圖可以看出,鏈表原本各個位置的值按順序排列位:292385c63db7e308。按從小到大順序排列應(yīng)該為:7ec62923083853db。由此可以看出,用戶應(yīng)該輸入:531624。4.實(shí)驗(yàn)結(jié)果:可見結(jié)果正確。1.3實(shí)驗(yàn)小結(jié)本次實(shí)驗(yàn)熟悉了obj、gdb的各種操作,對數(shù)據(jù)在計算機(jī)中的存儲有了更加清晰的認(rèn)識,更加加深了對匯編代碼的理解,對循環(huán)、分支、數(shù)組指針結(jié)構(gòu)在機(jī)器部的存儲有了更深刻的認(rèn)識。實(shí)驗(yàn)3:緩沖區(qū)溢出攻擊3.1實(shí)驗(yàn)概述本實(shí)驗(yàn)的目的在于加深對IA-32函數(shù)調(diào)用規(guī)則和棧結(jié)構(gòu)的具體理解。實(shí)驗(yàn)的主要容是對一個可執(zhí)行程序"bufbomb"實(shí)施一系列緩沖區(qū)溢出攻擊〔bufferoverflowattacks,也就是設(shè)法通過造成緩沖區(qū)溢出來改變該可執(zhí)行程序的運(yùn)行存映像,繼而執(zhí)行一些原來程序中沒有的行為,例如將給定的字節(jié)序列插入到其本不應(yīng)出現(xiàn)的存位置等。本次實(shí)驗(yàn)需要你熟練運(yùn)用gdb、objdump、gcc等工具完成。實(shí)驗(yàn)中你需要對目標(biāo)可執(zhí)行程序BUFBOMB分別完成5個難度遞增的緩沖區(qū)溢出攻擊。5個難度級分別命名為Smoke〔level0、Fizz〔level1、Bang〔level2、Boom〔level3和Nitro〔level4,其中Smoke級最簡單而Nitro級最困難。實(shí)驗(yàn)語言:c;實(shí)驗(yàn)環(huán)境:linux3.2實(shí)驗(yàn)容設(shè)法通過造成緩沖區(qū)溢出來改變該可執(zhí)行程序的運(yùn)行存映像,繼而執(zhí)行一些原來程序中沒有的行為。3.2.0階段0smoke1.任務(wù)描述:將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行smoke函數(shù)。2.實(shí)驗(yàn)設(shè)計:首先根據(jù)反匯編代碼求得buf離返回地址的字節(jié)距離,確定要填充幾個字節(jié),然后找到smoke函數(shù)的起始地址,把這個地址填入buf末尾,即可實(shí)現(xiàn)該功能。3.實(shí)驗(yàn)過程:首先通過gdb工具對bufbomb文件進(jìn)行反匯編,查看getbuf的匯編代碼:可見lea把buf的指針地址-0x28<%ebp>傳給了Gets<>,所以buf離返回地址有0x28+4=44個字節(jié)的距離,因此只要在buf處開始填44個字節(jié)的非'\n'數(shù),接下來填寫要返回的地址,因?yàn)橐祷刂羢moke,查看smoke函數(shù)的代碼:可見smoke函數(shù)起始地址為0x08048c90,所以最后四個字節(jié)應(yīng)該填入908c0408,所以輸入的48個字節(jié)為:0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000908c04084.實(shí)驗(yàn)結(jié)果:可見getbuf成功返回至smoke。3.2.1階段1fizz1.任務(wù)描述:將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行fizz函數(shù)。2.實(shí)驗(yàn)設(shè)計:跟階段0類似,多了一個比較cookie環(huán)節(jié),所以要把cookie填入相應(yīng)地址。3.實(shí)驗(yàn)過程:只是將執(zhí)行的函數(shù)從smoke改為fizz,查看fizz的匯編代碼:可知val變量存儲地址為fizz函數(shù)中的0x8<%ebp>,而fizz函數(shù)開始的地址為08048cba,所以輸入的前44個字節(jié)為非'\n'任意值,第45-48個字節(jié)存放fizz函數(shù)起始地址,即ba8c0408,接下來4字節(jié)也是非'\n'值,最后為cookie值,即07ab9967,所以輸入的56個字節(jié)為0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ba8c04080000000007ab99674.實(shí)驗(yàn)結(jié)果:可見成功返回至fizz。3.2.2階段2bang1.任務(wù)描述:將getbuf函數(shù)執(zhí)行return后執(zhí)行test函數(shù)改為執(zhí)行bang函數(shù)。2.實(shí)驗(yàn)設(shè)計:找到cookie的地址和global_value的地址,將global_value的值改為cookie值,再使函數(shù)成功跳至bang執(zhí)行。3.實(shí)驗(yàn)過程:先觀察bang的代碼:bang函數(shù)的首地址0x08048d05,在bang函數(shù)中,會將全局變量global_value和cookie進(jìn)行比較,global_value的地址是0x804c218,cookie的地址是0x804c220,global_value在c代碼中顯示為0,所以需要修改global_value的值使其與cookie一致。匯編代碼為:mov 0x804c220,%eaxmov %eax,0x804c218ret將這4行代碼保存至example.s文件,進(jìn)行匯編和反匯編,查看example.d文件得到指令序列:a120c20408a318c20408c3設(shè)置斷點(diǎn)查看cookie為0x6799ab07時buf的首地址:為0x55683148,綜合之前的指令序列,45-48字節(jié)放buf首址,49-52放bang函數(shù)首址,得到:a120c20408a318c20408c30

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論