华中科技大学计算机系统基础实验报告

上传人:daj****de2 文档编号:137120696 上传时间:2022-08-18 格式:DOCX 页数:33 大小:89.08KB
收藏 版权申诉 举报 下载
华中科技大学计算机系统基础实验报告_第1页
第1页 / 共33页
华中科技大学计算机系统基础实验报告_第2页
第2页 / 共33页
华中科技大学计算机系统基础实验报告_第3页
第3页 / 共33页
资源描述:

《华中科技大学计算机系统基础实验报告》由会员分享,可在线阅读,更多相关《华中科技大学计算机系统基础实验报告(33页珍藏版)》请在装配图网上搜索。

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

2、set 0 to the least significant bit of x* Example: lsbZero(0x87654321)二 0x87654320* Legal ops: ! & | + * Max ops: 5* Rating: 1*/int lsbZero(int x) (/x右移一位再左移一位实现把最低有效位置0x = x1;x = x1;return x;/* byteNot - bit-inversion to byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByteNo

3、t(0x12345678,1)= 0x1234A978* Legal ops: ! & | + * Max ops: 6* Rating: 2*/int byteNot(int x, int n) (/x第n个字节每位都和1异或实现取反int y = 0xff;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 1* example: byteXor(0x12345678, 0x87654321, 1)二 1* b

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

5、转化为逻辑的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 n* Can assume that 0 = n = 31* Examples: rotateLeft(0x87654321,4)= 0x76543218* Legal ops:

6、 & | + !* Max ops: 25* Rating: 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 1s* Examples: parityCheck(5)= 0, parityCheck(7)二 1* Legal ops: ! & | + * Max ops: 2

7、0* Rating: 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 overflow* Examples: mul2OK(0x30000000)二 1* mul2OK(0x40000000)二 0* Legal ops: & | + * Max ops: 20* R

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

9、741824)二-536870912(overflow)* Legal ops: ! & | + * Max ops: 12* Rating: 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 overflow* Example: subOK(0x80000000,0x80000000)= 1,* subOK(0x80000000,0x70

10、000000)= 0,* Legal ops: ! & | + * Max ops: 20* Rating: 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 x* Example: absVal(-1)= 1.You may assume -TMax = x = TMaxLegal ops: ! & | + Max o

11、ps: 10Rating: 4*/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 for* floating point argument f.* Both the argument and result are passed as unsigned ints, but* they are to be interpreted as the bit

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

13、urn bit-level equivalent of expression (int) f* for floating point argument f.Argument is passed as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point value.* Anything out of range (including NaN and infinity) should return* 0x80000000u.*

14、 Legal ops: Any integer/unsigned operations incl. |, &. also if, while* Max ops: 30* Rating: 4*/int float_f2i(unsigned uf) (unsigned num=0x80000000;int x=(uf&0x007fffff广0x00800000;int order=0;order=(uf&0x7f800000)23;if(order158)(return num;if(order31)&1)=1)if(order150)(return (x(150-order)+1;else(if

15、(order150) return x(150-order);1.4实验过程编写源码,运行btest,得出实验结果。1.5实验结果tangUwel(Westing: -/tanglf weitangliwei(3esting:-$ cdtangli wei./tangltwetesttng:-/tanglt wet$ ./btestScoreRatingErrorsFunction110LsbZero220byteNot220bytexor330logicalAnd330logicalOr330rotateLeft440parttyCheck220nul2GK220Eult3dlv2330su

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

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

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

19、:8048b93:83 ec 1cc7 44 24 04 04 d2 04sub movl$0xlcesp$0x804d204,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+0x20?*8048bdb:e8 25 0& 00 00call80491d5 explode_bomb?*

20、8048bb0:83 c4 Idadd$0xlc,esp8048bb3:c3ret从上面的语句可以看出所需要的两个变量是存在于%ebp 所指的堆栈存储单元里,在main函数中:8048acf:e8 78 07 00 00call804924c 8048ad4:89 04 24movKeax,(%esp)得知%eax里存储的是调用read_line ()函数后返回的结果,就是输入的字符串, 所以得知和用户输入字符串比较的字符串的存储地址为0x804a204,可用gdb查 看这个地址存储的数据容:爨9巨 tangllweiestln: -/U30H14S135x08043abe104 tn /js

21、r/tncljde/t386-llniJM-gnij/btts/stdtoZ.h(gdb) nWe 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/i

22、386-Iinux-gru/bit5/5tdio2,h (gdb) m which to blah 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/20xArgument required (stsrtirg display address).(gdb) x/26x:OK64a264&K84a204:凯 2%56854

23、075747566&K772&6572x2S6c6c69&xaMa214t0X6220656265747465&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

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

25、cd83 7c 24 18 008048bd27S O?3048bd133 7c 24 1c QI8943bd974 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 34B048C07Sb8O48C0S5eS04

26、8C09cSpushpush%ebxsub$0x34 ,?6esplea0K18(%esp)3eaxnow9S&3K, OK(esp)novOxO(9fiesp)nov,(Kesp)call80491fc cnplS0x0,0xl8(%esp)jneSOlSbdb cphase_2+0x27!cnpl$0x1,0xlct?fiesp)jesoisbfa call80491d5 explode bomb;*jnp8f)48bfa cphdse_2+0x46;*nov- 0x8(9Sebx)add- 0?(4(%ebx) ,Meascnp%eax,(%ebx)jeSOISbfl cphase_2+

27、0x3dcallS0191d5 -c&xplode_bombadd$0x4,9fiebxcnp%est,%ebxjne8048be? jnp8f)48c94 cphase_2+Ox50=*leaOx2O(9fiesp) 3ebxleaOK3O(9tiesp)Jnpsoisbez add$0x34,%esppop卵 etiKpop9fiesiret由read_six_numbers知是要输入6个数字,观察8048bcd:8048bd2:83 7c75 0724 1800cnpl jne8048bd4:83 7c24 1c01cnpl8048bd9:74 Ifje8048bdb:e8 fS05 0

28、000call可知输入的第一个和第二个必须依次为0,1804Sbfd:804Sbfe:8048C02:0 02 34 42 2c 4 e5 7 d d d b8 8 e$6xfl, exlB(5tesp)8048bdb phase_2+0x27;*$6x1, flxlcfStesp)8048bfd phase_2+0x46;*80491d5 explode bomb;*0x?O(9fiesp),9fiebx0x3O(9fiesp),9fiesi8048be2 8048be2:8b 43 f8nov-Ox8(9iebx) ,9fieax8048be5:93 43 fcadd-Ox4(9iebx)

29、 ,9fieax8048beS:39 03cnp%eax, (9Sebx)8048bea:74 05je8048bf1 观察这两个循环可知只有当输入的数为前两个数之和时才不会bomb,故得到序列0,1,1,2,3,54. 实验结果:输入上述序列后得:tangliweiesting: -/U2D1414S13tarigliweiResting:-/11291414813$ /bombWelcome to ny fiendish little bonb* You have 6 phases with which to blow yourself up* Have a nice day!The fu

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

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

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

33、0 cmpl$0x104,0x2c(%esp)所以第二个字符ascll码为0x76,即字符v而第三个数为0x104,即2604. 实验结果: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 26Half

34、woy there 1从实验结果来看结果正确,拆弹成功。2.2.4阶段4递归调用和栈1. 任务描述:拆除炸弹42. 实验设计:观察分析phase_4代码,使用gdb调试分析结果3. 实验过程:08048db9 :8048db9:8048dbc:83 ec 2c8d 44 24 1csublea$0x2c,%espOxlc(%esp)8048dc3:89 44 24 OcP1OVKeax,Oxc(%esp)8048dc4:8d 44 24 18lea0xl8(%esp)8048dc8:89 44 24 98P1OVKeax,0x8(%esp)8048dcc:c7 44 24 04 cf a3 0

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

36、unc4函数,发现其实现了递归调用:08048d5c :8048d5c:56push%esi8048d5d:53push%ebx8048d5e:83 ec 14sub$0x14,%esp8048d61:8b 54 24 20mov0x20(%esp),%edx /ebx 是传递的参数/8048d65:8b 44 24 24mov0x24(%esp),%eax8048d69:8b 74 24 28mov0x28(%esp),%esi8048d6d:89 f1mov%esi,%ecx8048d6f:29 c1sub%eax,%ecx8048d71:89 cbmov%ecx,%ebx8048d73:

37、c1 eb 1fshr$0x1f,%ebx/ ebx 右移 31 位 /8048d76:01 d9add%ebx,%ecx8048d78:d1 f9sar%ecx8048d7a:8d 1c 01lea(%ecx,%eax,1),%ebx8048d7d:39 d3cmp%edx,%ebx8048d7f:7e 17jle8048d98 8048d81:8d 4b fflea-0x1(%ebx),%ecx8048d84:89 4c 24 08mov%ecx,0x8(%esp)8048d88:89 44 24 04mov%eax,0x4(%esp)8048d8c:89 14 24mov%edx,(%e

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

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

40、时推出了具体的表达式,未记录下来,只记录 了最后得出fun(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 nunbe

41、r 2+ Keep yolngHalfway therel13 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?Th

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

43、B4Se2583 ec 2csubLeaS0x2c rWespOxlc(esp)8d 4424 1c0O48e2989 4424 DenovKeax,OKC(%esp)B648e2d8d 4421 18Lee0xl&(Kesp)89 4424 08novKeaxxSCesp)B64Be35C7 4424 04 cf a, &4noviDx804a3cff9x4(esp8048S3C8B9ise3d8t) 4424 30F1QV0x3O(KespfSeaxS048e4189 0424movNeax(wesp)9048&44e8 17fa ff ffcall8048860 6348&4983 f8

44、015p0m1Bfl48e4E7f 05jgSf)4Se53 S048e4ee8 82as as aacall80491dl5 8048538b 4424 18HQV0x18(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 mo

45、v 0x804a280(,%eax,4),%eax,这 句就是从(0x804a280+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的数,所以0x804a260这个地址里面存的应该是一个数据 大小为16的数组,用gdb看,得到:观察到果然是一个数组,然后下面就是把5个

46、输入对应ascll码的低4位转换的 十进制数对应的数值一个一个的转化为这个数组,得到累加值ecx。(gdb) p *0x804a28316$1 = 10, 2t 14, 7, 8, 12, IS, 11, 9, 4, 1, 13, 39, 6, S观察循环部分:8048e5d89 44 24 18mov0xl8(%esp)8048e5e83 f8 Ofcmp$0xf,%eax8048e6174 2aje8048e8d 8048e63b9 00 00 00 00mov$0x0,%ecx8048e68ba 00 00 00 00mov$0x0,%edx8048e6d83 c2 01add$0xl,

47、%edx8048e708b 04 85 80 a2 04 08movOx804a28O( ,%ea|x3) ,%ea8048e7701 cladd%eax,%ecx8048e7983 f8 Ofcmp$0xf,%eax8048e7c75 efjne8048e6d 8048e7e89 44 24 18mov0xl8(%esp)8048e8283 fa Ofcmp$0xf,%edx8048e8575 06jne8048e8d 8048e873b 4c 24 1ccmp0xlc(%esp),%ecx8048e8b74 05je8048e92 8048e8de8 43 03 00 00call8049

48、1d5 8048e9283 c4 2cadd$0x2c,%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 1154. 实验结果:tangliwetgestLngz/lab2$ ./bomb txtWelcone to ny fiendish little bomb. You have 6 phases with which to blow yourself up. Have 3 nice da

49、y!Phase 1 defused. How sbout 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_61. 任务描述:拆除一个关于链表/指针/结构的炸弹。2. 实验设计:初步静态分析,此阶段代码有些过长,所以单纯通过静态调试跟踪有些困难, 因此我首先找到几个循环体,通过静态调试跟踪和动态调试跟踪的方法来确认循环体的功能,最后将循环体结合起来,拆除此阶段炸断。3.

50、 实验过程:由于代码较长,为便于分析,先总结一下,phase_6分为:参数读取,一个 双层循环,三个单层循环。首先是参数读取:日的48或6 phase_6:56pushwestafl4Se97:53push%ebx8048e9&;S3 ec 44sub$0x44,Me&p0O4Se9b:Sd 44 24 10lea0x10(Kesp),WeaxB04Me9f:B9 44 24 &4noveax,3x4(iesp)8b 44 W4 50novBOiaeiT:&9 34 21n&vKeaXj(nesp)eS 4d 63 0& 00calla049Ifc Jread_six_nuimbers0043

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

52、428FlOV%edx ,OX2S(?fieSp,%est, 4可以看到输入六个数字的初始地址值在0x804c13c,再由for循环中:8048ebf: 8b 52 08mov 0x8(%edx),%edx可以看出六个数字按8个字节的顺序进行排列,因此分别调用 gdb查看(0x804c13c)、*(0x804c13c+0x8)、*(*(0x804c13c+0x8)+0x8)、*(*(*(0x804c13c+0x8)+0x8)+0x8)、*(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)、*(*(*(*(*(0x804c13c+0x8)+0x8)+0x8)+0x8)+0x

53、8)的值即可。如图所示: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 documentat

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

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!