深入理解计算机系统LAB2_第1页
深入理解计算机系统LAB2_第2页
深入理解计算机系统LAB2_第3页
深入理解计算机系统LAB2_第4页
深入理解计算机系统LAB2_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、深入理解计算机系统LAB2LAB1实验报告实验目的:使用课程知识拆除一个“ Binary Bombs来增强对程序的机器级表示、汇编 语言、调试器和逆向工程等理解。实验简介:一个“ Binary Bombs (二进制炸弹,简称炸弹)是一个 Linux可执行C程 序,包含phase1phase6共6个阶段。炸弹运行各阶段要求输入一个字符串, 若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目标是你需 要拆除尽可能多的炸弹。运行结果:通关密码储存在 0014301-151420131.txt 文件中。成功运行结果截图:zhnxx工aru丄$ - /bomb solutionWelcome

2、 to my fiendishbonb You have 6 phases withwhich to blow yourself up. Have a nice day!Phase 1 defused How about the next one?Thatr s nuniber 2 . Keep going !Halfway there!So you gotone. fry this one +Good work! On to the next*Curses t you1ve found the secret phaaeIBut finding it and solving itq_iit d

3、ifferent -You1 ve defused th巳 secret stage IConqratulatlons! Youve defused the bomb!实验中的六组密码:The future will be better tomorrow*1 2 4 8 16 325 -74510 37 DrEvil5 1151 2 1 3 51 208PHASE1字符串比较本关比较简单,根据课件中的提示用GDB各最先压栈的那个字符串常量打印出来,然后将其作为密码输入,比较成功后即通关。08048ab2 vphase_1:8048ab2:8048ab5:8048aba:8048abe:83 e

4、c 1468 04 9f 04 08 ff 74 24 1ce8 4d 04 00 00subpush pushl$0 x14,%esp$0 x8049f040 x1c(%esp)call 8048f10 vstri ngs_ no t_equal 将地址0 x8049f04中的值打印出来:Breakpoint 1, 0 x0808ab5 in phase 1 (qdb) p *0 x804$1 = 543516756(gdb) p (char *) 0 x8049f04$2 - DxB049f04 r,The future will be better tomorrow*即“ The fut

5、ure will be better tomorrow.会看到有调用一个read_six_number函数,猜测此PHASE2循环题是让输入六个数字。08048ad3 :8048ad3:56push%esi8048ad4:53push%ebx8048ad5:83 ec 2csub$0 x2c,%esp8048ad 8:8d 44 24 10lea0 x10(%esp),%eax8048adc:50push%eax8048add:ff 74 24 3cpushl 0 x3c(%esp)8048ae1:e8 46 05 00 00call804902c 8048ae6:83 c4 10add$0

6、x10,%esp8048ae9:83 7c 24 08 01cmpl$0 x1,0 x8(%esp)-8048aee:74 1eje8048b0e 8048af0:e8 12 05 00 00call8049007 vexplode._bomb8048af5:eb 17jmp8048b0e 8048af7:8b 03mov(%ebx),%eax8048af9:01 c0add%eax,%eax进行自加8048afb:39 43 04cmp%eax,0 x4(%ebx)8048afe:74 05je8048b05 8048b00:e8 02 05 00 00call8049007 vexplod

7、e._bomb8048b05:83 c3 04add$0 x4,%ebx8048b0 8:39 f3cmp%esi,%ebx8048b0a:75 ebjne8048af7 8048b0c:eb 0ajmp8048b18 在查看汇编语言的时候,判定是否为1,扩大两倍8048b0e:8d 5c 24 08lea0 x8(%esp),%ebx8048b12:8d 74 24 1clea0 x1c(%esp),%esi8048b16:eb dfjmp8048af7 |循环8048b18:83 c4 24add$0 x24,%esp8048b1b:5bpop%ebx8048b1c:5epop%esi80

8、48b1d:c3ret有汇编语言进行分析,不难看出,这道题目要求输入六个数字,并且要求第 一个数字为1,之后跳入一个循环,将第一个数字加倍和已有的数字进行比较, 所以不难看出所需要的密码是1,2,4,8,16,32 这六个数字。PHASE3条件分支语句这道题的汇编语句明显变长了,但是由于PPT中已经提示这是条件分支语句,以此为切入点,此题也不难分析。08048b1e vphase_3:8048b1e:83 ec 1csub$0 x1c,%esp8048b21:8d 44 24 08lea0 x8(%esp),%eax8048b25:50push%eax8048b26:8d 44 24 10le

9、a0 x10(%esp),%eax8048b2a:50push%eax8048b2b:68 0f a1 04 08push$0 x804a10f打印该值为”d%”8048b30:ff 74 24 2cpushl 0 x2c(%esp)8048b34:e8 87 fc ff ffcall80487c0 上面这一段调用了一个函数ssca nf(),查询可知这个函数的原型为:intssca nf(const char *buffer,c onst char*format,argume nt .);即读取输入的字符串,并以指定的格式赋给参数。其中一个参数在地址0 x804a10f中。可知需要输入两个整

10、数。8048b39:83 c4 10add$0 x10,%esp8048b3c:83 f8 01cmp$0 x1,%eax8048b3f:7f 05jg8048b46 8048b41:e8 c1 04 00 00call8049007 8048b46:83 7c 24 0c 07cmpl$0 x7,0 xc(%esp)-不大于78048b4b:77 66ja8048bb3 -否则引爆有这些可以得知第一个参数的信息,可以看出这是一个不大于7的数,因此缩小了选择,不难猜出可能是分支条件。mov jmpOxc(%esp),%eax*0 x8049f80(,%eax,4)8048b4d:8b 44 2

11、4 0c8048b51:ff 24 85 80 9f 04 088048b5 8:b8 0c 03 00 00mov$0 x30c,%eax8048b5d:eb 05jmp8048b64 vphase_3+0 x468048b5f:b8 00 00 00 00mov$0 x0,%eax8048b64:2d d5 03 00 00sub$0 x3d5,%eax8048b69:eb 05jmp8048b70 8048b6b:b8 00 00 00 00mov$0 x0,%eax8048b70:05 35 01 00 00add$0 x135,%eax8048b75:eb 05jmp8048b7c

12、8048b77:b8 00 00 00 00mov$0 x0,%eax8048b7c:2d e9 02 00 00sub$0 x2e9,%eax8048b81:eb 05jmp8048b88 8048b83:b8 00 00 00 00mov$0 x0,%eax8048b8 8:05 e9 02 00 00add$0 x2e9,%eax8048b8d:eb 05jmp8048b94 8048b8f:b8 00 00 00 00mov$0 x0,%eax8048b94:2d e9 02 00 00sub$0 x2e9,%eax8048b99:eb 05jmp8048ba0 8048b9b:b8

13、00 00 00 00mov$0 x0,%eax8048ba0:05 e9 02 00 00add$0 x2e9,%eax8048ba5:eb 05jmp8048bac 8048ba7:b8 00 00 00 00mov$0 x0,%eax8048bac:2d e9 02 00 00sub$0 x2e9,%eax8048bb1:eb 0ajmp8048bbd 8048bb3:e8 4f 04 00 00call8049007 上面是各种分支情况,看起来比较复杂,先放一放8048bb 8:b8 00 00 00 00mov$0 x0,%eax8048bbd:83 7c 24 0c 05cmpl$

14、0 x5,0 xc(%esp)-参数不能大于8048bc2:7f 06jg8048bca 8048bc4:3b 44 24 08cmp0 x8(%esp),%eax8048bc8:74 05je8048bcf 8048bca:e8 38 04 00 00call8049007 8048bcf:83 c4 1cadd$0 x1c,%esp8048bd2:c3ret可以看出参数不能大于五,因此这道题可能有多组解,不过结合分支语句, 不难看出当第一个参数比较大的时候,计算量比较小,所以我选择了第一个参 数为5,代入进行逐步计算,可以得到此时的值为 -745。PHASE4递归调用栈这一步是递归调用栈,

15、所以有两部分汇编代码,其中一个是被调用的函数, 简单地看一下代码,应该是一个递归的函数。先分析主程序部分的代码,其中也有sscanf函数:08048c2c vphase_4:8048c2c:83 ec 1csub$0 x1c,%esp8048c2f:8d 44 24 08lea0 x8(%esp),%eax8048c33:50push%eax8048c34:8d 44 24 10lea0 x10(%esp),%eax8048c3 8:50push%eax8048c39:68 0f a1 04 08push$0 x804a10f-输出为”d%d8048c3e:ff 74 24 2cpushl0

16、x2c(%esp)8048c42:e8 79 fb ff ffcall80487c0 8048c47:83 c4 10add$0 x10,%esp8048c4a:83 f8 02cmp$0 x2,%eax返回值为2从上面这部分看出我们需要输入两个参数,且两个都是整数型的8048c4d:75 078048c4f:83 7c 24 0c 0e148048c54:76 058048c56:e8 ac 03 00 008048c5b:83 ec 048048c5e:6a 0e8048c60:6a 008048c62:ff 74 24 188048c66:e8 68 ff ff ff8048c6b:83

17、 c4 108048c6e:83 f8 258048c71:75 078048c73:83 7c 24 08 25378048c7 8:74 058048c7a:e8 88 03 00 008048c7f:83 c4 1c8048c82:c3jne 8048c56 vphase_4+0 x2acmpl $0 xe,0 xc(%esp)第一个参数不大于jbe 8048c5b call 8049007 sub $0 x4,%esppush $0 xepush $0 x0pushl 0 x18(%esp)call 8048bd3 add $0 x10,%espcmp $0 x25,%eaxjne 8

18、048c7a cmpl $0 x25,0 x8(%esp)-第二个参数为je 8048c7f call 8049007 add $0 x1c,%espret从上面这些可以看出,虽然输入了两个参数,但是只有第一个参数被传递给 了 func4另外一个没有变化,而且可以知道等于 37。同时,第一个参数还不大 于14。这样可能的情况就少了。考虑到 func4本来就是一个递归函数,即使反 汇编出来,也需要一步一步代入,不如直接进行尝试,枚举法得到第一个参数 是10。PHASE5指针这一道题的提示比较模糊,毕竟汇编程序里到处都有指针08048c83 vphase_5:8048c83:83 ec 1csub

19、 $0 x1c,%esp8048c86:8d 44 24 08lea 0 x8(%esp),%eax8048c8a:50push %eax8048c8b:8d 44 24 10lea 0 x10(%esp),%eax8048c8f:50push %eax8048c90:68 0f a1 04 08push $0 x804a10f-地址参数8048c95:ff 74 24 2cpushl 0 x2c(%esp)8048c99:e8 22 fb ff ffcall 80487c0 同样函数sscanf,其中有两个参数,有一个是地址 0 x804a10f,先记下等会 可能会用到。8048c9e83

20、c4 10add$0 x10,%esp8048ca183 f8 01cmp$0 x1,%eax8048ca47f 05jg8048cab 8048ca6e8 5c 03 00 00call8049007 8048cab8b 44 24 0cmov0 xc(%esp),%eax8048caf:83 e0 0fand$0 xf,%eax取低四位8048cb289 44 24 0cmov%eax,0 xc(%esp)8048cb683 f8 0fcmp$0 xf,%eax不能等于158048cb974 2eje8048ce9 8048cbbb9 00 00 00 00mov$0 x0,%ecx804

21、8cc0:ba 00 00 00 00mov$0 x0,%edx8048cc5:83 c2 01add$0 x1,%edx计数用的8048cc8:8b 04 85 c0 9f 04 08mov0 x8049fc0(,%eax,4),%eax寻址8048ccf:01 c1add%eax,%ecx求和用的8048cd183 f8 0fcmp$0 xf,%eax8048cd475 efjne8048cc5 8048cd6c7 44 24 0c 0f 00 00movl$0 xf,0 xc(%esp)8048cdd008048cde83 fa 0fcmp$0 xf,%edx到15跳出8048ce175

22、 06jne8048ce9 8048ce33b 4c 24 08cmp0 x8(%esp),%ecx8048ce774 05je8048cee 8048ce9e8 19 03 00 00call8049007 8048cee83 c4 1cadd$0 x1c,%esp8048cf1:c3ret个别地方不是太清楚,不过已经基本可以猜出来程序的目的, 设置一个计数 器进行计数,每次按照变量的偏移寻址,找到之后变成新的变量,之后按照新的变量进行寻址,如此循环。没找到一个变量,求和。当变量刚好等于15的时候跳出,不过跳出的时候还需要看一下计数器有没有达到15,也就是说要循环15次才可以跳出,这为我们猜

23、测其值提供了方便。所以我们需要做的是找到初始的变量和以这个变量开始循环所得到的总和根据gdB俞出的情况,我做了一个表格:01234567102147812151189101112131415041133965其中首行是相对于首地址便宜的字节,下面是其对应的常数。当变量为15的时候跳出,那么我们可以从15向后推:15 614 2110 0 8 4 913 117 312 5不难看出15个循环之后是5,因此第一个参数是5。之后把这十五个参数的 值相加。最开始的时候,我犯了个错误就是直接把这十五个数相加,后来不通过,经 过分析发现是15个偏移量对应的地址中的常数,所以为 115。PHASE6链表/指

24、针/结构这一关看提示就觉得很难,首先对这三个词进行联想,“链表+结构”这个比较好联想,应该使用结构体定义了一个链表结构。至于“指针”,这个我猜测应该是和上一关所说的意思可能有相似之处,应给就是不停地变换地址比较之类 的。这一关的汇编语言比较长,其中有一大部分都是对结构体的定义, 所以这里 只摘录要点进行解释说明。08048cf2 vphase_6:8048cf2:56push%esi8048cf3:53push%ebx8048cf4:83 ec 3csub$0 x3c,%esp8048cf7:8d 44 24 20lea0 x20(%esp),%eax8048cfb:50push %eax80

25、48cfc:ff 74 24 4cpushl 0 x4c(%esp)8048d00:e8 27 03 0000call 804902c 从这里可以看出,又是这个参数,这道题还是让你输入六个数8048d0583 c4 10add$0 x10,%esp8048d08be 00 00 00 00mov$0 x0,%esi8048d0d8b 44 b4 18mov0 x18(%esp,%esi,4),%eax8048d1183 e8 01sub$0 x1,%eax8048d1483 f8 05cmp$0 x5,%eax8048d1776 05jbe8048d1e vphase_6+0 x2c8048d

26、19e8 e9 02 00 00call8049007 8048d1e83 c6 01add$0 x1,%esi8048d2183 fe 06cmp$0 x6,%esi8048d2474 1bje8048d41 8048d2689 f3mov%esi,%ebx8048d288b 44 9c 18mov0 x18(%esp,%ebx,4),%eax8048d2c39 44 b4 14cmp%eax,0 x14(%esp,%esi,4)8048d3075 05jne8048d37 8048d32e8 d0 02 00 00call8049007 8048d3783 c3 01add$0 x1,%e

27、bx8048d3a83 fb 05cmp$0 x5,%ebx8048d3d7e e9jle8048d28 8048d3f:eb ccjmp8048d0d 8048d418d 44 24 18lea0 x18(%esp),%eax到这里为止,是个循环,是对输入的六个数字进行判定,要求是0到6这几个数字符合要求,是这六个数字的一种组合8048d45:8d 5c 24 30lea0 x30(%esp),%ebx8048d49:b9 07 00 00 00mov$0 x7,%ecx8048d4e:89 camov%ecx,%edx8048d50:2b 10sub(%eax),%edx8048d52:8

28、9 10mov%edx,(%eax)8048d54:83 c0 04add$0 x4,%eax8048d57:39 d8cmp%ebx,%eax8048d59:75 f3jne8048d4e 这一段很重要,第一次读的时候不明所以,不知道是在做什么,之后忽视去看后面的,发现结果怎么输入都不对。回过头来看,发现问题在这里,假如输 入的是x,这里是将其变为7-x。即这个循环是做了一个置换,将我们所输入的 数字置换了。8048d75:74 17je 8048d8e 8048d77:89 demov %ebx,%esi8048d79:8b 4c 9c 18mov 0 x18(%esp,%ebx,4),%

29、ecx8048d7d:b8 01 00 00 00mov$0 x1,%eax8048d82:ba 3c b2 04 08mov$0 x804b23c,%edx8048d87:83 f9 01cmp$0 x1,%ecx8048d8a:7f d6jg8048d62 vphase_6+0 x70这是结构体中的一段,其中有地址常量,这个应该是结构体链表的首地址,不防输出进行查看:|(gdb) x /3 0 x804b23c0 x8Q4b23c:7061134525512(qdb)Dx804b248!622134525524(gdb)Dx804b254:4913134525536(gdb)0 x804b

30、260:1914134525548(gdb)0 x804b26c:5545134525560(gdb)0 x804:90960(gdb)0 x804b28419:1514201310 0可以看出,这是由学号生成的一个有着六个元素的链表,元素分别是:123456706624911915549098048daf:be 05 00 00 00mov$0 x5,%esi8048db4:8b 43 08mov0 x8(%ebx),%eax8048db7:8b 00mov(%eax),%eax8048db9:39 03cmp%eax,(%ebx)8048dbb:7d 05jge8048dc2 8048db

31、d:e8 45 02 00 00call8049007 8048dc2:8b 5b 08mov0 x8(%ebx),%ebx8048dc5:83 ee 01sub$0 x1,%esi8048dc8:75 eajne8048db4 8048dca:83 c4 34add$0 x34,%esp8048dcd:5bpop%ebx8048dce:5epop%esi8048dcf:c3ret这一段又是一个循环,是对链表的一个排序,到这里就分析的差不多了,也就是说我们输入的是链表的次序,不过这个次序要被7减比较大小,有:隐藏关卡:这个如果没有提示应该是看不出来了。不过当时在分析PHASER时候看到F面有一

32、个func7。但是PHASE并没有用到,觉得很奇怪,看到提示后,又向后翻了翻,发现了 func7是被secret_phase调用的。但是程序运行从开始到结束都没有进入这里。我检索了一下 secret_phase关键字,找到了调用它的函数。08049160 vphase_defused:8049160:833de8b4 04 08068049167:75738049169:83ec78804916c:8d44241c8049170:508049171:8d4424188049175:508049176:8d442420804917a:50804917b:6869a104088049180:68

33、f0 b504088049185:e8 36 f6ffff804918a:83 c420804918d:83 f8038049190:75 3acmpl $0 x6,0 x804b4e8jne 80491dc sub $0 x78,%esplea 0 x1c(%esp),%eaxpush %eaxlea 0 x18(%esp),%eaxpush %eaxlea 0 x20(%esp),%eaxpush %eaxpush $0 x804a169-”d %d %spush $0 x804b5f0-”0 37 ”call 80487c0 add $0 x20,%espcmp $0 x3,%eax-

34、有三个参数 jne 80491cc 从这里可以看出只有通过了第六关才能到达隐藏关口,而且隐藏的关口需要 收入三个参数,从提示中可以知道这三个参数是从第四行读取的,所以需要再在第四行添加一个字符串,至于这个字符串是什么,需要打印相应的地址查看。8049192:83 ec 08sub$0 x8,%esp8049195:68 72 a1 04 08push$0 x804a172804919a:8d 44 24 1clea0 x1c(%esp),%eax804919e:50push%eax804919f:e8 6c fd ff ffcall8048f10 vstri ngs_ no t_equal80

35、491a4:83 c4 10add$0 x10,%esp80491a7:85 c0test%eax,%eax80491a9:75 21jne80491cc 80491ab:83 ec 0csub$0 xc,%esp80491ae:68 38 a0 04 08push$0 x804a03880491b3:e8 a8 f5 ff ffcall8048760 80491b 8:c7 04 24 60 a0 04 08movl$0 x804a060,(%esp)80491bf:e8 9c f5 ff ffcall8048760 80491c4:e8 58 fc ff ffcall8048e21 804

36、91c9:83 c4 10add$0 x10,%esp80491cc:83 ec 0csub$0 xc,%esp80491cf:68 98 a0 04 08push$0 x804a09880491d4:e8 87 f5 ff ffcall8048760 80491d9:83 c4 7cadd$0 x7c,%esp80491dc:f3 c3repz ret上面这些是判定字符是否相等,之后输入一些信息,并且进入函数func7打印相关地址:(gdb) p (char *) 0 x90416951 1 = 0 x804al 69 l,%d %d(gdb) p (char +J 0 x804b5f0$12 = 0 xa04b5f0 10 371(gdb) p (char +) 0 x804al72$13 = 0 x804aL72 ,DrEvil,T(qdb) p (char 0 x804a038$14 一 0 x804a038 Curses, you1ve found the 3ecret phase! ”(gdb) p (char *) 0 x804a038$15 = 0 x804

温馨提示

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

评论

0/150

提交评论