华中科技大学计算机系统基础实验报告_第1页
华中科技大学计算机系统基础实验报告_第2页
华中科技大学计算机系统基础实验报告_第3页
华中科技大学计算机系统基础实验报告_第4页
华中科技大学计算机系统基础实验报告_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24日计算机科学与技术学院目录TOC o 1-5 h z实验1:2实验2:9实验3:23 HYPERLINK l bookmark86 o Current Document 实验总结32实验1:数据表示1.1实验概述本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。实验中,你需要解开一系列编程“难题”使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。实验语言:c;实验环境:linux1.2实验容需要完成bits.c中下列函数功能,具体分为

2、三大类:位操作、补码运算和浮点数操作。1.3实验设计源码如下:/*lsbZero-set0totheleastsignificantbitofxExample:lsbZero(0 x87654321)=0 x87654320Legalops:!&八|+Maxops:5Rating:1*/intlsbZero(intx)/x右移一位再左移一位实现把最低有效位置0 x=x1;x=x1;returnx;/*byteNot-bit-inversiontobytenfromwordxBytesnumberedfrom0(LSB)to3(MSB)Examples:getByteNot(0 x1234567

3、8,1)=0 x1234A978Legalops:!&八|+Maxops:6*Rating:2*/intbyteNot(intx,intn)/x第n个字节每位都和1异或实现取反inty=0 xff;n=n3;y=yn;x=(xy);returnx;/*return0,return0,example:byteXor(0 x12345678,0 x87654321,1)=1byteXor(0 x12345678,0 x87344321,2)=0Legalops:!&八|+Maxops:20Rating:2*/intbyteXor(intx,inty,intn)/把x和y的第n个字节取出来异或,再转

4、换为逻辑的0和1n=nn;y=yn;x=x&(0 xff);y=y&(0 xff);return!(x”/*logicalAnd-x&yLegalops:!&八|+Maxops:20Rating:3*/intlogicalAnd(intx,inty)/把X和y分别转化为逻辑的0和1,再相与x=(!(!x)&(!(!y);returnX;/*logicalOr-X|yLegalops:!&八|+MaXops:20Rating:3*/intlogicalOr(intX,inty)/把x和y分别转化为逻辑的0和1,再相或X=(!(!X)|(!(!y);returnx;/*rotateLeft-Rot

5、atextotheleftbynCanassumethat0=n=31Examples:rotateLeft(0 x87654321,4)=0 x76543218Legalops:&八|+!Maxops:25Rating:3*/introtateLeft(intx,intn)/先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&z即可intz;z=(131)(32+(n+1)&z)+(xn);returnx;/*parityCheck-returns1ifxcontainsanoddnumberof1s*Examples:parityCheck(5)=0

6、,parityCheck(7)=1Legalops:!&八|+Maxops:20Rating:4*/intparityCheck(intx)/每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1inty;y=x16;y=yx;y=y(y8);y=y(y4);y=y(y31;return!(!y);/*mul2OK-Determineifcancompute2*xwithoutoverflowExamples:mul2OK(0 x30000000)=1mul2OK(0 x40000000)=0*Legalops:&八|+Maxops:20Rating:2*/intmul

7、2OK(intx)/把x第31位和30位分别和1做按位与,再异或,再和1异或intm;m=(x31)&0 x1厂(x30)&0 x1);returnm0 x1;/*mult3div2-multipliesby3/2roundingtoward0,*ShouldexactlyduplicateeffectofCexpression(x*3/2),*includingoverflowbehavior.*Examples:mult3div2(11)=16*mult3div2(-9)=-13*mult3div2(1073741824)=-536870912(overflow)Legalops:!&八|

8、+Maxops:12Rating:2*/intmult3div2(intx)/左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1inty=(x1)+(y31)&1)&(y31)&1);returny;/*subOK-Determineifcancomputex-ywithoutoverflowExample:subOK(0 x80000000,0 x80000000)=1,subOK(0 x80000000,0 x70000000)=0,Legalops:!&八|+Maxops:20Rating:3*/intsubOK(intx,inty)/x的最高有效位和y的最高有

9、效位不同且x和(x-y)的最高位不同才能判断溢出intm=(x31)&1;intn=(y31)&1;x=(mn)&(m八(x+(y+l)31)&1);return(!x);/*absVal-absolutevalueofxExample:absVal(-1)=1.*Youmayassume-TMax=x=TMaxLegalops:!&八|+Maxops:10Rating:4*/intabsVal(intx)/x最高位为0时就是x,最高位为1时是x+1inty=x31;x=(y&(x+1)+(y)&x);returnx;/*float_abs-Returnbit-levelequivalento

10、fabsolutevalueoffforfloatingpointargumentf.Boththeargumentandresultarepassedasunsignedints,buttheyaretobeinterpretedasthebit-levelrepresentationsofsingle-precisionfloatingpointvalues.WhenargumentisNaN,returnargument.Legalops:Anyinteger/unsignedoperationsincl.|,&.alsoif,whileMaxops:10Rating:2*/unsign

11、edfloat_abs(unsigneduf)intx=uf&(10 x7f800000)returnuf;elsereturnx;/*float_f2i-Returnbit-levelequivalentofexpression(int)fforfloatingpointargumentf.Argumentispassedasunsignedint,but*itistobeinterpretedasthebit-levelrepresentationofa*single-precisionfloatingpointvalue.*Anythingoutofrange(includingNaNa

12、ndinfinity)shouldreturn*0 x80000000u.*Legalops:Anyinteger/unsignedoperationsincl.|,&.alsoif,while*Maxops:30*Rating:4*/intfloat_f2i(unsigneduf)unsignednum=0 x80000000;intx=(uf&0 x007fffff厂0 x00800000;intorder=0;order=(uf&0 x7f800000)23;if(order158)returnnum;if(order31)&1)=1)if(order150)return(x(150-o

13、rder)+1;elseif(order150)returnx(150-order);1.4实验过程编写源码,运行btest,得出实验结果。1.5实验结果ftangUwel(&esting:-/tangliwelt吕ngliwei(3esting:-$cdtangliwev/tangltwetesting:-/tangllwei$./btestScoreRatingErrorsFunction110IsbZero220byteNot220byteXor330logicalAnd330logicalOr330rotateLeft440parityCheck220muX20K220nult3dtv

14、2330subOK440absVal220floatabs440floatZfZtTotalpoints:35/3StangliweiQesting:-/tangltwei$可见13个函数全部正确。1.6实验小结此次实验主要考查的是对数据的处理,对此需要掌握数据在机器中的表示运用合理的位运算来实现相应的功能。实验2:BinaryBombs2.1实验概述本实验中,你要使用课程所学知识拆除一个“binarybombs来增强对程序的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。一个“binarybombs(二进制炸弹,下文将简称为炸弹)是一个Linux可执行C程序,包含了6个阶段(p

15、haselphase6)。炸弹运行的每个阶段要求你输入一个特定的字符串,若你的输入符合程序预期的输入,该阶段的炸弹就被“拆除”,否则炸弹“爆炸”并打印输出BOOM!字样。实验的目标是拆除尽可能多的炸弹层次。每个炸弹阶段考察了机器级语言程序的一个不同方面,难度逐级递增:*阶段1:字符串比较*阶段2:循环*阶段3:条件/分支*阶段4:递归调用和栈*阶段5:指针*阶段6:链表/指针/结构另外还有一个隐藏阶段,但只有当你在第4阶段的解之后附加一特定字符串后才会出现。为了完成二进制炸弹拆除任务,你需要使用gdb调试器和objdump来反汇编炸弹的可执行文件,并单步跟踪调试每一阶段的机器代码,从中理解每一

16、汇编语言代码的行为或作用,进而设法“推断”出拆除炸弹所需的目标字符串。这可能需要你在每一阶段的开始代码前和引爆炸弹的函数前设置断点,以便于调试。实验语言:C语言实验环境:linux2.2实验容反汇编bomb,得到汇编代码,根据汇编代码完成拆炸弹任务。2.2.1阶段1字符串比较任务描述:找到与输入的字符串进行比较的存储的字符串的首地址,进而得到存储的字符串,得到结果。实验设计:根据反汇编代码一步一步分析,具体见实验过程。实验过程:将bomb反汇编输出到asm.txt文件中,在反汇编代码中查找phase_1的位置:O8048b9O:8048b9O:83ecsub$0 xlcesp8048b93:c

17、744240404d204movl$0 x804d204,Ox4(9fiesp)8048b9s:088048b9b:8b442420novxzo(?5esp),%esx8048b9f:890424nov%eax,(esp)8048bd2:e823OS0000call80490caing百not已quaL8048ba7:85C0test%eax,94eax8048bd9:7405je|8048bb0phdse_l+0 x20?*8048bdb:e825OS0000call80491d5所需要的两个变量是存在于ebp所指的堆栈存储单元里,在main函数中:8048acf:e878070000cal

18、l804924c8048ad4:890424movKeax,(%esp)得知%eax里存储的是调用read_line()函数后返回的结果,就是输入的字符串,所以得知和用户输入字符串比较的字符串的存储地址为0 x804a204,可用gdb查看这个地址存储的数据容:曇碁令tangllweiestln:-/U30H14S135x08043abe104tn/jsr/tncljde/t386-llniJM-gnij/btts/stdtoZ.h(fldb)niWeIconetomyfiendishlittieb?mb+Youhavephaseswith&x&8fl48at3tnprtntf_ffflt=)

19、jt/sr/triclijde/t3fl6-ltriLjK-gAj/btts/stdta2.h:104104In/usr/tnclude/tSSe-ltnuK-gnu/tlts/stdiaZ.h(fldb)niBx08048acfl104in/jsr/include/i386-Iinux-gru/bit5/5tdio2,h(gdb)ntwhichtoblahy&urselfup.HaveantcedyLPlain(argc=l,argv=aKffffdlb4)atbomb.c:7373input工read_lirie();/*Getinput(gdb)rrintnini74phase_l(in

20、put);/*Runthephase(gdb)m/20 xArgumentrequired(stsrtirgdisplayaddress).(gdb)x/26xOK64a264&K84a204:2065605075747566&K772&6572x2S6c6c69&xaMa214t0X6220656265747465&Xfif7420720K72726f6d&Ka04a224:0Xfl02e77fif&K2177fif57&K7SCfS5200X206576279X0043234:0X75&6&564OKZ064&5733X206560740X7Z&36573dx8Q4a244:9X73Z07

21、4650 x656761745x642500210 x26632520(gdb)|翻译过后的结果为Thefuturewillbebettertomorrow.实验结果:tangliweie5ting:*/li201414313tarigliweiesticdU29141481S/tdngliweiesttng:/U201414ai3$./bombWelcometomyfiendishlittlebomb*Vouhave6phaseswithwhichtoblowyourselfup.Haveaniceday!Thefuturewillbebettertomorrow.Phase1defused

22、.Howabout七hEnex七one?可见结果正确。2.2.2阶段2循环任务描述:完成炸弹2的拆除实验设计:观察分析phase_2代码,使用gdb调试分析结果实验过程:找到phase_2代码:08048bt)4:S04Sbb4563048bb5538048bb&83SC348048bb98d442418Ba4BbbdB94424348O48bcl8b424408O48bc589&4248048bcSe82f0600SO8048bcd837c2418SO8048bd27S078048bd1337c24lcQI8948bd9了斗If8048bdbe8fS0500SOB64EbeSeb18S048

23、be28b43f8S048be50343fc8048be839&38048bea74058048b&ce&OS00008048bf133c3048048bf439f38048bf675eafi646bfBebOafi64Bbfa8d5c24203048bfe3d742430S948C02ebde8048C0483c434B048C07Sb8O48C0S5eS048C09cSpush9fiesipush%ebxsub$0 x34,?6esplea0K18(%esp)3eaxnow9S&3K,OK(esp)novOxO(9fiesp)nov%eax,(Kesp)call80491fccnplS0

24、x0,0 xl8(%esp)jneSOlSbdbcphase_2+0 x27!cnpl$0 x1,0 xlct?fiesp)jesoisbfacallS0191d5-c&xplode_bombadd$0 x4,9fiebxcmp%est,%ebxjne&048be?jnp8f)48c94cphase_2+Ox50=*leaOx2O(9fiesp)3&bxleaOK3O(9tiesp)jnpsoisbezadd$0 x34,%esppop需ebxpop9fiesiret由read_six_numbers知是要输入6个数字,观察8048bcd:837c2418008048bd2:75078048b

25、d4:837c241C018048bd9:74If8048bdb:e8f5050000cmpljnecmpljecall$0 x0,OxlS(9fiesp)8048bdb$0 x1,0 xlc(9fiesp)8048bfdphase_2+0 x46?*8049Ld5explode_bomb?*可知输入的第一个和第二个必须依次为0,1804Sbfd:804Sbfe:8048C02:0023422c4e7dddb88e0 x?O(9fiesp),9fiebx0 x3O(9fiesp),9fiesi8048be28048be2:8b43f8nov-Ox8(9iebx),9fieax8048be5:9

26、343fcadd-Ox4(9iebx),9fieax8048be&:3903cmp%eax,(9Sebx)8048bea:7435je8048bf1观察这两个循环可知只有当输入的数为前两个数之和时才不会bomb,故得到序列0,1,1,2,3,54.实验结果:输入上述序列后得:tangliweiestrng:-/U2D1414013gliweiResting:-/11291414813$./bombWelcometonyfiendishLittiebomb.Youhave6phaseswithwhtchtoblowyourselfup.Haveani匚巴day!Thefuturewillbebe

27、ttertomorrow.Phase1defused*Howaboutthenextore?011235Thatsnumber2.Keepgoing可知结果正确。2.2.3阶段3条件/分支任务描述:完成炸弹3的拆除实验设计:观察分析phase_3代码,使用gdb调试分析结果实验过程:找到phase_3代码如下:08048c0a:8048c0a:83ec3csub$0 x3c,%esp8048c0d:8d44242clea0 x2c(%esp),%eax8048c11:89442410mov%eax,0 x10(%esp)8048c15:8d442427lea0 x27(%esp),%eax80

28、48c19:8944240cmov%eax,0 xc(%esp)8048c1d:8d442428lea0 x28(%esp),%eax8048c21:89442408mov%eax,0 x8(%esp)8048c25:c74424044ea204movl$0 x804a24e,0 x4(%esp)由此行代码查看输入容:(gdb)x/s0 xS04a24e0 x8O4d24e:,FKd叙临可知输入的依次是数字、字符、数字8048c43:838048c43:837c2428078048c48:0f87f5000000cmpl$0 x7,0 x28(%esp)ja8048d438048d43:e88

29、d0400008048d43:e88d040000call80491d5可见输入的第一个数一定小于78048c4e:8b4424288048c4e:8b442428mov0 x28(%esp),%eax8048c52:ff248560a20408jmp*0 x804a260(,%eax,4)假设输入的第一个数为0,即(%eax)=0,所以:(gdb)p/X*0 xS04a26O$4=0X8O48C598048c59:b876000000mov$0 x76,%eax8048c5e:817c242c040100cmpl$0 x104,0 x2c(%esp)所以第二个字符ascll码为0 x76,即

30、字符v而第三个数为0 x104,即260实验结果:tdngli-wetesttng:/U2eil414813$,/bonbans.txtWelconetonyftendi&hlittlebomb*Youhave6phaseswithwhich七oblowyourselfup.Haveanl匚吕day1Phase1defused.Howabout七hinex七one?That1snumber2.Kee-pgoing!0v26Halfwoy七here1从实验结果来看结果正确,拆弹成功。2.2.4阶段4递归调用和栈任务描述:拆除炸弹4实验设计:观察分析phase_4代码,使用gdb调试分析结果3实验

31、过程:08048db98048db9:&3ec2csub$Ox2c,9fiesp8048dbc:&cJ4424lcleaOxlc(%esp),%eax8048dc3:894424OcP1OVKeax,Oxc(%esp)8048dc4:&cJ442418lea0 xl8(%esp),%eax8048dc8:89442498P1OVKeax,0 x8(%esp)8048dcc:c7442494cfa304PlOVl$0 x804d3cf,0 x4(%esp)8048dd3:08用x/sb0 x804a3cf来查询有几个输入以及输入的类型,如下所示:(gdb)x/sb0 xS&4a3cf9x804a

32、3cfrM(9db)|由此可见输入是两个整数。再由phase_4中:&号7c24lcIf7435eSt703000083C42CC3&948el2:84&el7;&948el2:84&el7;804&C19;8943ele:8943e21;je8048elephase_4+0 xcdll80491d5explode_boradd$0 x2c#%e&p吐知道func4第二个参数值为If,即37再仔细研究func4函数,发现其实现了递归调用:08048d5c:8048d5c:56push%esi8048d5d:53push%ebx8048d5e:83ec14sub$0 x14,%esp8048d6

33、1:8b542420mov0 x20(%esp),%edx/ebx是传递的参数/8048d65:8b442424mov0 x24(%esp),%eax8048d69:8b742428mov0 x28(%esp),%esi8048d6d:89f1mov%esi,%ecx8048d6f:29c1sub%eax,%ecx8048d71:89cbmov%ecx,%ebx8048d73:c1eb1fshr$0 xlf,%ebx/ebx右移31位/8048d76:01d9add%ebx,%ecx8048d78:d1f9sar%ecx8048d7a:8d1c01lea(%ecx,%eax,1),%ebx80

34、48d7d:39d3cmp%edx,%ebx8048d7f:7e17jle8048d988048d81:8d4bfflea-0 x1(%ebx),%ecx8048d84:894c2408mov%ecx,0 x8(%esp)8048d88:89442404mov%eax,0 x4(%esp)8048d8c:891424mov%edx,(%esp)8048d8f:e8c8ffffffcall8048d5c8048d94:01d8add%ebx,%eax8048d96:eb1bjmp8048db38048d98:89d8mov%ebx,%eax8048d9a:39d3cmp%edx,%ebx8048

35、d9c:7d15jge8048db38048d9e:89742408mov%esi,0 x8(%esp)8048da2:8d4301lea0 x1(%ebx),%eax8048da5:89442404mov%eax,0 x4(%esp)8048da9:891424mov%edx,(%esp)8048dac:e8abffffffcall8048d5c8048db1:01d8add%ebx,%eax8048db3:83c414add$0 x14,%esp8048db6:5bpop%ebx8048db7:5epop%esi8048db8:c3ret下面就来剖析func4,这个函数在确定栈之后,首先取

36、出来传递给它的参数,依次放在eax,edx,esi.中,从一个jle和一个jge可以看出,这个递归函数跳出的条件根据func4的第二个参数和第二个参数进过种种运算的结果等于第一个参数即可。注意在递归过程中第一个参数是不变的,最后返回值是经过运算后的ebx加上第一个参数。当时做实验时推出了具体的表达式,未记录下来,只记录了最后得出fun(ll)=31。运行结果如下:tangliweiesting:/lab2tangliwetgestingcdlab2tdngliweiestirig:-/lab2$*/bombCS1409_U201414013_礼屍welcometonyflencltshlitt

37、lebopib.youhave&phasesuitthwhichtoblowyourselfup”Haveaniceday1Phase1defused*Flowaboutthenextone?Thatsnunber2+KeepyolngHalfwaytherel1331soyougatthatone+Trythisone.tangllwelestlng:/l3bztangliweiesting:-5cdLab2tangli.weiesti.ng:/lab2$汀bombans.txtwetconetonyfiendishlittlebonb.Youhave5phaseswithwhichtobl

38、oMyourselfup*Haveaniceday!Phase1defused*hdwabodtthenextone?Thatsnumber2.Keepgoing!Halfwaythere!soyougotthatone.T誌thisone.由此可见,phase_4拆除成功!4实验结果:给出阶段x的实验结果和必要的结果分析2.2.5阶段5phase_5任务描述:拆除一个关于指针的炸弹。实验设计:此阶段实验与指针相关,又根据静态调试跟踪可知,需借助gdb的动态调试跟踪来查找相关地址中存放的数据的值,进而分析出最终的拆弹密码。实验过程:首先观察代码,分析代码时发现有多个跳转指令,具体为x15时,b

39、omb;x=l时,取x低4位;)0O48e22;0048&2283ec2cBB4SE258d4424lc0O48e29)0O48e22;0048&2283ec2cBB4SE258d4424lc0O48e29894424DeB648e2d8d4424IBB64fie3189442斗08B64Be35C74424048048S3C8B9ise3d8t)442430S048e418904249048&44e817faff6348&4983f801B343已4匚7f05S048e4ee88203038048538t)442418B048e5783eO0f0O48e5aS94424IB0O48e5e83

40、feOf口7dgsubleanovLenovcf胡&4novinovnovffcallcrnpjgaacallnovandnovcnpTA-Jiti3X,Dxc(espSxl8(Kespl,5&eaxNeax,OxS(ef)OxB04a3cf0 x3O(Kesp)fSeax?ieax,(wesp)808860_tiocSsscanfplt=*$exiJ%eaxSf)4Se5380191d56xl8(%espKax$0 xf,%edxMcexflKlBtKcsp)$Dxf,%eaxfi-rnihJiCa+AVrfi.使用gdb调试发现,要输入的是两个%d数。由后面的步骤知输入第一个数为初始数组下

41、标,第二个数为循环15次累加求的和。再接着:8048e70:8b048580a20408mov0 x804a280(,%eax,4),%eax,这句就是从(0 x804a280+eax*4)里面拿数据出来,加到eax上。8948e53:b900000900movS04Se63:ba0D0D00OOmovOxOjKed8048e6d:33c201add$Oxledx8O4Se70:3b0485S3a20408mov0KBO4a2BD(#%eaxp4),Seax8048077101claddeBX,5Set:K因为eax只能是0F的数,所以0 x804a260这个地址里面存的应该是一个数据大小为1

42、6的数组,用gdb看,得到:观察到果然是一个数组,然后下面就是把5个输入对应ascll码的低4位转换的十进制数对应的数值一个一个的转化为这个数组,得到累加值ecx。(gdb)p*0 x804a28316$1=10,2t14,7,8,12,15,11,9,41,13,3,9,6,S观察循环部分:89442418mov83f8Of匸np742ajeb900000000movba00000000mov83c201add8b048580a20408mov01cladd83f8Of匸np75efjne89442418mov83faOf匸np7506jne3b4c24lc匸np7405jee8430300

43、00call83c42cadd8048e5d8048e5e8048e618048e638048e5d8048e5e8048e618048e638048e688048e6dS048e708048e778048e798048e7c8048e7e8048e828048e858048e87S048e8bS048e8d8048e92$Oxf,%eax8048e8d$OxO,%ecx$OxO,%edx$Oxl,%edxOx804a28O(,%ea|x,4),%ea%eax,%ecx$Oxf,%eax8048e6d%eax,0 xl8(%esp)$Oxf,%edx8048e8dOxlc(%esp),%ecx

44、8048e9280491d5$0 x2c,%esp由此知当退出循环的条件是取出的数eax为15,而且循环次数为15次由于115=12+3+7+11+13+9+4+8+10+1+2+14+6+15二a(5)+a(12)+a(6)最后得到的ecx值是115,输入的初始数组下标为5。所以答案为:5115实验结果:tangliwetgestLngz/lab2$./bombans.txtWelconetonyfiendishlittlebomb”Youhave6phaseswithwhichtoblowyourselfup*Have3niceday!Phase1defused.Howsboutthene

45、xtone?rhatsnumberKeepgoing!HalfwaythereSdyougotthatone*Trythison亡Goodwork!Ontothenext.可知结果正确。2.2.6阶段6phase_6任务描述:拆除一个关于链表/指针/结构的炸弹。实验设计:初步静态分析,此阶段代码有些过长,所以单纯通过静态调试跟踪有些困难因此我首先找到几个循环体,通过静态调试跟踪和动态调试跟踪的方法来确认循环体的功能,最后将循环体结合起来,拆除此阶段炸断。实验过程:由于代码较长,为便于分析,先总结一下,phase_6分为:参数读取,一个双层循环,三个单层循环。首先是参数读取:=phase_6:5

46、6pushwestafl4Se97:S3push%ebx8048e9&;S3ec44sub$0 x44,Me&p0O4Se9b:Sd442410lea0 x10(Kesp),WeaxB04Me9f:B9442404noveax,3x4(iesp)8b44450novB0iaeiT:&90斗21n&vKeaXj(nesp)8048eaa;eS4d630&00calla049Ifciread-SiX-nuimhE0043eaf:be900000&mov$OxOdSfiesi604Seb4:8b44bl10nov0jclfJ(Kesp,estF4)eaKBOaeba:83es01sub$0 x1BO

47、iaebb:83rs65cnp$oxs,ffieaxBOSebe;7635jbe304Sec5phase_6+0 x2f0048ecO:e8100300&call30491d5explodebomb由此可见,readsix_number所有参数均小于6且不相等。由于后面代码部分过多,便采用gdb单步执行来了解代码的功能。在此,观察到后面:S048efb:ba3ccl0408mov$Ox804cl3c,?6edKSI348fOO:8954b428nov%edx,ox2a(?fiesp,%est,4可以看到输入六个数字的初始地址值在0 x804cl3c,再由for循环中:8048ebf:8b520

48、8mov0 x8(%edx),%edx可以看出六个数字按8个字节的顺序进行排列,因此分别调用gdb查看(0 x804c13c)、*(0 x804c13c+0 x8)、*(*(0 x804c13c+0 x8)+0 x8)、*(*(*(0 x804c13c+0 x8)+0 x8)+0 x8)、*(*(*(*(0 x804c13c+0 x8)+0 x8)+0 x8)+0 x8)、*(*(*(*(*(0 x804cl3c+0 x8)+0 x8)+0 x8)+0 x8)+0 x8)的值即可。如图所示:tangliweiesting:*/lab2tangliweiesting:*/lab2ThereisN

49、OWARRANTS,totheextentperFlittedbylowandshowwarrantyThereisNOWARRANTS,totheextentperFlittedbylowandshowwarrantyHfordetails,ThisGDBwasconfiguredas86_64-Linux-gnu.TvpeMshowconfigurationforconfigurationdetailsForbugreportinginstructions,pleasesee:http:/www*gnu,org/software/gdb/bugs/FindtheGDBmanualandot

50、herdocumentationresourceshttp:/www*gnu”org/software/gdb/documentation/*Forhelp,typehelp,p.TypeaproposwordtosearchforconmandsrelatedtoReadingsynbolsfrombonb.done(gdb)x/3x(0 x8G4cl3c)0 x0O4cl3c:9x30900292(gdb)x/3x*(0 x804cl3c+0 x8)0 x804cl48:OxOOOQ03S5(gdb)x/3x*(*(0 x894cl3c+Ox8)+0 x8)0 x8O4cl54:TypeH

51、showcopyingonlineati0X00O009C69x090000910X0OOOOOOZ0 x09000903Ox00O4cl480 x0S04cl540X0SO4C1&0(gdb)x/3x*(*(*(0 xSB+cl3c+exe)+ex8)+OxB)O?(804cl69:OxO0O0O3db0 x00000004(gdb)x/sx*(*(*(*(ox8a4ci3c+exs)+ax8)4-oxs+oxsO?(804cl69:OxO0O0O3db0 x00000004(gdb)x/sx*(*(*(*(ox8a4ci3c+exs)+ax8)4-oxs+oxs)0?(804cl6c:(g

52、db)x/3x*(*(*(*(*(OxS04cl3c+Ox8)+0 x&)十0 x8)十9x904cl7Scnode6:fnrlh】0X0SO4C1&COxO0OSOO7e0X0000939S0 x090000053X0009900&Ox0S04cL780X00000900在下面检测链表值时,要求链表值从大到小排列。由上图可以看出,链表原本各个位置的值按顺序排列位:292385c63db7e308。按从小到大顺序排列应该为:7ec62923083853dbo由此可以看出,用户应该输入:531624。实验结果:tangliweiesting:/lab2tangliweietingicdlab2t

53、angliweigesttng:/Lab2$./bombans*txtWelcometomyfiendishlittlebomb*Youhave6phaseswithwhichtoblowyourselfup*Haveanid已day1Phase1defused*Howaboutthenextone?rhatsnumber2*Keepgoing1Halfwaythere!Soyougotthatone.Trythisone.GoodworklOntothenext*,Congratulations!Youvedefusedthebombltangliweigesttng:/Lab2$|可见结果

54、正确。1.3实验小结本次实验熟悉了obj、gdb的各种操作,对数据在计算机中的存储有了更加清晰的认识,更加加深了对汇编代码的理解,对循环、分支、数组指针结构在机器部的存储有了更深刻的认识。实验3:缓冲区溢出攻击3.1实验概述本实验的目的在于加深对IA-32函数调用规则和栈结构的具体理解。实验的主要容是对一个可执行程序“bufbomb实施一系列缓冲区溢出攻击(bufferoverflowattacks),也就是设法通过造成缓冲区溢出来改变该可执行程序的运行存映像,继而执行一些原来程序中没有的行为,例如将给定的字节序列插入到其本不应出现的存位置等。本次实验需要你熟练运用gdb、objdump、gc

55、c等工具完成。实验中你需要对目标可执行程序BUFBOMB分别完成5个难度递增的缓冲区溢出攻击。5个难度级分别命名为Smoke(level0)、Fizz(level1)、Bang(level2)、Boom(level3)和Nitro(level4),其中Smoke级最简单而Nitro级最困难。实验语言:c;实验环境:linux3.2实验容设法通过造成缓冲区溢出来改变该可执行程序的运行存映像,继而执行一些原来程序中没有的行为。3.2.0阶段0smoke任务描述:将getbuf函数执行return后执行test函数改为执行smoke函数。2实验设计:首先根据反汇编代码求得buf离返回地址的字节距离,

56、确定要填充几个字节,然后找到smoke函数的起始地址,把这个地址填入buf末尾,即可实现该功能。实验过程:首先通过gdb工具对bufbomb文件进行反汇编,查看getbuf的汇编代码:B6491ec:5580491edB6491ec:5580491ed:&9e5804?lef:83ec38Bfi491fZ:3d45d8S9042480491fS:&S55fbffffBfi491fd:b801000000B649262:匸98049293:C308041ec咗getbufp:push9Sebpmov%esp,%ebpsub$0 x38,%esplea-0 x28(%ebp)mov%eax,(%e

57、sp)call804Sd52cGetsmov$0 x1leaver&t可见lea把buf的指针地址-0 x28(%ebp)传给了Gets(),所以buf离返回地址有0 x28+4=44个字节的距离,因此只要在buf处开始填44个字节的非n数,接下来填写要返回的地址,因为要返回至smoke,查看smoke函数的代码:0804SC90csmoke0804SC90csmoke:8O48C90:55804SC9HS9e5S048c93:93ecIS&048C96:c7042413dl8048c9d:亡&cefcffff8048CS2;C7042400008048ca9:亡&96660OO08848ca

58、eiC704249000&04&cbS:e8d6fcffffpush%ebpmov%esp,?fiebpsub$9x18,9esp04OSmovl$Ox&04日(鮎亡sp)call80489700000novi$0 x0,(%e&p)call8049344cvalidate;*0000movl$0 x0,(%esp)call&048999可见smoke函数起始地址为0 x08048c90,所以最后四个字节应该填入908c0408,所以输入的48个字节为:00000000000000000000000000000000000000000000000000000000000000000000000

59、00000000000000000908c0408实验结果:tangliwei&stingt/lab3tangttwetesttng:cdlablobl/lot3/tangliweiesting:cdlab3tangLiueiesttng:/lab3$catsnoke_U201414aiS.txt|./hex2raw|./bufbonb-uU201414813_Userid;U2014148IScookte:a6799ab37Typestring:Smoke!:Youcalledsnoke()WALIDMICEJOBtangLiweie&ttng:/lab3$|可见getbuf成功返回至smo

60、ke。3.2.1阶段1fizz1任务描述:将getbuf函数执行return后执行test函数改为执行fizz函数。实验设计:跟阶段0类似,多了一个比较cookie环节,所以要把cookie填入相应地址。实验过程:只是将执行的函数从smoke改为fizz,查看fizz的汇编代码:08048cbsizz08048cbsizz:8048cba558043cbb89e58043cbd83ec188048CC08b45088048CC33b0520C204088048CC975le8048ccb894斗24048048ccfc70斗242eal048048cd6e8f5fbffff8048cdbC70

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论