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

下载本文档

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

文档简介

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

2、.c中下列函数功能,具体分为三大类:位操作、补码运算和浮 点数操作。1.3实验设计源码如下:/*IsbZero - set 0 to the least significant bit of xExample: lsbZero(0 x87654321)二 0 x87654320Legal ops: ! & | + Max ops: 5Rating: 1*/int lsbZero(int x) (/x右移一位再左移一位实现把最低有效位置0 x = x1;x = x1;return x;/*byteNot - bit-inversion to byte n from word xBytes num

3、bered from 0 (LSB) to 3 (MSB)Examples: getByteNot(0 x12345678,1)= 0 x1234A978Legal ops: ! & | + Max ops: 6Rating: 2*/int byteNot(int x, int n) (/x第n个字节每位都和1异或实现取反int y = 0 xff;n = n3;y = yn;x =(xy);return x;/*byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1example

4、: byteXor(0 x12345678, 0 x87654321, 1)二 1byteXor(0 x12345678, 0 x87344321, 2)二 0Legal ops: ! & | + Max ops: 20Rating: 2*/int byteXor(int x, int y, int n) (把x和y的第n个字节取出来异或,再转换为逻辑的0和1n = nn;y = yn;x = x&(0 xff);y = y&(0 xff);return !(xy);/*logicalAnd - x & yLegal ops: ! & | + Max ops: 20Rating: 3*/int

5、 logicalAnd(int x, int y) (把x和y分别转化为逻辑的0和1,再相与x =(!(!x)&(!(!y);return x;/*logicalOr - x| y*Legal ops: ! &| + *Max ops: 20*Rating: 3*/intlogicalOr(int x,int y) 把x和y分别转化为逻辑的0和1,再相或x =(!(!x)|(!(!y);return x;/*rotateLeft - Rotate x to the left by nCan assume that 0 = n = 31Examples: rotateLeft(0 x876543

6、21,4)= 0 x76543218Legal ops: & | + !Max ops: 25Rating: 3*/int rotateLeft(int x, int n) (先构造低n位为1,高(32-n)位为0的数z, x左移n位后的数加上x右 移(32-n)位的数&z即可int z;z 二 (131)(32+(n+1)&z) + (xn);return x;/*parityCheck - returns 1 if x contains an odd number of 1sExamples: parityCheck(5)= 0, parityCheck(7)二 1Legal ops: !

7、 & | + Max ops: 20Rating: 4*/int parityCheck(int x) (每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为 逻辑的0和1int y;y = x16;y = yx;y = y(y8);y = y(y4);y = y(y2);y = y(y31;return !(!y);/*mul2OK - Determine if can compute 2*x without overflowExamples: mul2OK(0 x30000000)二 1mul2OK(0 x40000000)二 0*Legal ops: & | + Max o

8、ps: 20Rating: 2*/int mul2OK(int x) (把x第31位和30位分别和1做按位与,再异或,再和1异或int m;m =(x31)&0 x1)(x30)&0 x1);return m0 x1;/*mult3div2 - multiplies by 3/2 rounding toward 0,Should exactly duplicate effect of C expression (x*3/2),includingoverflow behavior.Examples:mult3div2(11)二 16mult3div2(-9)二-13mult3div2(10737

9、41824)二-536870912(overflow)Legal ops: ! & | + Max ops: 12Rating: 2*/int mult3div2(int x) (/左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还 要+1int y =(x1) + (y31)&1)&(y31)&1);return y;/*subOK - Determine if can compute x-y without overflowExample: subOK(0 x80000000,0 x80000000)= 1,subOK(0 x80000000,0 x70000000)=

10、 0,Legal ops: ! & | + Max ops: 20Rating: 3*/int subOK(int x, int y) (/x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判 断溢出int m =(x31)&1;int n =(y31)&1;x =(mn)&(m(x+(y+1)31)&1);return (!x);/*absVal - absolute value of xExample: absVal(-1)= 1.You may assume -TMax = x = TMaxLegal ops: ! & | + Max ops: 10Rating: 4*/

11、int absVal(int x) (/x最高位为0时就是x,最高位为1时是x+1 int y = x31;x =(y&(x+1) + (y)&x);return x;/*float_abs - Return bit-level equivalent of absolute value of f forfloating point argument f.Both the argument and result are passed as unsigned ints, butthey are to be interpreted as the bit-level representations o

12、fsingle-precision floating point values.When argument is NaN, return argument.Legal ops: Any integer/unsigned operations incl. |, &. also if, whileMax ops: 10Rating: 2*/unsigned float_abs(unsigned uf) int x=uf&(10 x7f800000)return uf;else return x; /*float_f2i - Return bit-level equivalent of expres

13、sion (int) ffor floating point argument f.Argument is passed as unsigned int, butit is to be interpreted as the bit-level representation of asingle-precision floating point value.Anything out of range (including NaN and infinity) should return0 x80000000u.Legal ops: Any integer/unsigned operations i

14、ncl. |, &. also if, whileMax ops: 30Rating: 4*/int float_f2i(unsigned uf) (unsigned num=0 x80000000;int x=(uf&0 x007fffff广0 x00800000;int order=0;order=(uf&0 x7f800000)23;if(order158)(return num;if(order31)&1)=1)if(order150)(return (x(150-order)+1;else(if(order150) return x(150-order);1.4实验过程编写源码,运行

15、btest,得出实验结果。1.5实验结果tangUwel(Westing: -/tanglf weitangliwei(3esting:-$ cdtangli wei./tangltwetesttng:-/tanglt wet$ ./btestScoreRatingErrorsFunction110LsbZero220byteNot220bytexor330logicalAnd330logicalOr330rotateLeft440parttyCheck220nul2GK220Eult3dlv2330subOK440absVal220float_abs440floatZfZtTotalpoin

16、ts:35/35tangliwetesting:*/tanglt wei$可见13个函数全部正确。1.6实验小结此次实验主要考查的是对数据的处理,对此需要掌握数据在机器中的表示, 运用合理的位运算来实现相应的功能。实验 2: Binary Bombs2.1实验概述本实验中,你要使用课程所学知识拆除一个“binary bombs”来增强对程序 的机器级表示、汇编语言、调试器和逆向工程等方面原理与技能的掌握。一个“ binary bombs”(二进制炸弹,下文将简称为炸弹)是一个 Linux 可执行C程序,包含了 6个阶段(phase1phase6)。炸弹运行的每个阶段要求你 输入一个特定的字符串

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

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

19、$0 x804d204,Ox4(9fiesp)8048b9s:088048b9b:3b 44 24 20FIOVxzo(?5esp) ,%esx8048b9f:89 04 24FIOV%eax,(esp)8048bd2:e8 23 OS 90 00call80490ca8048ba7:85 C0test%eax,94eax8048bd9:74 05je|8048bb0 phdse_l+0 x20?*8048bdb:e8 25 0& 00 00call80491d5 explode_bomb?*8048bb0:83 c4 Idadd$0 xlc,esp8048bb3:c3ret从上面的语句可以看

20、出所需要的两个变量是存在于%ebp 所指的堆栈存储单元里,在main函数中:8048acf:e8 78 07 00 00call804924c 8048ad4:89 04 24movKeax,(%esp)得知%eax里存储的是调用read_line ()函数后返回的结果,就是输入的字符串, 所以得知和用户输入字符串比较的字符串的存储地址为0 x804a204,可用gdb查 看这个地址存储的数据容:爨9巨 tangllweiestln: -/U30H14S135x08043abe104 tn /jsr/tncljde/t386-llniJM-gnij/btts/stdtoZ.h(gdb) nWe

21、 I co ne to my fiendish little b?nb+ You have 6 phases with &x&8fl48at3 tn prtntf ( _ffflt=aptlmtzed out)jt /sr/triclijde/t3fl6-ltriLjK-gAj/btts/stdta2.h: 104104 tn /Lsr/tnclude/t386-ltnuK-gnu/tlts/stdt(j2. h (gdb) ni.Bx08048acfl 104 in /jsr/include/i386-Iinux-gru/bit5/5tdio2,h (gdb) m which to blah

22、 y&urself up- Have a ntce dyL Plain (argc=l, argv=aKffffdlb4) at bomb.c:7373input 言 read_lirie();/* Get input(gdb) ntninini74phase_l(input);/* Run the phase7(gdb) m/20 xArgument required (stsrtirg display address).(gdb) x/26x:OK64a264&K84a204:凯 2%56854075747566&K772&6572x2S6c6c69&xaMa214t0X622065626

23、5747465&Xfif7420720K72726f6d&Ka04a224:0Xfl02e77fif&K2177fif57&K7Se5ting: */U201414313tarigliweiesting:cd U29141481S/tdngliweiesting:11201414313$ J bombWelcome to my fiendish little bomb * Vou have 6 phases withwhich to blow yourself up. Have a nice day!The future will be better tomorrow.Phase 1 defu

24、sed. How about the next one?可见结果正确。2.2.2阶段2循环任务描述:完成炸弹2的拆除实验设计:观察分析phase_2代码,使用gdb调试分析结果实验过程:找到phase_2代码:08948bt)4:9D4Sbb4563048bb5538043bb&83 ec 348048bb98d 44 24 18Ba4BbbdB9 44 24 348O48bcl8b 44 24 408048b匚589 &4 248048bcSe8 2f 06 00 008048bcd83 7c 24 18 008048bd27S O?3048bd133 7c 24 1c QI8943bd97

25、4 If8048bdbe8 fS 05 00 SO8O48be0eb 18SO48be28b 43 f8SO48be5O3 43 fc8048be839 &38648bea74 058O48bece&05 00 003048bf133 c3 048048bf439 f38048bf675 ea8048bf8eb 0a8048bfa8d 5c 24 208048bfe3d 74 24 30S943C02eb de8048C0483 c4 34B048C07Sb8O48C0S5eS048C09cSpushpush%ebxsub$0 x34 ,?6esplea0K18(%esp)3eaxnow9S&

26、3K, OK(esp)novOxO(9fiesp)nov,(Kesp)call80491fc cnplS0 x0,0 xl8(%esp)jneSOlSbdb cphase_2+0 x27!cnpl$0 x1,0 xlct?fiesp)jesoisbfa call80491d5 explode bomb;*jnp8f)48bfa cphdse_2+0 x46;*nov- 0 x8(9Sebx)add- 0?(4(%ebx) ,Meascnp%eax,(%ebx)jeSOISbfl cphase_2+0 x3dcallS0191d5 -c&xplode_bombadd$0 x4,9fiebxcnp

27、%est,%ebxjne8048be? jnp8f)48c94 cphase_2+Ox50=*leaOx2O(9fiesp) 3ebxleaOK3O(9tiesp)Jnpsoisbez add$0 x34,%esppop卵 etiKpop9fiesiret由read_six_numbers知是要输入6个数字,观察8048bcd:8048bd2:83 7c75 0724 1800cnpl jne8048bd4:83 7c24 1c01cnpl8048bd9:74 Ifje8048bdb:e8 fS05 0000call可知输入的第一个和第二个必须依次为0,1804Sbfd:804Sbfe:804

28、8C02:0 02 342 2c 4 e7 d d d b8 8 e$6xfl, exlB(5tesp)8048bdb phase_2+0 x27;*$6x1, flxlcfStesp)8048bfd phase_2+0 x46;*80491d5 explode bomb;*0 x?O(9fiesp),9fiebx0 x3O(9fiesp),9fiesi8048be2 8048be2:8b 43 f8nov-Ox8(9iebx) ,9fieax8048be5:93 43 fcadd-Ox4(9iebx) ,9fieax8048beS:39 03cnp%eax, (9Sebx)8048bea:7

29、4 05je8048bf1 观察这两个循环可知只有当输入的数为前两个数之和时才不会bomb,故得到序列0,1,1,2,3,5实验结果:输入上述序列后得:tangliweiesting: -/U2D1414S13tarigliweiResting:-/11291414813$ /bombWelcome to ny fiendish little bonb* You have 6 phases with which to blow yourself up* Have a nice day!The future will be better tomorrow.Phase 1 defused* How

30、 about the next ore? 0 112 3 5Thats number 2. Keep going可知结果正确。2.2.3阶段3条件/分支任务描述:完成炸弹3的拆除实验设计:观察分析phase_3代码,使用gdb调试分析结果实验过程:找到phase_3代码如下:08048c0a :8048c0a:83 ec3csub$0 x3c,%esp8048c0d:8d 4424 2clea0 x2c(%esp),%eax8048c11:89 4424 10mov%eax,0 x10(%esp)8048c15:8d 4424 27lea0 x27(%esp),%eax8048c19:89 4

31、424 0cmov%eax,0 xc(%esp)8048c1d:8d 4424 28lea0 x28(%esp),%eax8048c21:89 4424 08mov%eax,0 x8(%esp)8048c25:c7 4424 04 4e a2 04movl$0 x804a24e,0 x4(%esp)由此行代码查看输入容:(gdb) x/s 0 xS04a24e0 x8O4d24e:,FKd %c 铜可知输入的依次是数字、字符、数字8048c43:83 7c 24 28 07cmpl$0 x7,0 x28(%esp)8048c48: 0f 87 f5 00 00 00ja8048d43 8048

32、d43: e8 8d 04 00 00call 80491d5 可见输入的第一个数一定小于78048c4e:8b 44 24 28mov0 x28(%esp),%eax8048c52:ff 24 85 60 a2 04 08 jmp*0 x804a260(,%eax,4)假设输入的第一个数为0,即(%。3乂)二0,所以:(gdb) p/x *0 x804a26O$4 = 0X8O48C598048c59:b8 76 00 00 00mov$0 x76,%eax8048c5e:81 7c 24 2c 04 01 00 cmpl$0 x104,0 x2c(%esp)所以第二个字符ascll码为0

33、x76,即字符v而第三个数为0 x104,即260实验结果:tdngli-wetesttng:/U2eil414813$ ,/bonb ans.txtWelcone to ny ftendi&h little bomb. You have 6 phases with which to blow yourself up* Have a nice day 1 Phase 1 defused. How about the next one?That1 s number 2. Kee-p going! 0 v 26Halfwoy there 1从实验结果来看结果正确,拆弹成功。2.2.4阶段4递归调用

34、和栈任务描述:拆除炸弹4实验设计:观察分析phase_4代码,使用gdb调试分析结果实验过程:08048db9 :8048db9:8048dbc:83 ec 2c8d 44 24 1csublea$0 x2c,%espOxlc(%esp)8048dc3:89 44 24 OcP1OVKeax,Oxc(%esp)8048dc4:8d 44 24 18lea0 xl8(%esp)8048dc8:89 44 24 98P1OVKeax,0 x8(%esp)8048dcc:c7 44 24 04 cf a3 04PlOVl$0 xB94a3cfJ6x4(%esp)8048dd3:08用x/sb 0 x

35、804a3cf来查询有几个输入以及输入的类型,如下所示:(gdb) x/sb 0 xS&4a3cf9x804a3cf r M 对(9db) |由此可见输入是两个整数。再由phase_4中:8948el2:83 7c 24 1c IfcmplOxlfOxlcfesp)B94Bel7:74 OSje8048ele 7 03 00 00Cdll8949145 explcde_borB94Sele:83 C4 2cadd$0 x2c#%e&p8943e21;C3ret知道func4第二个参数值为If,即37再仔细研究func4函数,发现其实现了递归调用:08048d5c :8048d5c:56push

36、%esi8048d5d:53push%ebx8048d5e:83 ec 14sub$0 x14,%esp8048d61:8b 54 24 20mov0 x20(%esp),%edx /ebx 是传递的参数/8048d65:8b 44 24 24mov0 x24(%esp),%eax8048d69:8b 74 24 28mov0 x28(%esp),%esi8048d6d:89 f1mov%esi,%ecx8048d6f:29 c1sub%eax,%ecx8048d71:89 cbmov%ecx,%ebx8048d73:c1 eb 1fshr$0 x1f,%ebx/ ebx 右移 31 位 /8

37、048d76:01 d9add%ebx,%ecx8048d78:d1 f9sar%ecx8048d7a:8d 1c 01lea(%ecx,%eax,1),%ebx8048d7d:39 d3cmp%edx,%ebx8048d7f:7e 17jle8048d98 8048d81:8d 4b fflea-0 x1(%ebx),%ecx8048d84:89 4c 24 08mov%ecx,0 x8(%esp)8048d88:89 44 24 04mov%eax,0 x4(%esp)8048d8c:89 14 24mov%edx,(%esp)8048d8f:e8 c8 ff ff ffcall8048d

38、5c 8048d94:01 d8add%ebx,%eax8048d96:eb 1bjmp8048db3 8048d98:89 d8mov%ebx,%eax8048d9a:39 d3cmp%edx,%ebx8048d9c:7d 15jge8048db3 8048d9e:89 74 24 08mov%esi,0 x8(%esp)8048da2:8d 43 01lea0 x1(%ebx),%eax8048da5:89 44 24 04mov%eax,0 x4(%esp)8048da9:89 14 24mov%edx,(%esp)8048dac:e8 ab ff ff ffcall8048d5c 80

39、48db1:01 d8add%ebx,%eax8048db3:83 c4 14add$0 x14,%esp8048db6:5bpop%ebx8048db7:5epop%esi8048db8:c3ret下面就来剖析func4,这个函数在确定栈之后,首先取出来传递给它的参数,依 次放在eax,edx,esi.中,从一个jle和一个jge可以看出,这个递归函数跳出 的条件根据func4的第二个参数和第二个参数进过种种运算的结果等于第一个 参数即可。注意在递归过程中第一个参数是不变的,最后返回值是经过运算后的 ebx加上第一个参数。当时做实验时推出了具体的表达式,未记录下来,只记录 了最后得出fun(

40、11)二31。运行结果如下:cangliweiesting: /lab2tangliwetgestingcd lab2tdngliweiestirig :-/lab2$ */bomb CS1409_U201414013_孔威 welcome to ny flencltsh little bopib. you have & phases uitth which to blow yourself up. Have a nice day!Phase 1 defused* Flow about the next one?Thats nunber 2+ Keep yolngHalfway therel1

41、3 31so you gat that one+ Try this one.tangllwelestlng: /l3bztangliweiesting:-5 cd Lab2tangli.weiesti.ng:/lab2$ */bonb ans. txtwetcone to ny fiendish little bonb. You have 5 phases wtth whtch to bloM yourself up. Have a nice day!Phase 1 defused* How about the next one?Thats number 2. Keep going!Halfw

42、ay there!so you got that one. Ty this one.由此可见,phase_4拆除成功!实验结果:给出阶段x的实验结果和必要的结果分析2.2.5 阶段 5 phase_5任务描述:拆除一个关于指针的炸弹。实验设计:此阶段实验与指针相关,又根据静态调试跟踪可知,需借助gdb的动态调 试跟踪来查找相关地址中存放的数据的值,进而分析出最终的拆弹密码。实验过程:首先观察代码,分析代码时发现有多个跳转指令,具体为x15时,bomb;x=1 时,取x低4位;)0O48e22 ;0048&22BB4Se2583 ec 2csubLeaS0 x2c rWespOxlc(esp)8

43、d 4424 1c0O48e2989 4424 DenovKeax,OKC(%esp)B648e2d8d 4421 18Lee0 xl&(Kesp)89 4424 08novKeaxxSCesp)B64Be35C7 4424 04 cf a, &4noviDx804a3cff9x4(esp8048S3C8B9ise3d8t) 4424 30F1QV0 x3O(KespfSeaxS048e4189 0424movNeax(wesp)9048&44e8 17fa ff ffcall8048860 6348&4983 f8015p0m1Bfl48e4E7f 05jgSf)4Se53 S048e4ee

44、8 82as as aacall80491dl5 8048538b 4424 18HQV0 x18(Xesp),%eaxB048e5783 e0Ofand0O48e5aS9 4424 18novKeax,flMlB(Kcsp)0O48e5e83 feOfemp$Dxf,%eax7d 11 A-r fh J* CA-匚 il捋官土 X,使用gdb调试发现,要输入的是两个(数。由后面的步骤知输入第一个数为初 始数组下标,第二个数为循环15次累加求的和。再接着:8048e70: 8b 04 85 80 a2 04 08 mov 0 x804a280(,%eax,4),%eax,这 句就是从(0 x8

45、04a280+eax*4)里面拿数据出来,加到eax上。8948e53:b9 09 g 09 00movS04Se63;ba 0D 0D 00 OOmovOxOjKed8048e6d:33 cZ 01add$Oxledx8O4Se70:3b 04 85 S3 a2 04 08mov0KBO4a2B&(4),Seax8048077101 cladd嚣 EBK,羿 Et:K因为eax只能是0F的数,所以0 x804a260这个地址里面存的应该是一个数据 大小为16的数组,用gdb看,得到:观察到果然是一个数组,然后下面就是把5个输入对应ascll码的低4位转换的 十进制数对应的数值一个一个的转化为

46、这个数组,得到累加值ecx。(gdb) p *0 x804a28316$1 = 10, 2t 14, 7, 8, 12, IS, 11, 9, 4, 1, 13, 39, 6, S观察循环部分:8048e5d89 44 24 18mov0 xl8(%esp)8048e5e83 f8 Ofcmp$0 xf,%eax8048e6174 2aje8048e8d 8048e63b9 00 00 00 00mov$0 x0,%ecx8048e68ba 00 00 00 00mov$0 x0,%edx8048e6d83 c2 01add$0 xl,%edx8048e708b 04 85 80 a2 04

47、08movOx804a28O( ,%ea|x3) ,%ea8048e7701 cladd%eax,%ecx8048e7983 f8 Ofcmp$0 xf,%eax8048e7c75 efjne8048e6d 8048e7e89 44 24 18mov0 xl8(%esp)8048e8283 fa Ofcmp$0 xf,%edx8048e8575 06jne8048e8d 8048e873b 4c 24 1ccmp0 xlc(%esp),%ecx8048e8b74 05je8048e92 8048e8de8 43 03 00 00call80491d5 8048e9283 c4 2cadd$0

48、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。所以答案为:5 115实验结果:tangliwetgestLngz/lab2$ ./bomb txtWelcone to ny fiendish little bomb. You have 6 phases with which to blow yourself up. Have 3 nice day!Phase 1 defused. How sbou

49、t the next one?rhats number 2, Keep going!Halfway thereSo you got that one * Try this on已.Good work! On to the next,.可知结果正确。2.2.6 阶段 6 phase_6任务描述:拆除一个关于链表/指针/结构的炸弹。实验设计:初步静态分析,此阶段代码有些过长,所以单纯通过静态调试跟踪有些困难, 因此我首先找到几个循环体,通过静态调试跟踪和动态调试跟踪的方法来确认循环体的功能,最后将循环体结合起来,拆除此阶段炸断。实验过程:由于代码较长,为便于分析,先总结一下,phase_6分为:参

50、数读取,一个 双层循环,三个单层循环。首先是参数读取:日的48或6 phase_6:56pushwestafl4Se97:53push%ebx8048e9&;S3 ec 44sub$0 x44,Me&p0O4Se9b:Sd 44 24 10lea0 x10(Kesp),WeaxB04Me9f:B9 44 24 &4noveax,3x4(iesp)8b 44 W4 50novBOiaeiT:&9 34 21n&vKeaXj(nesp)eS 4d 63 0& 00calla049Ifc Jread_six_nuimbers0043eaf:be 90 00 00 &mov$OxOdSfiesi6EJ

51、4Seb4:8b 44 bl 10nov0jclfJ(Kesp,estF4)eaK83 es 01sub$0 x183 rs 65CPlp76 35jbe304Sec5 phase_6+0 x2f0048ecO:e8 10 03 00 &call30491d5 explode bomb由此可见,readsix_number所有参数均小于6且不相等。由于后面代码部分过多,便采用gdb单步执行来了解代码的功能。在此,观察到后面:H8048efb:ba 3c cl 04 08mov$Ox804cl3c,?6edK8048f00:89 5428FlOV%edx ,OX2S(?fieSp,%est, 4

52、可以看到输入六个数字的初始地址值在0 x804c13c,再由for循环中:8048ebf: 8b 52 08mov 0 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 x804c13c+0 x8)+0 x8)+0 x8)+0 x8)+0 x8)的值即可。如图

53、所示:tangliweiesting: */lab2There is NO WARRANTS, to the extent permitted by Lbw* and Mshow warrantyH for details, This GDB was configured as 86_64-Linux-gnu.Tvpe show configuration for configuration details For bug reporting instructions, please see: .Find the GDB manual and other documentation resou

54、rces .For help, type help.Tpe apropos word to search for conmands related Reading synbols from bonb. done (gdb) x/3x (0 x8G4cl3c) 0 x0O4cl3c :Type Hshow copyinonline atiFrcT 9x300002929x09000091Ox00O4cl48(gdb) x/3x *(0 x804cl3c+0 x8)0 x804cl48 :OxOOOQ03S5(gdb) x/3x *(*(0 x894cl3c+Ox8)+0 x8)0X0OOOOOO

55、Z0X0S04C1540 x804cl54 :0X00O009C60 x090009030X0SO4C1&0(gdb) x/3x *(*(*(0 xSB+cl3c+exe)+ex8)+OxB)9xoeoeo3db心804C16日 :OxO0O0O3db 0 x00000004(gdb) x/sx *(*(*(*(ox8a4ci3c+exs)+ax8)4-oxs+oxs) 0?(804cl6c :(gdb) x/3x *(*(*(*(*(Ox804cl3c+0 x8)+0 x8)0 x8)+0 x8)+0 x8) 9x904cl7S cnode6:0X0S04C1&COxO0OSOO7e0X00

56、0093OS0 x000000053X0009900&Ox0S04cL780X00000900在下面检测链表值时,要求链表值从大到小排列。由上图可以看出,链表原本各 个位置的值按顺序排列位:292 385 c6 3db 7e 308。按从小到大顺序排列应该为:7e c6 292 308 385 3db。由此可以看出,用户应该输入:5 3 1 6 2 4。实验结果:tangliweiesting: /lab2tangliweietingi cd lab?tangliweigesttng:/Lab2$ ./bomb ans * txtWelcome to my fiendish little bo

57、mb * You have 6 phases withwhich to blow yourself up* Have a nice day 1Phase 1 defused * How about the next one?rhats number 2. Keep going 1Halfway there!So you got that one. Try this one.Good workl On to the next* *,Congratulations! Youve defused the bombl tangliweigesttng:-八ab2$ |可见结果正确。1.3实验小结本次实

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

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

60、码求得buf离返回地址的字节距离,确定要填充 几个字节,然后找到smoke函数的起始地址,把这个地址填入buf末尾,即可实 现该功能。实验过程:首先通过gdb工具对bufbomb文件进行反汇编,查看getbuf的汇 编代码:804?lec -sgetbuf:B6491ec:55push9Sebp804?led:S9e5mov%esp,%ebp804?lef:S3ec38sub$0 x38,%espBfi491fZ:sd45d8lea-0 x28(%ebp)S90424P1DV,(%esp)80491fS:&S55fb ff ffcall804Sd52 cGets80491fd:b80100 0

温馨提示

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

评论

0/150

提交评论