77范文网 - 专业文章范例文档资料分享平台

bomblab实验报告

来源:网络收集 时间:2020-06-30 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

拆炸弹实验报告

专业:电子信息科学与技术 遮羞云。。。 学号:09300720051 姓名:陈文浩 【实验目的】

理解汇编语言,学会使用调试器。

【实验原理】

二进制炸弹是作为一个目标代码文件提供给学生们的程序,运行时,它提示用户输入6个不同的字符串。如果其中任何一个不正确,炸弹就会“爆炸”:打印出一条错误信息。学生通过反汇编和逆向工程来确定是哪六个字符串,从而解除他们各自炸弹的雷管。

【实验过程】

一、使用putty登录、修改密码

1、打开putty,输入用户名和密码(csapp),使用命令passwd username修改密码。 2、使用命令ls后看到有一个文件bomb49.tar,输入 tar xvf bomb49.tar 解压后,再用命令ls看到目录下新出现了bomb、bomb.c和README三个文件。一开始在看到.c文件后很开心,以为这样就可以看到c语言代码了,那拆炸弹的任务就变得简单多了。输入cat bomb.c后,把c代码看了一遍,发现原来这里只有主函数,每一关的具体代码都没有。看来只有从汇编代码入手了。

3、输入反汇编命令objdump -d bomb后,出现了大量汇编代码,在putty小窗口里看起来很麻烦。

二、用linux终端作准备

1、Ubuntu装好了之后,在终端输入ssh username@10.92.13.8连接到服务器,并开始新一轮的尝试。

2、输入objdump -d bomb > 1.txt将汇编代码输出到服务器上一个自动生成的叫1.txt的文件中。

3、中断连接,退回自己的系统桌面,使用命令scp username@10.92.8:1.txt 1.txt 将在桌面复制生成一个也叫1.txt的文件。这时候就可以很方便的查看汇编代码了。

三、开始拆炸弹

1、首先是找到main函数,发现它调用了从phase1到phase6这六个函数。这应该就是每一关需要看懂的函数了。

2、于是找到phase1,代码如下:

08048dd9 :

8048dd9: 55 push ?p

8048dda: 89 e5 mov %esp,?p 8048ddc: 83 ec 08 sub $0x8,%esp

2 8048ddf: c7 44 24 04 e4 98 04 movl $0x80498e4,0x4(%esp) ○

8048de6: 08

8048de7: 8b 45 08 mov 0x8(?p),êx 8048dea: 89 04 24 mov êx,(%esp)

8048ded: e8 89 01 00 00 call 8048f7b

1 8048df2: 85 c0 test êx,êx ○

8048df4: 74 05 je 8048dfb 8048df6: e8 c0 04 00 00 call 80492bb 8048dfb: c9 leave

8048dfc: 8d 74 26 00 lea 0x0(%esi),%esi 8048e00: c3 ret

可以看到在êx!=0的时候就会调用,所以在调用

函数之后的返回值êx必须为0。继续往前,发现代码movl

$0x80498e4,0x4(%esp)有立即数,是将此处地址的值拿来用,输入gdb bomb进入调试状态,用x/s 0x80498e4查看内容,终端显示出字符串\make... billions?\。

下面一步 mov 0x8(?p),êx就是把我们输入的参数放进êx中,然后放进

(%esp) ,再调用函数。很容易猜测我要输入的就是0x80498e4中的字符。

于是开始第一关的尝试。非常重要的一步是在之前设置断点,找到该函数的入口地址是0x80492bb,即:break *0x80492bb。然后输入命令run,进入程序,在输入提示的下一行输入\,终端显示“Phase 1 defused. How about the next one?”也即第一关顺利通过。

3、第二关 汇编代码略。

首先要注意到的是这个函数,根据名字的提示可以猜测这一关要我输入六个数字。紧接着这个函数三条指令的是cmpl $0x1,-0x20(?p),je 8048f42 和call 80492bb ,也就是如果输入的第一个数不等于1则炸弹爆炸。因此第一个数为1。接下来是一个循环,两条重要指令是imul

-0x4(%esi,íx,4),êx 和cmp êx,(%esi,íx,4),其中êx 和íx在每次循环中加1,因此第二到第六个数分别为1*2=2, 2*3=6, 4*4=24, 24*5=120, 120*6=720。经检验,结果正确!

4、第三关 汇编代码略。

注意到movl $0x8049abb,0x4(%esp),输入指令x/s 0x8049abb,得到0x8049abb: \,显示出应该输入两个数字。而cmp $0x1,êx表明输入参数必须多于1个。再往下到达cmpl $0x7,-0x4(?p),即输入的第一个参数值必须小于等于7。然后看到jmp *0x8049920(,êx,4),这是典型的switch跳转语句,即跳转到以地址*0x8049920为基址的跳转表中。输入p/x *0x8049920,得到地址0x8048ea2,在代码中找到该处指令,得到第一个输入为0时对应的第二个输入为0x211,转换成十进制为529。经调试后结果正确。当然此题不止一个答案,当输入为1时,通过p/x *0x8049924,得到地址0x8048e97,找到第二个输入为447。其他答案不一一写出。

5、第四关

phase4汇编代码略。

同样的由movl $0x8049abe,0x4(%esp)我们知道这一关是要输入一个数字。由cmpl $0x0,-0x4(?p) 知道输入的参数必须大于0。注意到这里调用了函数,找到代码如下:

08048bd0 :

8048bd0: 55 push ?p

8048bd1: 89 e5 mov %esp,?p 8048bd3: 83 ec 18 sub $0x18,%esp

8048bd6: 89 5d f8 mov ?x,-0x8(?p) 8048bd9: 89 75 fc mov %esi,-0x4(?p) 8048bdc: 8b 75 08 mov 0x8(?p),%esi 8048bdf: b8 01 00 00 00 mov $0x1,êx 8048be4: 83 fe 01 cmp $0x1,%esi

8048be7: 7e 1a jle 8048c03 8048be9: 8d 46 ff lea -0x1(%esi),êx 8048bec: 89 04 24 mov êx,(%esp) 8048bef: e8 dc ff ff ff call 8048bd0 8048bf4: 89 c3 mov êx,?x 8048bf6: 8d 46 fe lea -0x2(%esi),êx 8048bf9: 89 04 24 mov êx,(%esp) 8048bfc: e8 cf ff ff ff call 8048bd0 8048c01: 01 d8 add ?x,êx

8048c03: 8b 5d f8 mov -0x8(?p),?x 8048c06: 8b 75 fc mov -0x4(?p),%esi 8048c09: 89 ec mov ?p,%esp 8048c0b: 5d pop ?p 8048c0c: c3 ret

由cmp $0x1,%esi 及下面的代码知如果所传递的参数小于等于1则结束 ,跳转到主结构,否则减1并继续调用 并在调用的 又一次调用其本身,也就是进入双层递归模式。在满足跳出条件后,将每一次的值加到êx ,且有如下关系:

func4(0)=1;func4(1)=1;func4(2)=func4(0)+func4(1)...

这其实就是斐波那契数列。然后回到,发现紧接着的代码是cmp

$0xe9,êx,说明 返回值应该是0xe9,转为十进制是233,也就是斐波那契数列的第12个。使用gdb调试结果正确。

6、第五关 汇编代码略。

由以下两句代码call 8048f60 和cmp $0x6,êx可知我们需要输入一个长度为6的字符串。看到mov $0x8049940,ìx,在终端输入x/s 0x8049940,得到“isrveawhobpnutfgERROR: dup(0) error”。往下看到movsbl (%esi,íx,1),êx 和and $0xf,êx 就是把输入的字符串中的每个字符依次拿出来,保留低四位,高四位任意。

接下来的两句movzbl (ìx,êx,1),êx 和mov %al,(?x,íx,1)将ìx 中根据êx的值位移后的字符的低四位放到目的地。接下来是循环体中íx的值再加1,直到全部6个字符串比较完毕。注意到movl $0x8049917,0x4(%esp)的立即数,使用x/s 0x8049917,得到字符串\。之后将调用函数

到此思路已经基本清晰,也就是要求我们输入含有6个字符的字符串,这六个字符的ASCII码的低四位所指示的0x8049940中的字符串中的位置所对应的字符分别是\六个字符。 首先是第一个字符g,它在0x8049940中的位置是f,所以输入的第一个字符的ASCII码的低四位就是f。其余的5个字符也是根据这种关系得到它们ASCII码的低四位。最后得到一种答案为“opekma”。经检验,结果正确。

7、第六关 代码如下:

08048d20 :

8048d20: 55 push ?p

8048d21: 89 e5 mov %esp,?p 8048d23: 53 push ?x

8048d24: 83 ec 14 sub $0x14,%esp

8048d27: c7 44 24 08 0a 00 00 movl $0xa,0x8(%esp) 8048d2e: 00 8048d2f: c7 44 24 04 00 00 00 movl $0x0,0x4(%esp) 8048d36: 00

8048d37: 8b 45 08 mov 0x8(?p),êx 8048d3a: 89 04 24 mov êx,(%esp)

8048d3d: e8 0a fb ff ff call 804884c 8048d42: bb 2c a6 04 08 mov $0x804a62c,?x 8048d47: 89 03 mov êx,(?x) 8048d49: 89 1c 24 mov ?x,(%esp) 8048d4c: e8 bc fe ff ff call 8048c0d 8048d51: 8b 40 08 mov 0x8(êx),êx 8048d54: 8b 40 08 mov 0x8(êx),êx 8048d57: 8b 40 08 mov 0x8(êx),êx 8048d5a: 8b 40 08 mov 0x8(êx),êx 8048d5d: 8b 40 08 mov 0x8(êx),êx 8048d60: 8b 00 mov (êx),êx 8048d62: 3b 03 cmp (?x),êx

8048d64: 74 05 je 8048d6b 8048d66: e8 50 05 00 00 call 80492bb 8048d6b: 83 c4 14 add $0x14,%esp 8048d6e: 5b pop ?x 8048d6f: 5d pop ?p 8048d70: c3 ret

还是先观察前面的跳转条件,这里是cmp (?x),êx 。在调用完 之后是一系列链表操作,而(?x)的值没有改变,还是我们所输入的参数。对于函数,作用是将我们输入的数字当作字符串处理,然后转为十进制。简单地说就是输入什么十进制数参数就是那个十进制数本身。

然后研究 的输入参数。送入参数是这句代码:mov ?x,(%esp),往前查看,有mov $0x804a62c,?x ,使用x/s 0x804a62c发现该地址里存的是空字符串,也就是 没有输入参数!那么它的返回值就应该是固定的。

在je 8048d6b 前设置一个断点,使用gdb调试,在进入第六关时随便输入一个数字(输入100),程序执行到断点。用info reg观察此时寄存器内容。发现êx =500(十进制),而我的输入是放在 (?x)里面的,也就是输入应该就是500。

经验证,结论是正确的。

但是真的就是这么简单吗?答案是否定的。因为在调试secret_phase时,我再次查看了0x804a62c地址处的值,却发现该处放着数字“500”,也就是我在进入第六关时的输入。说明之前的空字符串只是在我没有输入的时候为空,也就说明并不是没有参数进入的。的参数正是我们的输入。那么,为什么之前可以歪打正着得到答案呢?我又试了两次,分别在第六关输入不同的答案(100和200),然后使用info reg查看寄存器状态,却发现êx的值仍然为500。这是否意味着我们的输入并不影响的返回值?

为了更清楚第六关的变化,认真研究了,经过反复推算、设置断点查看地址值,得到许多段由三个连续单元组成的序列。三个连续单元依次是一个十六进制数、一个索引值、一个地址。由此推测这是一段列表,且此列表是往低地址延续的。使用x/50w 0x804a5bc,得到如下代码:

0x804a5bc : 0x00000000 0x000003b5 0x00000009 0x00000000 0x804a5cc : 0x000001b5 0x00000008 0x0804a5c0 0x00000377 0x804a5dc : 0x00000007 0x0804a5cc 0x0000032e 0x00000006 0x804a5ec : 0x0804a5d8 0x0000015f 0x00000005 0x0804a5e4 0x804a5fc : 0x000001f4 0x00000004 0x0804a5f0 0x000001b0 0x804a60c: 0x00000003 0x0804a5fc 0x00000306 0x00000002 0x804a61c: 0x0804a608 0x00000280 0x00000001 0x0804a614 0x804a62c: 0x00000000 0x00000000 0x0804a620 0x000003e9 (注:删除了等符号。)

由此我们可以得到链表顺序如下(地址只写出最后三位):

62c->620->614->608->5fc->5f0->5e4->5d8->5cc->5c0->end 对应的值如下(这里使用十六进制,省略了前面的0x):

0->280->306->1b0->1f4->15f->32e->377->1b5->3b5 其中第一个值0用我们的输入代替即可。

然后在后面的0x8048d51设置一个断点,看看运行后链表发生了什么变化。在进入第六关后输入100,进入断点调试。使用x/50w 0x804a5fc,得到如下代码:

0x804a5bc : 0x00000000 0x000003b5 0x00000009 0x0804a5d8 0x804a5cc : 0x000001b5 0x00000008 0x0804a608 0x00000377 0x804a5dc : 0x00000007 0x0804a5e4 0x0000032e 0x00000006 0x804a5ec : 0x0804a614 0x0000015f 0x00000005 0x0804a62c 0x804a5fc : 0x000001f4 0x00000004 0x0804a5cc 0x000001b0 0x804a60c : 0x00000003 0x0804a5f0 0x00000306 0x00000002 0x804a61c : 0x0804a620 0x00000280 0x00000001 0x0804a5fc 0x804a62c : 0x00000064 0x00000000 0x00000000 0x000003e9

发现链表顺序改变如下:

5c0->5d8->5e4->614->620->5fc->5cc->608->5f0->62c->end 对应的值如下:

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库bomblab实验报告在线全文阅读。

bomblab实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/jiaoyu/1132954.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: