華科-計(jì)算機(jī)系統(tǒng)試驗(yàn)報(bào)告_第1頁
華科-計(jì)算機(jī)系統(tǒng)試驗(yàn)報(bào)告_第2頁
華科-計(jì)算機(jī)系統(tǒng)試驗(yàn)報(bào)告_第3頁
華科-計(jì)算機(jī)系統(tǒng)試驗(yàn)報(bào)告_第4頁
華科-計(jì)算機(jī)系統(tǒng)試驗(yàn)報(bào)告_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

印中科技上浮課程實(shí)驗(yàn)報(bào)告課程名稱: 計(jì)算機(jī)系統(tǒng)基礎(chǔ)專業(yè)班級: 學(xué)號: 姓名: 指導(dǎo)教師: 報(bào)告日期: 年月日計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院目錄TOC\o"1-5"\h\z實(shí)驗(yàn)1: 1實(shí)驗(yàn)2: 7實(shí)驗(yàn)3: 24\o"CurrentDocument"實(shí)驗(yàn)總結(jié) 34實(shí)驗(yàn)1: 數(shù)據(jù)表示 實(shí)驗(yàn)概述實(shí)驗(yàn)?zāi)康模焊玫厥煜ず驼莆沼?jì)算機(jī)中整數(shù)和浮點(diǎn)數(shù)的二進(jìn)制編碼表示。實(shí)驗(yàn)?zāi)繕?biāo):加深對數(shù)據(jù)二進(jìn)制編碼表示的了解。實(shí)驗(yàn)要求:使用有限類型和數(shù)量的運(yùn)算操作實(shí)現(xiàn)一組給定功能的函數(shù)。實(shí)驗(yàn)語言:c。實(shí)驗(yàn)環(huán)境:linux實(shí)驗(yàn)內(nèi)容需要完成bits.c中下列函數(shù)功能,具體分為三大類:位操作、補(bǔ)碼運(yùn)算和浮點(diǎn)數(shù)操作。1)位操作表1列出了bits.c中一組操作和測試位組的函數(shù)。其中,“級別”欄指出各函數(shù)的難度等級(對應(yīng)于該函數(shù)的實(shí)驗(yàn)分值),“功能”欄給出函數(shù)應(yīng)實(shí)現(xiàn)的輸出(即功能),“約束條件”欄指出你的函數(shù)實(shí)現(xiàn)必須滿足的編碼規(guī)則(具體請查看bits.c中相應(yīng)函數(shù)注釋),“最多操作符數(shù)量”指出你的函數(shù)實(shí)現(xiàn)中允許使用的操作符的最大數(shù)量。你也可參考tests.c中對應(yīng)的測試函數(shù)來了解所需實(shí)現(xiàn)的功能,但是注意這些測試函數(shù)并不滿足目標(biāo)函數(shù)必須遵循的編碼約束條件,只能用做關(guān)于目標(biāo)函數(shù)正確行為的參考。表1位操作題目列表級別函數(shù)名功能約束條件最多操作符數(shù)1IsbZero將*的最低有效位(匕58)清零僅能使用!?&AI+<<>>52byteNot將x的第n個字節(jié)取反(字節(jié)以SB開始到MSB依次編號為0-3)僅能使用!?&A|+<<>>62byteXor比較x和y的第n個字節(jié)(字節(jié)從LSB開始到MSB依次編號為0-3),若不同,則返回1;若相同,則返回0僅能使用!?&A|+<<>>20

3logicalAndx&&y僅能使用!?&Al+<<>>203logicalOrxlly僅能使用!?&A|+<<>>203rotateLeft將x循環(huán)左移"立僅能使用!?&A|+<<>>254parityCheck若*有奇數(shù)個1,則返回1;否則,返回0僅能使用!?&A|+<<>>202)補(bǔ)碼運(yùn)算表2列出了bits.c中一組使用整數(shù)的補(bǔ)碼表示的函數(shù)??蓞⒖糱its.c中注釋說明和tests.c中對應(yīng)的測試函數(shù)了解其更多具體信息。表2補(bǔ)碼運(yùn)算題目列表級別函數(shù)名功能約束條件最多操作符數(shù)2mul2OK計(jì)算2*x,如果不溢出,則返回1,否則,返回0僅能使用?&a|+<<>>202mult3div2計(jì)算(x*3)/2,朝零方向取整僅能使用!?&A|+<<>>123subOK計(jì)算x-y,如果不溢出,則返回1,否則,返回0僅能使用!?&A|+<<>>204absVal求x的絕對值僅能使用!?&A|+<<>>103)浮點(diǎn)數(shù)操作表3列出了bits.c中一組浮點(diǎn)數(shù)二進(jìn)制表示的操作函數(shù)??蓞⒖糱its.c中注釋說明和tests.c中對應(yīng)的測試函數(shù)了解其更多具體信息。注意float_abs的輸入?yún)?shù)和返回結(jié)果(以及float_f2i函數(shù)的輸入?yún)?shù))均為unsignedint類型,但應(yīng)作為單精度浮點(diǎn)數(shù)解釋其32bit二進(jìn)制表示對應(yīng)的值。表3浮點(diǎn)數(shù)操作題目列表級別函數(shù)名功能約束條件最多操作符數(shù)2float_abs返回浮點(diǎn)數(shù)’|中的二進(jìn)制僅能使用任何整型/無符10表示,當(dāng)輸入?yún)?shù)是NaN時,返回NaN號整型操作,包括II,&&以及if,while控制結(jié)構(gòu)4float_f2i返回浮點(diǎn)數(shù)f的強(qiáng)制整型轉(zhuǎn)換“(代)儼表示僅能使用任何整型/無符號整型操作,包括II,&&以及if,while控制結(jié)構(gòu)30實(shí)驗(yàn)設(shè)計(jì)根據(jù)題目要求,選擇合適的操作符來編寫代碼。具體設(shè)計(jì)參考實(shí)驗(yàn)過程中的代碼注釋。實(shí)驗(yàn)過程閱讀相應(yīng)的函數(shù)要求,利用合適的操作符編寫代碼。如下:lsbZero函數(shù):HintlsbZero(intx)(return:”式與11111111111111111111111111111110B進(jìn)行與運(yùn)算1 //其中111,111111111Lill111111111111LllOB逋過1的取反來將到圖1.1byteNot函數(shù):FlintbyteNot(int羽intn)[return(Oxff?(n<<3));//取反可以對改為對某個掩碼的異或來實(shí)現(xiàn)) //通過將Oxff向左移位n的,次方來構(gòu)成掩碼圖1.2byteXor函數(shù):EintbyteKorfintx,Lntysintn){return1!((x£(Dxff<<(n?3)))-(泄(Oxff<<(n?3))));J〃類似.匕一題做出相應(yīng)的字節(jié),然后通過異或.運(yùn)算以及邏輯取反來輸出正確的輸出圖1.3logicalAnd函數(shù):BintlogicalAnd(intxtinty){return!!((I !v)&0x2);〃利用兩次邏輯取反來取出冗,y代表的邏輯值} 〃相加后與0x2進(jìn)行且運(yùn)算后再道過邏輯取反來輸出正確的輸出圖1.4logicalOr函數(shù):□intlogicalOr(intxFinty){return]1((!!x+lly));//利用兩次邏輯取反來取出x,y代表的邏輯值} //相加后再通過邏輯取反來輸出正確的輸出

圖圖1.5rotateLeft函數(shù):-lintrotateLeft(intint哨{inty=x;//利用y取出x左邊門位.y向右趨動32~n位*再取出低n位.returD(x?n)|HyA「n+33)}&n+n<Q)+D); 〃其中涉及的減法都是利用反反』II-來實(shí)現(xiàn)的} //最后進(jìn)行一次與運(yùn)算圖1.6parityCheck函數(shù):BintparityCheck(int工){x=x"(x>>16):(x>>8);x=k"(x>>4);a=x"(z?2);x=F(x?l);returnx&l;} //利用異或運(yùn)算的特點(diǎn)依次折半來操作,最后取出最低位也就是結(jié)果圖1.7mu120K函數(shù):□intQiu12CK(intk){nt內(nèi)//是否港生就是看芯與2K符號位是否一樣return(((Cx^(y?l))?31)&1)1);} “所以將區(qū)與2x異或后取出最高位判斷圖1.8mult3div2函數(shù):Bintmult3div2(intx){inty=x,z:2=y=y+(y?l);//y等干3x2-z?31;//工是3x的符號位return(Cz)fi[y?l))+(E&((y?l)+(y&l))1;//e為0,直接輸出y/2即可10.subOK函數(shù):)〃當(dāng)工為1時,將y/2加上y10.subOK函數(shù):EzintsubOK(intx3inty){intz=C>,+l+x)>>31;//x-y的符號位y=>?31;y的符中ix=^>31;Hx的符號位return!屋y));//當(dāng)且僅當(dāng)減數(shù)與被減數(shù)符號不同但被減數(shù)與差符號捋同才判斷為潛出) //故利口三或以及道輯取應(yīng)來輸出正確的輸出圖1.9圖1.10absVal函數(shù):SintabsVal(intx){inty=y?31;/7y為k符號位ret^n(「WaxHlyM'+Ub/yftUWy來決定輸出x還是r}圖1.11float_abs函數(shù):EniDsignedfloat_abs(unsigneduf){unsignede=ufPf-jz;f=aOx?fffff; //f為尾數(shù)e=(e?23)&0xff; //e為階碼if((e==Oxff)64(f1=0))returnuf;〃特殊況單獨(dú)輸出returnuf&OsTfffffff;//取出uf除了符號位的位輸出}圖1.12float_f2i函數(shù):早」utfl&at_f2i uf){inte=uf,f=uf,val;f=f&OxTfffff: //f為尾皴e=(e?23)&Oxff; //e為階碼if(&<127)return0; ”恃殊情況單獨(dú)考慮if(&>157)returnfcSOOOOOOO;/'/特殊情況單獨(dú)考慮-iif(&=127){ //特殊情況單獨(dú)考慮if(uf?31)return_1;return1;:f=T+0x800000:H規(guī)約數(shù)例面療個缺省的1ift&<150)val=f?(150-e);elseval-f<<(e-150)://移位if(uf?31)retum((-l)*(Fal)): //根據(jù)輸出符號■位進(jìn)行最后調(diào)整returnval;)圖1.131.5實(shí)驗(yàn)結(jié)果.使用dlc檢查函數(shù)實(shí)現(xiàn)代碼是否符合實(shí)驗(yàn)要求的編碼規(guī)則。a)首先./dlcbits.c直接檢測是否有錯誤。如圖1.14所示:Linux^Ubuntu:-/Public/tnip/labl-handout^./diebits.c/usr/include/stdc-predef.h:1:Warning:Non-includablefile〈command,lineaincludedfromincludablefile/usr/inelude/stdc-predef.h.CompilationSuccessful(1warning)圖1.14由圖知,輸出CompilationSuccessful(1warning),故bits.c文件編寫無誤符合要求。b)然后用-e選項(xiàng)調(diào)用dlc,觀察操作符數(shù)。如圖1.15所示:

linux@Ubuntu:-/Public/tnp/labl-handout$,/die-ebits.c/usr/include/stdc-predef.h;1:Warning:Non-includabLefilecconiniand-lLne>includedfromincludablefile/usr/include/stdc'predef.Ii.die:bits.c:175:1sbZero:2operatorsdie:bits.c:106:byteNot:3aperatorsdie:bits.c:199:byteXor:9operatorsdie:bits.c:2GE:logicalAnd;8operatorsdie:bits.c:217:logicalOr:7operatorsdie:bits.c:229:rotateLeft:10operatorsdie:bits.c:244:paritycheck:11operatorsdie:bits.c:257:mul20K:5operatorsdie:bits.c:274:mult3di\/2:11operatorsdlc:blts.c:2B8:subOK:11operatorsdie:bits.c:3G1:absVal:7op^rattirsdie:bits.c:319:floatabs:7operatorsdie;bits.c;3A7:floatf2i;17operatorsCompilationSuccessful(1warning)圖1.15.使用btest檢查函數(shù)實(shí)現(xiàn)代碼的功能正確性。a)首先使用make編譯生成btest可執(zhí)行程序,如圖1.16所示:linux^Ubuntu:-/Public/tmp/l3bl-handout$makegcc-0-Wdll-Im-口bt^stbits.cbtest.d把cl.ttEst弓.匚圖1.16b)然后調(diào)用btest命令檢查bits.c中所有函數(shù)的功能正確性。如圖1.17所示:linux@UbLintii:-/Puhlic/tmp/tabl-handcut$./btestscore RatingErrorsFunction1 1 3 LsbZero22333422223223334222233342G00eG0GaayteflotbyteXorlogicalAndlogic苜IOrrotateLeftparitycheckmulzoKmult3div2subOKabsVaLfloat3bsfloatf2.iTotalpoints:35/35圖1.17由圖知,得分全拿到了,故bits.c文件中函數(shù)功能都實(shí)現(xiàn)了。1.6實(shí)驗(yàn)小結(jié)這次實(shí)驗(yàn)讓我更好地熟悉和掌握計(jì)算機(jī)中整數(shù)和浮點(diǎn)數(shù)的二進(jìn)制編碼表示。尤其是加深對數(shù)據(jù)二進(jìn)制編碼表示的了解。通過使用有限類型和數(shù)量的運(yùn)算操作實(shí)現(xiàn)一組給定功能的函數(shù)來提高了我對數(shù)據(jù)表示方面的C語言編程能力??傊@次實(shí)驗(yàn)的過程整體還是很愉快的,耗時不是很長但是收獲很大!實(shí)驗(yàn)2: 拆彈實(shí)驗(yàn) 實(shí)驗(yàn)概述實(shí)驗(yàn)?zāi)康模涸鰪?qiáng)對程序的機(jī)器級表示、匯編語言、調(diào)試器和逆向工程等方面原理與技能的掌握。實(shí)驗(yàn)?zāi)繕?biāo):需要拆除盡可能多的炸彈。實(shí)驗(yàn)要求:使用gdb調(diào)試器和objdump來反匯編炸彈的可執(zhí)行文件,并單步跟蹤調(diào)試每一階段的機(jī)器代碼,從中理解每一匯編語言代碼的行為或作用,進(jìn)而設(shè)法“推斷”出拆除炸彈所需的目標(biāo)字符串。實(shí)驗(yàn)語言:c。實(shí)驗(yàn)環(huán)境:linux實(shí)驗(yàn)內(nèi)容一個"binarybombs"(二進(jìn)制炸彈,下文將簡稱為炸彈)是一個Linux可執(zhí)行C程序,包含了6個階段(phasel?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)試。階段1字符串比較.任務(wù)描述:通過phase_1的反匯編代碼找出要輸入的字符串。.實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析。.實(shí)驗(yàn)過程:觀察phase_1的反匯編代碼,如圖2.1.1所示:eaO48b90<phase_l>:8048b90:83ec1csubesp,Oxlca043b93:c744240444al04movdwardptr[esp+0x4]^0x80431448048b9a:033043b9b:Bb442420moveaxpdwordptr[esp+OxJO]3048b9f:890424mo'jdi^ordutr[esp]TeaxS04Sba2:eS63040000call804900a<strings_notequalAS04Sba7:05cQtesteax*eax0040ba9:7405je8S48lbbfl<phasel+0x20>3943bab:e365日50000call8Q49H5^explodebomb>ao4abbe:83c41Caddesp,0x1c81348bb3;c3ret圖2.1.1發(fā)現(xiàn)在調(diào)用strings_not_equal對比字符串之前,有一個地址送入了堆棧,大膽猜測該地址就是正確字符串的首址,于是在phase_1處下個斷點(diǎn),運(yùn)行至此處后,用x命令查看字符串。如圖2.1.2所示:(gdb)bphase1Breakpoint1atOxB04Bb90(gdb)rStartingprogram:/home/Iinux/Public/tmp/U20141457B/bombWelcometomyfiendishlittlebomb,Youhave&phaseswithBreakpoint1,0x0BO4Sb9Oinphase1()day!(gdb)x/ls0xBO4al44Qx304a144: "BorderrelationswithCanadahaveneverbeenbetter,(gdb)圖2.1.2故猜測“BorderrelationswithCanadahaveneverbeenbetter."就是所需字符串。重新執(zhí)行該程序,直接輸入該字符串,觀察結(jié)果。如圖2.1.3所示:Linux@Ubuntiu:-/Public/tmp/U201414578$./bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!BorderrelationswithCanadahaveneverbeenbetter.Phase1defused-Howaboutthenextone?圖2.1.3.實(shí)驗(yàn)結(jié)果:如圖2.1.3所示,階段一拆彈成功!階段一很簡單,當(dāng)初的找出字符串首地址就可以了,沒有什么大的難點(diǎn)。階段2循環(huán).任務(wù)描述:通過phase_2的反匯編代碼推斷第二階段要輸入的數(shù)據(jù).實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:觀察phase_1的前一部分反匯編代碼,如圖2.2.1所示:

QaO48bb4<phase_2>:S048bb4;53pushebxS3ec38sub8048bb8:8d442418leaeax,(esp+Sxl8J0048bbc:09442404movdwordptr[esp+Qx4]0048bc0i8b442440moveaxfdwardptrfesp+0x40]8048bc4;S90424movdwordptr[esp],eax0048bc7:e870050009call804913c|<readsixnumbers^3G48bCC:837c2418Q9cmpdwordptr[esp+Gxl8].GxQ8048bd1:7922Ins8G48bf5<phase2+0x41>3G48bd3:eB3d050000call8G49115^explodebomb>圖2.2.1發(fā)現(xiàn)輸入的應(yīng)該是六個數(shù)字,而且要求[esp+0x18]必須大于等于0才行,于是測試輸入“012345”,觀察這些數(shù)字在調(diào)用read_six_numbers后是如何存放在棧中的,如圖2.2.2所示:(gdb)x/12x$esp0xbfffef20:0XOSO4C43OOxbfffefSSexbjfbdsasOxO304al44QxbfffefJO;Oxbffffei49xb7ffd94e0x000000000x00000001Gxbfffef48:(gdb)|0X0GQ00GO20X0G0GO0030X00000004&X0OGOGQ05圖2.2.2觀察到執(zhí)行read_six_numbers后,輸入的數(shù)字依次存放在 esp+0x18、esp+0x1c、esp+0x20、esp+0x24、esp+0x28、esp+0x2c中,故對輸入的數(shù)字首先就要有第一個數(shù)不能小于0。繼續(xù)觀察phase_2的后一部分反匯編代碼,如圖所示:864Bbdl:7922jns8048bf5<phase2+Gx41>8G48bd3;e83dS5DGSOcallB049115<explode_bomb>B048bdB:eblbjmp8Q43bf5<phase2+0x41>8S43bda:89moveaXjebx804SbdC:03449c14addeaxrdwordptr[它5P十啟bx*4+@*14]8S48beO:39449cIScmpdwordptr(esp+ebx*4+0xlS],eax8048be4:7405隹8Q48beb<phase2+flx37>8048be6:啟82aQ5OG09call8049115<explodebomb>8S4at)eb:B3c301addebxrOxi8048bee:S3fbQ6cmpebxfflx6S048bfl:75e7JneS043bda<phase2+0x26>6e48bf3:ebG7ji叩S04Sbfc<phase_2+0x4B^8048bf5:bb010000SOmovebxf0x1B048bfa:ebdejmpS348bda<phase2+0x26>8B4Bbfc:S3C438addesp,0x383048bff:5bpopebx8048C0O;c3ret圖2.2.3能容易發(fā)現(xiàn)這是一個循環(huán),首先將ebx賦值為1,然后比較[esp+ebx*4+0x14]加上ebx與[esp+ebx*4+0x18]是否相等,相等就ebx加一繼續(xù)執(zhí)行,直到ebx等于6后退出。然后來分析應(yīng)該輸入的值。第一個數(shù)只要大于等于0就可以。不妨就輸入0。他將會被保存在esp+0x18處。所以ebx等于1時,有[esp+ebx*4+0x18]=[esp+0x1c]=[esp+ebx*4+0x14]+ebx=[esp+0x18]+1。故第二個輸入的數(shù)字應(yīng)該為0+1=1。同理分析可得后面的數(shù)依次為3、6、10、15。故這六個數(shù)依次為0、1、3、6、10、15。重新執(zhí)行該程序,直接輸入“01361015”,觀察結(jié)果。如圖2.2.4所示:PhdS€1defused.Howaboutthenextone?01361015That1snumber7.Keepgoing!圖2.2.44.實(shí)驗(yàn)結(jié)果:如圖2.2.4所示,階段二拆彈成功!階段二涉及到了小的循環(huán),慢慢的依次執(zhí)行很同意就能發(fā)現(xiàn)規(guī)律,也不是很難。階段3條件/分支.任務(wù)描述:通過phase_3的反匯編代碼推斷第三階段要輸入的數(shù)據(jù).實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:觀察phase_3的前一部分反匯編代碼,如圖2.3.1所示:08S43C01<phase3>;8048cfll: 83 ec 2c sub e5pd&x2<8Q48C04! 8d 44 24 1c lea eax^[esp8Q43C08: 89 44 24 0c mov dwordp18048cflc: 8d 44 24 18 lea eax^[esf8Q48C10: 89 44 24 08 mov dwordp18Q43C14! c7 44 24 04 2fa304 mov dwordp1B043clb: 088043clc: Sb 44 24 3Q niov eaxtdwo8O43C20: 89 04 24 mov dword p8。4恥23: €838憶ff” 811 加6電1+QxlcJ:r[esp+0xc]Heax1+0X18J:r[esp+flxB],eax:r[esp+0x4]H0x8Q4a32f"dptr[esp+Gx39]:rresol.eax<isoc99sscanfi^plt;*BG40C28: 83fe01 cmp|eax.GxlB043c2b: 7T05 回 BO46C32<Dhase3+0x31>B043c2d: e8e3040000 call8049115^explodebombH圖2.3.1發(fā)現(xiàn)輸入的應(yīng)該要求__isoc99_sscanf@plt的返回值大于1,于是觀察調(diào)用__isoc99_sscanf@plt時格式字符串的值,在0x8048c23處下斷點(diǎn)然后進(jìn)入函數(shù)單步調(diào)試,并測試輸入“01234”,如圖2.3.2所示:0xO8048c23inphase3{gdb)stepi0x68048860inisac99sscanfgplt什(gdb)niisac99sscanf(5=0x8O4c48O<inputstrings+160>"S1234*.fonrat=0x804i332ffd)atisoc99sscanf.c!2625i5oc99_sscanf.c;Nosuchfileordirectory.相曲)圖2.3.2觀察到格式字符串為“%d%d”,故只需輸入兩個數(shù)字即可。同phase_2操作可以發(fā)現(xiàn)輸入的數(shù)字依次存放在esp+0x18、esp+0x1c中。繼續(xù)觀察phase_3的

后一部分反匯編代碼,如圖2.3.3所示:S048c2deSe30400日電call8049115cexplodebomb^804EC32837c241807cmpdwordptr[esp+0xl8],6x7804BC37773c804SC75<phase3+0x74>3Q4BC398b442418moveaxHdwordptr[esp+flxlS]8D48c3dff2485COal0408Impdwordptr[eax+4+OxS04alcG]894BC44bS4dG200白£)moveax.0x24d864SC49eb3bjnp8日4配86<=phase_3+0x35>8046c4bbSC0G2000?moveaxHGx2c0804SC5Oeb34jnp804Sc86<pha5e_3+0x35^8S4BC52b8bdG&00DGmoveax.Oxbd804BC57eb2djmp8048cB6<phase_B+0x35>8648C59b8b3030000moveaxH0x3b3304fic5eeb26jmpBQ4ScB6<phase3+flx35>8g4恥6gba22030000moveaxF0x322804SC65ebIfjmp804Sc86<phase3+flx85>B040C67b3吊9010000moveaxr0xla9804Sc6ceb18Imp8?48c86<phase3+0x85>8Q4Ec6ebS9aGO00QBmoveax,0x9a8Q48C73eb11imp8048c88^pfiase3+QxS5>804BC75eS9bG4白。OScall8049115^explodeboinb>8g48c7ab800000000moveax,0xQ8C4Bc7feb05jmp804Sc86<phase3+Qx85>304SC31b33d000000moveaxr0x3d8G4BC863b44241ccmpeaxpdwordptr[esp+GxlcJ3048c8a7405jeB048c91<phase_B+0x90>864SC8CeSS40400OScall.8049115<=explodebomb^BQ4SC9183c42caddespH0x2c8040C94c3ret圖2.3.3可以顯然的發(fā)現(xiàn)一個數(shù)字要求不能比0x7大,然后就會將第一個數(shù)字送入eax中,然后跳轉(zhuǎn)至[eax*4+0x804a1c0]處執(zhí)行,顯然是個分支程序。重新調(diào)試程序輸入“1100”,觀察執(zhí)行到0x8048c86處eax的值,即第二個數(shù)應(yīng)該的值。如圖2.3.4所示:Breakpoint3,Gx08648c86inphase_3()(gdb)inforegeax 0x3d61圖2.3.4故第二個數(shù)為61。重新執(zhí)行該程序,直接輸入“161”,觀察結(jié)果。如圖2.3.5所示:That'snumber2.KeepgoingI161Halfwaythere!圖2.3.5.實(shí)驗(yàn)結(jié)果:如圖2.3.5所示,階段三拆彈成功!階段三用到了分支,由于沒有必要弄懂整個分支的功能,只要選擇其中的某一路就可以了,所以解決起來也不是很難,單步執(zhí)行下去就能很快的找到第二個輸入的正確值。

階段4遞歸調(diào)用和棧.任務(wù)描述:通過phase_4以及func4的反匯編代碼推斷第四階段要輸入的數(shù)據(jù).實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:觀察phase_4的前一部分反匯編代碼,如圖2.4.1所示:08O48cf2 4>:8048CT2:83ec2csubesp,0x2cB048cf5:8d44241cleaeax,[esp+Oxic]8048CT9:394424Ocinovd^ordptr[esp+&xc].eax8048cfd:8d4424ieleaeax,[esp+0x18]S040d01:394424呢movdwordptr[esp+GxS],eaxS白48dl35:c74424042fa304movdwordptr[esp+0x4],0x004a32fS04Sd0c:088048d0d:Sb442430moveaxdwordptr[esp+0x3Q]S040dll:890424movdwordptr[esp]peax8048dl4tcS47fbffffCdll30433^0|<isoc9955canf@plt>]SQ40dl9:83fB025PIeaxr6x2|SI340dlc:75671逆13Q48d25<phase_4+0x33>3948dle:837c2418呢cropdwordptr|lesp+OxlSJ,0xe|SQ40d23:7&65rr^~i8G43d2a<phase4+0x38>81348c125;eSeb030909call3049115<explode_bcinib>圖2.4.1發(fā)現(xiàn)輸入的應(yīng)該要求__isoc99_sscanf@plt的返回值等于2,于是同階段三一樣測試觀察調(diào)用_isoc99_sscanf@plt時格式字符串的值,發(fā)現(xiàn)為仍然為“%d%d",而且[esp+0x18]要求小于等于0xe。如圖2.4.2所示:0x0804fldl4inphase4(gdb)stepi0x00048860in_iSQc99_553nT@plt()(gdbJniisoc99sscanf(s=Ox894c4d0<inputstrings+24O>"12"tformat=DxSQ4a32f”就I釗")atisoc99_sscanf.c:26(gdb)■圖2.4.2繼續(xù)觀察phase_4的后一部分反匯編代碼,如圖2.4.3所示:BO46cl25:e8ebS3GO00call8G4^115<explode_bomb>BG43d2a:匚74424030e0GG0movdwordptr[esp+0x8JfOxe8G43d31:GO8G4Sd32:c74424G4000GGOmovdwordptr[esp+Gx41p0xG8G48d39:008048d3a:8b442418moveax,dwordptr[esp+Gxl8]8048d3e:890424movdwordptrfesp],eax8e48d41:e84fffffffcall8G48C95<func4>8G48d46:83fS0fcmpeaXpOxfBG43d49:7507jneBG43d52vph口su4+Gx60>8G48d4b:837c241cOfcmpdwordptrfesp+Oxlc]dQxf8G48d50:7口05在8G48d57^phase_4+Gx65>8048d52;e8be030000callBG49115<explode_tiomb>8日48d57:83c42caddespr0x2c8048d5a:c3ret圖2.4.3

可以不難發(fā)現(xiàn)依次將輸入的第一個數(shù),以及0x0和0xe作為參數(shù)傳給func4,要求返回值為0xf而且輸入的第二個數(shù)與0xf相等才不會爆炸。所以需要輸入一個正確的數(shù)來保證func4的返回值為0xf。于是觀察func4的反匯編代碼,如圖2.4.4所示:8040C95:56804BC96:538040C95:56804BC96:53SG48C97:83ec148G48c9a:8b5424208G48c9e:8b4424248@48ca2:Sb7424288048ca6:89fl8G48ca8:29clSG4Scaa:89Cb&048cac:clebIf8048caf:G1d9BG4Scbl:dlf9&G48cb3:Sd1c018e48cb6:39d3S04BcbB:7e173G4dcba:8d4bff804Scbd:894c24088G48ccl:894424G4SG4&CC5:8914248G48CC8:君8c8ffftff8G48ecd:gida8G4&CCT:eblb804Scdl:89d88G48cd3:39d3S048cd5:7d15&04Scd7:897424088G48cdb:8d43GlBG40cde:89442404SG4Sce2:S91424e8<ibffffff804Bcea:eids3G4Sccc;33c4148048cef:5b8G4Scf0:5e8648cfl:匚3OS048c95unc4>:pushesipushebxmubesp,Gxl4movedXpdwordptr[esp+0x2G]moveax.dwordptr[esp+Gx24Jmove$lrdwordptr[esp+0x2Bjmovecx.esisubecx,eaxmovebx,ecxshrebXpOxlfaddecx.ebxsarecx,1leaebx,[ecx+eax*l]cmpebx,edxjlE8G48cdl<func4+0x3c^lu日ecx.febx-&xllmovdwondptr[esp+QxB],ecxmovdwordptr[esp+Sx4],eaxmovdwordptr[espjfedxcall8G48C95<func4>addeax,ebxjmp8Q48cec<func4+0x57>moveax,ebxcmpebx.edxiae804Bcec<func4+0x57>movdwordptr[esp+QxS].esileaeax,[ebx+Oxl]movdwordptr[esp+Gx4],eaxmovdwo「dptr[esp]Pedxcall8G4&C95<func4>aHdeax,ebxaddesp,0xl4POPebxPOPesiret圖2.4.4很快就能發(fā)現(xiàn)其中有遞歸調(diào)用,仔細(xì)分析發(fā)現(xiàn),第一次調(diào)用時其中edx,eax,esi依次為x(為輸入的第一個數(shù)),0x0,0xe。然后ecx=(esi-eax)/2,然后ebx=ecx+eax=(esi+eax)/2,然后根據(jù)ebx與edx比較也就是傳入func4的第一個參數(shù)與后兩個參數(shù)的平均值的比較結(jié)果進(jìn)行相應(yīng)的處理。當(dāng)?shù)谝粋€參數(shù)小于后兩個參數(shù)的平均值時,就依次將原來的第一次參數(shù)、原來的第二個參數(shù)、原來后兩個參數(shù)的平均值減一作為參數(shù)調(diào)用func4,然后將返回值以及原來的后兩個參數(shù)的平均值的和作為返回值輸出。即原來參數(shù)依次為a、b、。,傳入?yún)?shù)依次為a、b、(b+c)/2-1;當(dāng)?shù)谝粋€參數(shù)大于后兩個參數(shù)的平均值時,就依次將原來的第一次參數(shù)、原來后兩個參數(shù)的平均值加一、原來的第三個參數(shù)作為參數(shù)調(diào)用func4,然后將返回值以及原來的后兩個參數(shù)的平均值的和作為返回值輸出。即原來參數(shù)依次為a、b、。,傳入?yún)?shù)依次為a、(b+c)/2+1、c;當(dāng)?shù)谝粋€參數(shù)等于兩個參數(shù)的平均值時,就直接將平均值直接輸出。所以通過反推,要求func4的返回值必須為0xf也就是15,顯然直接輸出平均值不可行。若第一個參數(shù)大于0x0與0xe的平均值也就是7的話,則下一層調(diào)用func輸出的返回值必定大于(8+15)/2>8,故結(jié)果必定大于15,所以也不行。故輸入的第一個參數(shù)必定小于7,演算之后發(fā)現(xiàn)5正好符合要求,第一次調(diào)用平均值為7,然后傳遞5、0、6為參數(shù)第二次調(diào)用,平均值為3,再次傳遞5、4、6為參數(shù)第三次調(diào)用,平均值為5,與輸入相等,故輸出7+3+5=15,即0xf。綜上,重新執(zhí)行該程序,直接輸入“515”,觀察結(jié)果。如圖2.4.5所示:Halfwaythere!515Soyougotthatone.Trythisone.圖2.4.5.實(shí)驗(yàn)結(jié)果:如圖2.4.5所示,階段四拆彈成功!階段四難度開始提升,調(diào)用了別的函數(shù),而且函數(shù)還有遞歸調(diào)用,這就要求必須完整的看懂遞歸的函數(shù)的功能,分析出來功能后才能反過來推測正確的輸入。階段5指針.任務(wù)描述:通過phase_5的反匯編代碼推斷第五階段要輸入的數(shù)據(jù).實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:觀察phase_5的前一部分反匯編代碼,如圖2.5.1所示:08O48d5b<phase_5>:5。48d5b;S3ec2csubesp,Gx2cS048d5e:8d44241Cleaeax,[esp+Gxlc]8043d62;S94424Bemovdwordptr[esp+Oxc],eax8048d66:8d442418leaeax,Lesp+QxlSj8048d6a:894424OSmovdwordptr[esp+Gx8],eax8043d6e;c74424042f 04movdwordptr[esp+0x4]H0x3O4a32f8048(175:esSG48d76:Gb442430rtioveaxpdwordptr[esp+ex3G]8043d7a:S90424movdwordptr[tsp]eax8048(J7d:eSdefaffftcall3048S6Ov_i5oc99_S5canf^plt>6048d82:E3fllcn)peax,Gxl8048d85;7f05jg004Sd8c<phase_5+0x31>8048(187:eS3903幽00call8Q49115<expLodebamb>圖2.5.1發(fā)現(xiàn)輸入的應(yīng)該要求__isoc99_sscanf@plt的返回值大于1,于是同階段三一樣測試觀察調(diào)用_isoc99_sscanf@plt時格式字符串的值,發(fā)現(xiàn)為仍然為

“%d%d”。如圖2.5.2所示:Oxe8048d7dinphase5()(gdb}step!0x0894^860inisoc99sscanf@plt()(gdb)ni_isoc99_sscanf(s=Sx804c52S<input_slrings+32fl>"1234",fonnat=SxBe4a32f"%d%d")atisoc99sscanf.c:26(gdb)|圖2.5.2繼續(xù)觀察phase_5的后一部分反匯編代碼,8fl48d878g48d8c8Q4Sd908048d938048d97Hg48dgmSG48d9c能48gl8048da6804Sda98048dbO8048db28G48db58048db78043dbb3043dbe8Q4BdcG804fldc48048dc63048dcb8048dce94848be80&384小980000a020oe圖2.5.2繼續(xù)觀察phase_5的后一部分反匯編代碼,8fl48d878g48d8c8Q4Sd908048d938048d97Hg48dgmSG48d9c能48gl8048da6804Sda98048dbO8048db28G48db58048db78043dbb3043dbe8Q4BdcG804fldc48048dc63048dcb8048dce94848be80&384小980000a020oe5804040175601-0fefc142c43b4ase2Ccall8049115<explt>de_bonib>moveax.dwordptrlesp+6xl8]andeax10xfmovdwordptr[esp+flj(18]HeaxcmpeaxdGxfje8&46dc6<phase5+&x6b>moveexj0x0movedx.OxSaddedx,Gxlm<iveax.dwordptr(eax+4+Sx804alea]addecx^eaxcmpeax^Oxfjne8048da6<phase5+&x4b>movdwordptr[esp+GxlS]reaxcmpedxfGxfjne3043d 印h鳴cmpecx±dwrdptr(esp+Sxlc]柞8048dcb<phase5+Ox70>call8Q49115<explodebomb>addespd0x2cret如圖2.5.3所示:圖2.5.3仔細(xì)分析發(fā)現(xiàn),首先將第一個輸入的值送入6@乂后與0xf做且運(yùn)算,然后在與0xf比較,相等就會爆炸,不相等就將[eax*4+0x804a1e0]的值賦給eax,然后直到eax等于0xf,比較進(jìn)行該賦值的次數(shù),賦值次數(shù)也等于0xf且輸入的第二個值恰好為賦值后eax的總和,則完成這個炸彈的拆除。于是執(zhí)行到phase_5后,用x命令觀察0x804a1e0后的連續(xù)15個值,如圖2.5.4所示:圖2.5.4(gdb)x/L5d@x884ale60x804alefl<array.3143=*:109xS04alfO<array,3143+16>:Dx8Q4a20Ocarray.3143+32>:圖2.5.40x&S4a210orray.3143+4B>:(gdb)|由圖2.5.4可以列出改數(shù)組的值,如表2.5.5:A[0]=10A[1]=2A[2]=14A[3]=7A[4]=8A[5]=12A[6]=15A[7]=11A[8]=0A[9]=4A[10]=1A[11]=13A[12]=3A[13]=9A[14]=6表2.5.5所以通過反推,要求15次后的eax值必須為0xf也就是15,則反推有15-6-14-2-1-10-0-8-4-9-13-11-7-3-12-5,所以第一個輸入的值為5,第二個值為15+6+14+2+1+10+0+8+4+9+13+11+7+3+12=115。綜上,重新執(zhí)行該程序,直接輸入“5115”,觀察結(jié)果。如圖2.5.6所示:Soyougotthatone.Trythisone.5115Goodwork!Ontothenext...圖2.5.6.實(shí)驗(yàn)結(jié)果:如圖2.5.6所示,階段五拆彈成功!階段五用到了數(shù)組,只要正確的找到了數(shù)組中元素的值,后面的循環(huán)就很簡單了。階段6鏈表/指針/結(jié)構(gòu).任務(wù)描述:通過phase_6的反匯編代碼推斷第五階段要輸入的數(shù)據(jù).實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:觀察phase_6的前一部分反匯編代碼,如圖2.6.1所示:0004Sdcf<phase6>;S04Sdcf:56pushesi8Q48dd0:53pushebx81348dd1;83CC44 subesp19x44Bd44241G leaeaxf[esp+6xl6]ai340dda:B94424G4 movdwordptr[esp+Gx4],eax3O40ddc:Sb44245Q moveaxrdwordptrLesp+Qx5G]S048deO:890424 movdwordotr[espj,eax8G48de3:eS54S30Q0Q call804913c<readsixnumbers^304SdeB:beSO000000 movesirOxs8048ded:Sb44b4IQ moveax.dwordptr[esp+esi*4+0xL0]8048dfli83e801 subeaxp0x1S048df4:S3f805 cmpeaxp0x5S043df7:7605jbej8Q48dfe<phase6+0x2f>S048df9ie81703BO00 call8Q49115<explodebomb>圖2.6.1仍然是讀取六個數(shù)字,輸入“012345”測試,然后在read_six_numbers返回后觀察數(shù)字是否被存放在[esp+0x10]處,如圖2.6.2所示:9x9&04Bdedinphases()(gdb)x/6d$e&p+QxlO9xbfffef2O:0123。工bH也門削4 5(gdb)|圖2.6.2所以這段代碼還對輸入的值有一定的要求,要求減去以后必須不能大于5,即要在1、2、3、4、5、6中的數(shù)字才可以。繼續(xù)看phase_6的下一段反匯編代

碼,如圖2.6.3所示。BG4Sdf9:8B48dfe:e817 00GOS3c601calladd8@49115<explode_bomb!>esirSxl8048eei:83fe06Icmpesi,0x6|SQ48eO4;7507jne8O48e0d<phase6+Qx3e>bb00oooo0Qmovebx,0x6B043eOb:eb3SjmpB048e45<pha5e_6+0x76>6048eGd:39f3movebXjesiEG4aeflf:Sb449c10moveax,dwordptr[esp+ebx+4+0xlO]S048el3:3944b4Be5口dwordpt「|[「占口+「£1才4+日*匚]|」『曰卜B048el7;7505jne|BQ43ele<pha5e_b+0x4i:>BS43el9:e8f7020000callB049115<exploEebamb>SG48ele:83c3&1addebx.SS48e21:83fb05cnnpebx.DxSjE048e24:7e€9jteEO48e0f<phase6+0x4G>BS43e26:ebc5川pB043ded<phase_6+exle>圖2.6.3不難發(fā)現(xiàn)這是通過esi與ebx來實(shí)現(xiàn)的雙重循環(huán),一一比較輸入的值是否相同,只要有一對相同該炸彈就會爆炸,所以輸入的數(shù)據(jù)應(yīng)該是1到6的一種排列才可以。繼續(xù)看phase6的下一段反匯編代碼,如圖2.6.4所示。8048e280O4Be2b3S4Se2e804fie308048e32804能34B04Be398Q4Se3d0O4Be4O804fie43804fie458048e47804ee4b8fl4fie4e8Q4Se500O4Be55804fie5a8100-148048e280O4Be2b3S4Se2e804fie308048e32804能34B04Be398Q4Se3d0O4Be4O804fie43804fie458048e47804ee4b8fl4fie4e8Q4Se500O4Be55804fie5a8100-1416cb0OC101900CrD710movmovaddcmpjemovmovcmp止movmovjmp圖2.6.4edx±dwordptr[edx+Sxfl,eax0x1eaxdecx804Be28.cphase6+fix59>804Be39_<pti£5e_6+9x6a>edx]ex804c13c|dwordptr[esp+esi+4+0x28],edxebx10x1ebx^0x6SG4Be5c<phase6+0xSd>esifebxecXfdwurdptr[esp+ebx:*4+0x16]ecx,0x18046e34<phase6+0x65>eaxtSxl edxj0x804c:13c|8G46e28<phase6+&x59>發(fā)現(xiàn)出現(xiàn)了一個奇怪的地址,用x命令觀察一下,如圖2.6.5所示:(gdb)xQx304cl3cOx804cl3c<nodel>: 9B&(gdb)|圖2.6.5很容易發(fā)現(xiàn)是一個節(jié)點(diǎn),用X命令將該鏈表所有節(jié)點(diǎn)全部羅列出來,如圖2.6.6所示:(gdb)x/3xI3x&04cl3c8x8B4cl3c<nodel>:(gdb)x/3x0X&O4C143OXGSGO00010x0804c148Gx8fi4cl4S<node2>:(gdb)x/3xexO8G4c1540XGOS0GO02—88日4c1540x804cl54<node3>:(gdb)x/3x0x0804c1600x00000003flxB864cl6fiflxS04cl6&<node4>:(gdb)x/3x0x08G4cl6cGx0GGQ003e0x00000004Ox0BG4cl6c0x804cl&c<node5>:(gdb)x/3x歌。864cl78日日日0日呼0x804cl7S<node6>j(gdb)I0x0000037a0x000000060X00000000圖2.6.6根據(jù)該鏈表并繼續(xù)觀察代碼,仔細(xì)大膽猜測這段代碼是根據(jù)輸入的序列,將鏈表的順序進(jìn)行改排。然后再判斷改排后的鏈表中的數(shù)據(jù)是否是從小到大進(jìn)行排序的。所以不妨大膽的猜測應(yīng)該輸入的排序序列應(yīng)該為4(0x3e)<5(0x1bc)<2(0x263)<3(0x2bc)<6(0x37a)<1(0x3dc)。故猜測輸入的字符串應(yīng)該為“452361”,重新運(yùn)行程序,輸入該字符串進(jìn)行測試,如圖2.6.7所示:Goodwork!Ontothenext,Pr452361Cong『占tul■自ti■白ns!You've th白bomb!圖2.6.7.實(shí)驗(yàn)結(jié)果:如圖2.6.7所示,階段六拆彈成功!階段六難度大大加大,由于有大量的地址的操作,所以乍一看很難看懂功能,查看相應(yīng)地址后發(fā)現(xiàn)是個鏈表,在結(jié)合反匯編代碼,很容易能猜測出大概的功能,從而來推測正確的輸入。階段7隱藏階段.任務(wù)描述:找出隱藏階段開啟方式并且拆除隱藏階段的炸彈。.實(shí)驗(yàn)設(shè)計(jì):利用gdb結(jié)合斷點(diǎn)來動態(tài)地分析.實(shí)驗(yàn)過程:直接在反匯編代碼中觀察發(fā)現(xiàn),只有phase_defused函數(shù)中有對secret_phase函數(shù)的調(diào)用,于是觀察phase_defused函數(shù)的反匯編代碼,如圖2.7.1所示:觀察不難發(fā)現(xiàn),要經(jīng)過兩個比較,以及一個字符串比較后才能開啟隱藏階段。而第一個比較是一個數(shù)與常數(shù)0x6的比較,結(jié)合隱藏階段的開啟條件,必須在階段6完成后才能開啟就很容易發(fā)現(xiàn),這個數(shù)(ds:0x804c3c8)應(yīng)該就是用來指示當(dāng)前階段的。于是在phase_6完成后,在phase_defused處下斷點(diǎn),觀察ds:0x804c3c8處的值,如圖2.7.2所示:

08049286<phasedefused>:3049286: 81 ec Sc GO GG SO sub esprGxScS0492SC: 65 al 14 00 00 00 mov eax:Gxl48049292: 89 44 24 7c mov dwordptr [esp+0x7c],eax8049296: 31 ce xor eaxP?ax3Q4929B: 833dcBc30408日6 cmpdwordptirds:0x304c3cBf9x6B0492&f: 7572 ]ne8G49313<phasedefused+&x8d>30492al: 8d 44 24 2c lea eax^[esp+Gxlc]S0492a5: 89 44 24 10 mov dwordptr[esp+QxlQ],eax80492a9: 8d 44 24 28 lea eaxt[e5p+0x28]3Q492ad: 89 44 24 0c mov dwordptr[esp+Oxc]teax39492til: 即 44 24 24 lea eaxr[esp+0x24]B?492tl5: 89 44 24 08 mov dward ptr [esp+Dx8]Teax30492b9: c7 44 24 04 89 a3 04 mov dword ptr [esp+0x4]f&xSS4a368O492C0: OSS0492C1; c7 04 24 dO c4 04 08 mov dword ptr [esp]h0x804c4d980492cEi e8 93 f5 ff ff call 8Q48860< isoc99sscanf^plt19>39492cd: 83fB03 IFcmpeax.GxSS0492dS: 75 35 ]ne 8049307<B0492d2: c74424G492 34movdwordptr80492d9: 03S0492da: 8d 44 242c lea eaxt[e&p+80492de; 89 04 24 mov dwordptrphasedefused+0x81>[esp+0x4]JOxSO4a3920x2c][esp],eax30492el; e324fdffff call304960a<strings_not_equal>8M92第; 35c& test eax.eax30492eS: 75Id ]ne 8S493S7<phasedefused+&x81>30492ea: c7 04 24 58 a2 04 SB mov dwordptr[esp]T0x8&4a25S8Q492f1: e8 fa f4 ff ff call 80487fB<puts@pl.t>S0492f6; c7 04 24 80 32 04 08 mov dwordptr[esp]h0x804a2E930492fd: e3 ee 14 ff ff call aO487fG<pjts@plt>3949302: 已8 ec Tb ff ff call aQ48ef3<secret_phase>圖2.7.1Breakpoint2t0x06049236inphasedefused()(gdb)x/lx0x&S4c3c8GxS94c3c8<ndm_inpdt_5trings>; 0X0G00B0O6(gdb)|圖2.7.2果然與猜測相同,繼續(xù)執(zhí)行觀察__isoc99_sscanf@plt函數(shù)的輸入字符串格式,如圖2.7.3所示:Breakpoint3,0x0804886?inisoc99sscanf0plt()(gdb)step!_isoca^ssc^nf(s=0xS04c4d0^inputstrings+a^,515”,Tormat=0xS04a3S9"M專d電£")atisoc99_sscanf.c:2626 isoc99_sscanf.c:Nosuchfileordirectory,tgdb)|圖2.7.3觀察發(fā)現(xiàn)與第四次的輸入相同,但是輸入字符串格式不同,于是應(yīng)該是在第四次輸入的數(shù)據(jù)后加上一段字符串。而字符串首址的位置顯然為0x804a392,用x命令觀察,如圖2.7.4所示:(gdb)x/ls0x&04a392曲的44392: "DrEvil"(gdb)|圖2.7.4所以修改第四次的輸入為“515DrEvil”,測試觀察是否開啟了secret_phase階段,如圖2.7.5所示:linux@Ubuntu:'/Publi€/tmp/U2ei41457B$,/bombWelcometomyfiendishlittlebomb.Youhave6phaseswithwhichtoblowyourselfup.Haveaniceday!BorderrelationswithCanadahaveneverbeenbetter.Phase1defused.Howaboutthenextone?01361015That'snumber2.Keepgoing!161Halfwaythere!515DrEvilSoyougotthatone,Trythisone.5115Goodwork!Ontothenext...452361Curses,you'vefoundthesecretpha5e!Butfindingitandsolvingitarequitedifferent..r圖2.7.5接下來開始拆除secret_phase階段的炸彈,首先觀察secret_phase函數(shù)的反匯編代碼,如圖2.7.6所示:e804Bef3^secretpha&e>:S04Sef353pushebx804Bef483ec18subesp.OxlB804SeT7e89002G000call804918c<rcadlino|B04Befcc74424080aQ000movdwordptr[esp+Qx^lFSxa804&f03804Sf04c74424G40000OQmovdwordptr[esp+Qx4]rOx08O4&f0bG&B04Bf0c890424movdwordutr[esc],eax804Bf0f€8bef9ffftcallB048Bc0<strtol.@plt>|804Bfl489nioveb^.ea^804Bfl68d40ffleaeaXj[eax-Gxl]8G4Sfl93d旺8 ?00Gemp|eaxf0x3e8804Bfle7605PTbel8048吊25<secretphase+0x32>804Bf20e8fO010000call8049115<explodebomb>B04fif25895亡2404movdwordptr[t5p+0x4]hebxBG4Bf29C7042483CO04OSmovdwordptr[esp],Qxa9'4c088864fif30€86dffffffcallBfl48ea2<fun7^8G4Sf3583fS07empeax,0x7804Bf367405je的48門中 reiphase+0x4c;*8G4Bf3ae8610000call8049115^explodebomb〉804Bf3fc704247cal040&movdwnrdptr[esp],BxflO4al7c8G4Bf46e3a5fSffffcall80487fG<putseplt>8G4Bf4b36&3G&00callSQ49286^phasedefused?*8G4BfSe83C4IBadde&p^QxlS迪48f535bPOPebx8G4Bf54c3ret圖2.7.6很顯然輸入的是一個數(shù)值,而且該數(shù)值要求不能大于0x3e8+0x1=1001。然后將0x804c088以及該數(shù)值作為fun7參數(shù)傳遞進(jìn)去,如果返回值為0x7就拆除了改炸彈。所以來觀察一下fun7的反匯編代碼,如圖2.7.7所示:0SO48ea2<fun7>:53pushebx8048ea3S3ec18subespr6x188043ea6SO542420 movedXjdwordptr[esp+0x2GJ8048eaaSb4c2424 novecx.dwordptr[esp+0x24J3043eaeB5d2testedx,edx8048eb07437ie804See9<fun7+0x47>8048eb28blamovebx,dwordptr[edx]8B4Seb439cbcmpebx,ecxS048eb67e13jle8G48ecb<fun7+0x29>S048eb8894c24t)4 movawordptiriesp+t)x4],ecxSb4204moveax^dwordptr[edx+0x4]8648ebfS90424movdwordptr[esp]Feax8048ec2eBdbffffff call8B48ea2<fun7>8G48ec701存ddeaxeaxsb23imp3Q43eee^fun7+0x4c>3043ecbGO00&Q00 HQVeax.QxO8048edO39cbcmpebx,ecx74laje8043eee<fun7+0x4c>8048ed4894c2404 movdwordptrlesp+0x4]recxa048ed8Bb42S3moveax,dwordptr[edx+0x8]B9G424movdwO'rdptr[e?p],eaxeBbfffffff callS04Bea2<fun7>8048ee3Sd440001 leaeaxj[eax+eax*l+OxlJ8048ee7eb65imp3048eeetfun7+0x4c>3043ee9bSffffffff moveax,?xfffiffff8048eee83c413addesp,6x138048efl5bpopebxS048ef2c3ret圖2.7.7很快就能發(fā)現(xiàn)其中有遞歸調(diào)用,仔細(xì)分析發(fā)現(xiàn),第一次調(diào)用時其中edx,ecx依次為0x804c088,x(為輸入的數(shù))。然后比較edx與0,如果相等就返回-1,否則ebx=[edx],然后比較ebx與ecx,也就是根據(jù)傳入fun7的第一個參數(shù)處的數(shù)值與第二個參數(shù)比較結(jié)果進(jìn)行相應(yīng)的處理。當(dāng)?shù)谝粋€參數(shù)處的數(shù)值小于第二個參數(shù)時,就依次將原來的第一次參數(shù)加上0x8處的值、原來的第二個參數(shù)作為參數(shù)調(diào)用fun7,然后將返回值乘以2后再加上0x1作為返回值輸出。即原來參數(shù)依次為a、,傳入?yún)?shù)依次為[a+0x8]、b;當(dāng)?shù)谝粋€參數(shù)處的數(shù)值大于第二個參數(shù)時,就依次將原來的第一次參數(shù)加上0x4處的值、原來的第二個參數(shù)作為參數(shù)調(diào)用fun7,然后將返回值乘以2作為返回值輸出。即原來參數(shù)依次為a、^傳入?yún)?shù)依次為[a+0x4]、b;當(dāng)?shù)谝粋€參數(shù)等于兩個參數(shù)的平均值時,就直接將平均值置為0輸出。所以通過反推,要求fun7的返回值必須為0x7也就是7,顯然直接輸出0或者-1都不可行。當(dāng)?shù)谝粋€參數(shù)處的數(shù)值大于第二個參數(shù)的話,則最后的返回值必定為偶數(shù),所以也不行。所以第一個參數(shù)處的數(shù)值應(yīng)該小于第二個參數(shù),用x命令觀察0x804c088處的值,如圖2.7.8所示:(gdb}x/lx0xSG4c0S80x8O4cOS&<nl>:0x00000024(gdb)■圖2.7.8所以輸入要大于0x24,再向下一層,就要求fun7返回值為0x3,所以這次第一個參數(shù)處的數(shù)值還要大

溫馨提示

  • 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

提交評論