深入理解计算机系统LAB2

上传人:回**** 文档编号:202571782 上传时间:2023-04-22 格式:DOCX 页数:19 大小:117.26KB
返回 下载 相关 举报
深入理解计算机系统LAB2_第1页
第1页 / 共19页
深入理解计算机系统LAB2_第2页
第2页 / 共19页
深入理解计算机系统LAB2_第3页
第3页 / 共19页
点击查看更多>>
资源描述
A实验报告实验目的:使用课程知识拆除一种“inry Boms”来增强对程序的机器级表达、汇编语言、调试器和逆向工程等理解。实验简介:一种“iary Bobs”(二进制炸弹,简称炸弹)是一种Linu可执行C程序,涉及pae1ha共6个阶段。炸弹运营各阶段规定输入一种字符串,若输入符合程序预期,该阶段炸弹被“拆除”,否则“爆炸”。实验目的是你需要拆除尽量多的炸弹。运营成果:通关密码储存在001411541.tt文献中。成功运营成果截图:实验中的六组密码:PASE:字符串比较本关比较简朴,根据课件中的提示用GDB将最先压栈的那个字符串常量打印出来,然后将其作为密码输入,比较成功后即通关。8048b2 pase1:048ab2:83 ec14 sub $0x14,sp 8048b5:68 4 9 04 08 pus $0x809f4 84ba:ff 74 2 1c pushl 0x1c(%e) 8048a:e8 4d 00 00 call 8f1sringsot_eql将地址0x804904中的值打印出来:即“Tuure ilbe ettertomorrow.”PHSE2:循环在查看汇编语言的时候,会看到有调用一种rdsixnm函数,猜想此题是让输入六个数字。0048ad phase_: 8048ad3:56 pus si 804ad4:5 push ebx 804a5:3 ec2c sub $0x2c,%s 0d8:8d 4 24 1 e 0x10(%es),%ea 808ac:5 us %eax 8ad:f 74 2 3c psh xc(%es)8e:e8 405 0 00 cll 402c 84ae:8c41 add 0x0,%p 848ae9:83 c 2 8 1 mpl $x1,08(%ep)-鉴定与否为 804ae:74e j 0b0e 08af0:e8 1 050 00 all 0407 8048f5:eb17 mp 84be807:8b mov (%ex),%ax 0f:0 c0 add ea,%a-进行自加,扩大两倍 08fb:39 43 04 cmp ex,x4(%b) 048e:4 05 je 80480 phae_2x2 804b0:e 05 00 call 80490 eplode_omb8085:83 c3 04 ad 0x,%ex04b08:9f m %ei,x848b0a:7eb n 808af phe_2+0x24 880c:e 0a jm 8048b18 ase25 04b0e:8 c 24 08 ea 0x8(%es),%b02:8d7 4 1 lea 0x1c(s),%e 88b6:ebd jmp 8af7 循环 804b8:8 c 24 a x2,%sp 8048bb:b %b 808b1:5 op %e0481d:c3 re 有汇编语言进行分析,不难看出,这道题目规定输入六个数字,并且规定第一种数字为1,之后跳入一种循环,将第一种数字加倍和已有的数字进行比较,因此不难看出所需要的密码是1,2,4,8,16,32这六个数字。PSE:条件分支语句这道题的汇编语句明显变长了,但是由于PT中已经提示这是条件分支语句,以此为切入点,此题也不难分析。08b1 pae_3: 8048be:83ecc sb $0x1,esp 8048b21:84420 lea (ep),eax 04b:50 pu %eax 808b26:d 44 24 0 a 10(%es),ex 048b2a:0 pus ea 808b2b: 0f a 04 8 puh $0x8410f打印该值为”%d” 8048b30:ff 24 2c push 2c(%s) 0483:e 8 fc ff f cal 808c0上面这一段调用了一种函数ssan(),查询可知这个函数的原型为:inscnf(cnstchr *buffr,nst h *format,ume.);即读取输入的字符串,并以指定的格式赋给参数。其中一种参数在地址x80a10f中。可知需要输入两个整数。88b39:83 4 1 ad x0,%s 848b3c:83f8 01 $0x1,e 803f:70 g 808b46 8841:e 1 04 al 849007 08b46:37c 4c 7 cmpl $0x,0c(%esp)-不不小于70b:7 66 a 804bb -否则引爆有这些可以得知第一种参数的信息,可以看出这是一种不不小于7的数,因此缩小了选择,不难猜出也许是分支条件。 80b4d:8b 440c ov 0xc(%ep),%eax 8048b1:f 2 85 8 9f 00jp 0x84980(,%ex,4) 048b58:b 0c030 0 o $0xc,%ea4b5d:5 p 804864 804bf:b8 0 00 00 00 mov $0x,%ex808b6:dd503 0 0 sb $xd,%eax 04b9:eb 0 jmp 0b7 80b6:b8000 000 mov $0x0,ex 804b70:0535 0100 0 d $135,%eax 848b7:eb 0 p 087c 08b7:b 00 000 mov $x0,%ax8048bc: 902 0 00 sb $0x2e9,%ex 8048b:eb 05 m 488phse_3+0x6 8048b3:8 0 0 v $0,%x80488:09 00 ad $02,eax 048b8:b05 jmp 848b94 pae3+06 808b8f:800 000 0 mov 0x,%eax 8048b4:29 20 0 b x29,eax88b9:eb05 mp048ba0 0489:b8 0 0 000 mv $0,%eaxba0:5900 00 a $0x2e9,eax 808a5: 0 j 84ac phase+0e0ba:8 000 0 00 mo $0x0,%ax0bac:2d9 0200 00 su $0x2,%a0bb1:e a jp 84bbd phase3+xf 8048bb3:e84 0000 l 0490 8048bc:34 24 8 cp 0x8(%esp),eax 8048c:405 je 8b 048ba:8 04 0 0 cal 84907eploe_bomb8048b: c4 1c dd 0x1c,%ep808d2:c rt 可以看出参数不能不小于五,因此这道题也许有多组解,但是结合分支语句,不难看出当第一种参数比较大的时候,计算量比较小,因此我选择了第一种参数为5,代入进行逐渐计算,可以得到此时的值为745。PHA4:递归调用栈这一步是递归调用栈,因此有两部分汇编代码,其中一种是被调用的函数,简朴地看一下代码,应当是一种递归的函数。先分析主程序部分的代码,其中也有scanf函数:0808c2cha_: 848c:8ec c su $0x1,%s 02: 440 la 0x8(%p),%ax 804833:5 s %x 8434:4 24 10 la 0x1(%ep),%x 8048c38:50 push ea 804c39:80a1 0 8 puh $0x04a1f-输出为”%d%” 048c: 7424 2c pus 0xc(esp)048c2:9 fb ff ff cal 47c0 8487:83 10 add x10,%ep808ca:f8 02 cmp $0x2,%ax-返回值为从上面这部分看出我们需要输入两个参数,且两个都是整数型的。 8048c4d:75 0 jne 8048c56 ase_4x2a 8048c4f:83 c 0c 0e cp $0xe,0xc(es)第一种参数不不小于14 8048c:605 je 08c5 04c56:e ac 0 00 00 cl 09007epodbomb 808b:83 e04 $0,%sp 0c5e:6a0 psh $0 04860:6a 0 p $00048c2: 4 1 push x18(%sp) 848c6:e86 ff f cal 048bd 8047:83 7c 24 25 cpl $0x,8(%)-第二个参数为37 8048c7:4 05 je 80487f 804ca:e88803 00 al 907 8487:83 4 1c ad $01,%es 8048c82:c ret 从上面这些可以看出,虽然输入了两个参数,但是只有第一种参数被传递给了fnc此外一种没有变化,并且可以懂得等于37。同步,第一种参数还不不小于14。这样也许的状况就少了。考虑到func4本来就是一种递归函数,虽然反汇编出来,也需要一步一步代入,不如直接进行尝试,枚举法得到第一种参数是0。PS5:指针这一道题的提示比较模糊,毕竟汇编程序里到处均有指针。084c83 p_5: 808c:83 ec c sub $01,%sp04c6:d 424 08 lea 0x8(%sp),%ax 848c8a: ush %eax 048cb:d44241 e 00(ep),%e808c8:50 psh %e 8048c90:68 f a1 0 0 h $0041f-地址参数848c95:ff74 2c pusl 0xc(%p) 489:e82 fb fff call 8087_isc9_sscanfl同样函数sn,其中有两个参数,有一种是地址0x804a0f,先记下等会也许会用到。 8048c9:83 c410 add $x10,%p808ca:3f 01 m $01,eax 848ca:7 0 g 8048cab pse_5028 848ca6:8 503 0 0 call 8490788cb:8b440c 0xc(%e),%x0caf:83e0f ad $xf,%eax-取低四位 048cb:894424c mov %e,0xc(%p) 8048c6: f mp $0xf,%-不能等于8048c:74 2e je 808c 804c6:c 44 20c 0f00 00ovl $0f,0c(esp)808dd:00 8048cde:83f 0f cm $0f,-到15跳出8048c1:75 06 jne 808c9 88c9:e19 00 00 cal 8040 : 048cf2: push %esi808cf3: push %ex 848cf:8ec 3c su $0x3c,%es 80487:8 442 20 ea 0x20(p),%ea 8cfb:50 ush %eax 80cfc:f74244 uhl 04(e) 808d0:e 2 0 00 ca 804c ead_mber又是这个参数,这道题还是让你输入六个数 88d0:83 410 dd $0x1,80d8:be0 0 00 00 ov 0x0,%s 8048d0:8b4 b4 1 o 018(%s,%es,),%ex8048d11:83 e8 0 sub 0x,%ex84d4:83f 05 cp 5,ea048d17: 0 je 88de pse_6+0x2 804819:e8 e9 0200 00 call 8000 808d1e:83c61 d 0x,%si 8048d21:3fe 0 cp $0x,%esi 8042:7 b je 8048d41 phse+0xf 48d2:9 f mov %ei,eb8048d28:8b449 1 o 0x18(%esp,%b,),ea 8048d2c:3944 4 14 cm %ex,x14(%s,esi,4) 808d30:75 05 ne 804837phas_+x45 8048d:e 002 000 l 840 expld_bomb4d7:833 01 ad 01,eb048:8fb05 cmp $0x5,b 8048d3: e9 jle 808d2phse6+036 843f:b cc jmp 08ddphe_60x1b 804d4:8d 444 8 lea 0(sp),%到这里为止,是一种循环,是对输入的六个数字进行鉴定,从这里可以看出,规定是0到6这几种数字符合规定,是这六个数字的一种组合。0d45:8d 5c24 30 lea x30(%ep),%eb88d9:b907 00 00 mov $x7,%ex 8048d4e:9 a o ec,%dx 48d50:2b10 sb (ea),%x048d52:1 o %dx,(%a) 8048:83c0 4 d $0x4,%ea 80485:398 cm%eb,%ea808d59:5f3 jn08d4hae6+0x5这一段很重要,第一次读的时候不明因此,不懂得是在做什么,之后忽视去看背面的,发现成果怎么输入都不对。回过头来看,发现问题在这里,如果输入的是x,这里是将其变为7-x。即这个循环是做了一种置换,将我们所输入的数字置换了。804d75:7 17 je 804d8e 8048d7:9 de ov %ebx,%esi804879:8 4c 9c m 18(%es,%ebx,4), 48d:b8 010 000 mv 0x1,%e 848d8:ba 3 b2 04 8 mo 0804b2c,edx8048d7:83f 01 m x1,ecx 808da:7f d j 848d62 这是构造体中的一段,其中有地址常量,这个应当是构造体链表的首地址,不防输出进行查看:可以看出,这是由学号生成的一种有着六个元素的链表,元素分别是:123560624911540 848daf:b 00 0000 ov $05,%s 808b4:8b4 8 mov 0x8(%),ax80b:8b 00 mov (%ax),ax 04db9:03 cm %ex,(bx) 8048bb:7 5 ge 882has_+0x 8048bd:e8 5 0200 00 cal 8049 048dc2:85 mv x8(%ebx),ebx 808d5:8e0 ub $0x1,%s808dc:75 a jne 808db4 804ca:8 c4 3 a $0x34,sp 0dc:5b pp %ebx8048dc:5 pp %esi848df:3 t 这一段又是一种循环,是对链表的一种排序,到这里就分析的差不多了,也就是说我们输入的是链表的顺序,但是这个顺序要被7减。比较大小,有:1 3 5隐藏关卡:这个如果没有提示应当是看不出来了。但是当时在分析HAS6的时候看到下面有一种fuc7。但是PHASE6并没有用到,觉得很奇怪,看到提示后,又向后翻了翻,发现了unc是被secetph调用的。但是程序运营从开始到结束都没有进入这里。我检索了一下set_phae核心字,找到了调用它的函数。004910 : 84160:3de 40 0806 p $x6,x04e80917: 73 jne 8049d phasedeued0xc 81:3 ec7 sub $x78,%e 80916c:8d 4241 lea 01c(%ep),%eax 80970:5 push%a 897:8d444 1 lea 018(esp),ex 049175:50 ush eax 0917:8d 44 24 2 la x0(%esp),ax 97a:50 pus ax 497b:689 4 0 us 0x0a-”%d%” 8418:68 f b5 08 psh $0x8045f0-”1 ” 091:e8 36 6 ff call 048c0 _isoc_scnfplt 80918a:8 c4 0 $020,%esp 84918d:88 03 cm $03,%e-有三个参数 8049190:75 ne 80491c 从这里可以看出只有通过了第六关才干达到隐藏关口,并且隐藏的关口需要收入三个参数,从提示中可以懂得这三个参数是从第四行读取的,因此需要再在第四行添加一种字符串,至于这个字符串是什么,需要打印相应的地址查看。 4992:83c 8 s 8,p 804995:8 72 a1 0 push $08172 8099a:8d 4 24 1c lea x1(%p),%eax 04919e:50 ush ax80919f:e86 ff f all 848f stings_not_eua844:8 c4 a $0x0,%sp8491a:850 ts %ea,%a 80491a9:7 21 jne 091cc phas_defused+0x6c 809ab:8 e 0c sub 0xc,%s8091ae:83 08 pus 0x84a03 84913:e8 a5 ff cl 804760 049b8:c704 24 6a4 08 ol $0804a06,(%s) 80491bf:e8 9c f ff al 887 804c9:8 4 10 add $0x0,e 8049c:3 e 0c su $0xc,%esp 8091f:8 9 a0 0 08 ps 0x4a0 8044:87 f fff call 80476 usplt8419:83c4 7c add $x7c,%e 8041dc:3 c3 rep rt 上面这些是鉴定字符与否相等,之后输入某些信息,并且进入函数unc7。打印有关地址:可知,需要输入字符串是“DrEl”。之后分析方程:004dd0 u7: 8048dd0:53 puh %ebx 08dd1:83e 08 u $x8,e 848dd:852 10 ov 0x10(es),%edx8048dd:b 4c14 mv x(e),%ex808dc:5 d test e,%edx 808de:74 37 je 848e 7+0x4 848de:8b 1 o (dx),%ebx08d:39b mp %x,%ebx 848e4:7 13 jle 80df9048de6:83 ec08 u $08,%e848de:1 push e 808a:f 720 ush 04(%edx) 0ded:e8 de ff fff cal 8048dd0 048:3 c40 dd $x10,esp804df5:01c0 add %ea,%e8048f:e 23 jmp 8048e1 fun 48df:b8 0 0000 mo $0,%ax 8048df:9 c cmp %ecx,ebx 08e00:71 048c fn7+0x4c 80480:8 ec 8 su 0x8,esp8048:1 puh ex 048e6:f 72 8 pusl 0(edx) 048e09: fff ff ll 80480 48e1: f f ff ff v $0xffff,e 048e:83 c408 add $x8,sp 84ef:5b pp %x080:c3 t 由之前的参数可以看出来返回值是2。分析了一下,有参照了部分资料得到了函数:int fun(cnstnt *a,int b) if ( =NUL) return -; inre= 0; if(*a - ) rt = u7( ), b); re 2; s if (*a -b = ) rern0; s ret u7(*(+ 8), b); re et* 2 + 1; reun re;之后进行分析,当返回值为2的时候,方程的输入值为20。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 活动策划


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

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


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