二进制炸弹实验报告.docx

上传人:b****5 文档编号:8281073 上传时间:2023-01-30 格式:DOCX 页数:26 大小:109.95KB
下载 相关 举报
二进制炸弹实验报告.docx_第1页
第1页 / 共26页
二进制炸弹实验报告.docx_第2页
第2页 / 共26页
二进制炸弹实验报告.docx_第3页
第3页 / 共26页
二进制炸弹实验报告.docx_第4页
第4页 / 共26页
二进制炸弹实验报告.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

二进制炸弹实验报告.docx

《二进制炸弹实验报告.docx》由会员分享,可在线阅读,更多相关《二进制炸弹实验报告.docx(26页珍藏版)》请在冰豆网上搜索。

二进制炸弹实验报告.docx

二进制炸弹实验报告

二进制炸弹实验报告

实验目的:

通过二进制炸弹实验,熟悉汇编语言及其机器码表示,熟悉GDB调试工具。

实验简介:

这个实验是一个过关游戏,共有6关。

在一台Linux服务器上有一个可执行的炸弹文件,运行它游戏就开始了。

每一关相当于是一扇门,要求你输入密码,只有密码正确才能通过,进入下一关,否则它会“爆炸”,每输入错误一次就会“爆炸”一次,服务器会记录你“爆炸”的次数,“爆炸”次数越多扣分越多。

你是一位“黑客”,你所拥有的所有资源就是这个可执行的炸弹文件,你需要破译这个炸弹文件,从中找出每一关的过关密码,如果破译错误,你需要付出相应的代价。

实验流程:

一、使用PuTTy登录并修改密码

●PuTTY是一套免费的SSH/Telnet程序,相当于一个跨平台的远程登录工具,通过它登录远程Linux主机进行实验操作。

●登录后通过passwdusername指令修改密码。

二、反汇编并利用winscp工具下载反汇编代码

●通过ls指令显示当前目录下的文件,找到压缩包bomb56.tar,即目标炸弹。

通过tarxvfbomb56.tar解压此压缩包,然后再通过ls显示解压出的文件:

bomb、bomb.c和README。

●通过objdump–dbomb>>bomb.txt将炸弹程序反汇编并重定向到bomb.txt,通过ls显示反汇编出的代码文件bomb.txt。

●打开winscp工具,登录到远程主机,将远程主机上的文件下载到本机上,便于查看。

三、查看目标文件并做好调试准备

●文件介绍:

bomb.txt:

反汇编得到的代码文件,也是主要研究的目标文件。

bomb.c:

主函数,通过调用每一关的函数实现,未显示每关的具体代码。

bomb:

炸弹程序,当调试得出每一关的密码后打开程序运行来拆炸弹。

●通过gdbbomb指令进入gdb调试环境。

●大致浏览反汇编代码,可以观察到整个程序一共有六关,分别为phase_1到phase_6,并有一关隐藏关secret_phase,每次输入错误时会调用引爆函数explode_bomb,因此为避免调试时引爆炸弹,需要首先在引爆函数前设置断点,即breakexplode_bomb。

四、第一关炸弹拆除

08048c10:

8048c10:

83ec1csub$0x1c,%esp

//取0x8049a04处的内容存入%esp+4

8048c13:

c7442404049a04movl$0x8049a04,0x4(%esp)

8048c1a:

08

//取用户输入的内容存入%esp

8048c1b:

8b442420mov0x20(%esp),%eax

8048c1f:

890424mov%eax,(%esp)

//调用字符串比较函数

8048c22:

e81d040000call8049044

//判断%eax是否为0,为0跳转,不为0引爆

8048c27:

85c0test%eax,%eax

8048c29:

7405je8048c30

8048c2b:

e8a3090000call80495d3

//撤销栈桢,返回

8048c30:

83c41cadd$0x1c,%esp

8048c33:

c3ret

程序流程:

1.取内存地址0x8049a04处的内容;

2.取用户输入的内容(即密码);

3.比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。

破解思路:

通过p(char*)0x8049a04指令取出该地址的字符串,得到:

因此第一关的密码:

ForNASA,spaceisstillahighpriority.

五、第二关炸弹拆除

08048c34:

8048c34:

53push%ebx

8048c35:

83ec38sub$0x38,%esp

8048c38:

8d442418lea0x18(%esp),%eax

8048c3c:

89442404mov%eax,0x4(%esp)

//取用户输入的内容,存入%esp

8048c40:

8b442440mov0x40(%esp),%eax

8048c44:

890424mov%eax,(%esp)

//调用函数read_six_numbers

8048c47:

e88c0a0000call80496d8

//比较第一个输入的的数是否为1

8048c4c:

837c241801cmpl$0x1,0x18(%esp)

//若为1则跳转下一步,否则引爆

8048c51:

7405je8048c58

8048c53:

e87b090000call80495d3

//设置循环变量初始值%ebx=1

8048c58:

bb01000000mov$0x1,%ebx

//循环开始

//保存当前循环变量%eax<-%ebx

8048c5d:

89d8mov%ebx,%eax

//循环变量后移%edx<-%ebx+=1

8048c5f:

83c301add$0x1,%ebx

8048c62:

89damov%ebx,%edx

//%edx*=*(%esp+%eax*4+14)

8048c64:

0faf548414imul0x14(%esp,%eax,4),%edx

//比较%edx与*(%esp+%eax*4+18)

8048c69:

39548418cmp%edx,0x18(%esp,%eax,4)

//相等则跳转下一步,否则引爆

8048c6d:

7405je8048c74

8048c6f:

e85f090000call80495d3

//比较%ebx是否为6,不等则继续循环

8048c74:

83fb06cmp$0x6,%ebx

8048c77:

75e4jne8048c5d

//循环结束,撤销栈桢,返回

8048c79:

83c438add$0x38,%esp

8048c7c:

5bpop%ebx

8048c7d:

c3ret

程序流程:

1.读取用户输入内容(为6个数字);

2.判断输入的第一个值是否为1,不是则引爆炸弹;

3.做一个6次循环,判断后一个数是否等于前一个数乘当前循环变量,不是则引爆炸弹;

4.六个数字判断相等结束后,进入下一关

破解思路:

设输入内容为一个数组Key[6],则可知Key[0]=1,Key[i+1]=Key[i]*(i+1)。

因此第二关的密码是:

12624120720

六、第三关炸弹拆除

08048c7e:

8048c7e:

83ec2csub$0x2c,%esp

//用户输入的参数2存在%esp+1c

8048c81:

8d44241clea0x1c(%esp),%eax

8048c85:

8944240cmov%eax,0xc(%esp)

//用户输入的参数1存在%esp+18

8048c89:

8d442418lea0x18(%esp),%eax

8048c8d:

89442408mov%eax,0x8(%esp)

//取出地址8049dfa中的内容”%d%d”

8048c91:

c7442404fa9d04movl$0x8049dfa,0x4(%esp)

8048c98:

08

8048c99:

8b442430mov0x30(%esp),%eax

8048c9d:

890424mov%eax,(%esp)

//调用sscanf函数,传入输入参数

8048ca0:

e86bfcffffcall8048910<__isoc99_sscanf@plt>

//判断返回值是否大于1,大于则引爆

8048ca5:

83f801cmp$0x1,%eax

8048ca8:

7f05jg8048caf

8048caa:

e824090000call80495d3

//比较参数1是否大于7,大于则引爆

8048caf:

837c241807cmpl$0x7,0x18(%esp)

8048cb4:

7766ja8048d1c

//把参数1存入%eax,作为地址搜索变量

8048cb6:

8b442418mov0x18(%esp),%eax

//跳转到地址0x8049a60+4*%eax处

8048cba:

ff2485609a0408jmp*0x8049a60(,%eax,4)

//参数1为1时跳转到此处,并继续跳转

8048cc1:

b800000000mov$0x0,%eax//1

8048cc6:

eb05jmp8048ccd

//参数1为0时跳转到此处,并继续跳转

8048cc8:

b840010000mov$0x140,%eax//0

8048ccd:

2da6000000sub$0xa6,%eax

8048cd2:

eb05jmp8048cd9

//参数1为2时跳转到此处,并继续跳转

8048cd4:

b800000000mov$0x0,%eax//2

8048cd9:

05b6010000add$0x1b6,%eax

8048cde:

eb05jmp8048ce5

//参数1为3时跳转到此处,并继续跳转

8048ce0:

b800000000mov$0x0,%eax//3

8048ce5:

2ddb010000sub$0x1db,%eax

8048cea:

eb05jmp8048cf1

//参数1为4时跳转到此处,并继续跳转

8048cec:

b800000000mov$0x0,%eax//4

8048cf1:

056d030000add$0x36d,%eax

8048cf6:

eb05jmp8048cfd

//参数1为5时跳转到此处,并继续跳转

8048cf8:

b800000000mov$0x0,%eax//5

8048cfd:

2df4000000sub$0xf4,%eax

8048d02:

eb05jmp8048d09

//参数1为6时跳转到此处,并继续跳转

8048d04:

b800000000mov$0x0,%eax//6

8048d09:

05f4000000add$0xf4,%eax

8048d0e:

eb05jmp8048d15

//参数1为7时跳转到此处,并继续跳转

8048d10:

b800000000mov$0x0,%eax//7

8048d15:

2d9e020000sub$0x29e,%eax

8048d1a:

eb0ajmp8048d26

8048d1c:

e8b2080000call80495d3

8048d21:

b800000000mov$0x0,%eax

//比较参数1是否大于5,大于则引爆

8048d26:

837c241805cmpl$0x5,0x18(%esp)

8048d2b:

7f06jg8048d33

//比较参数2与计算得到的%eax是否相等

8048d2d:

3b44241ccmp0x1c(%esp),%eax

//相等则返回,不相等则引爆

8048d31:

7405je8048d38

8048d33:

e89b080000call80495d3

8048d38:

83c42cadd$0x2c,%esp

8048d3b:

c3ret

程序流程:

1.读取输入参数1和参数2,调用ssanf函数传入两个参数;

2.比较参数1与7的大小,小于等于7继续,大于7引爆;

3.根据参数1的值来搜索跳转地址,计算得到最终的%eax;

4.比较参数1与5的大小,小于等于5继续,大于5引爆;

5.比较参数2与计算得到的%eax是否相等,相等则进入下一关,不相等则引爆。

破解思路:

首先我们通过p(char*)8049dfa读取该内存地址中的内容:

可知输入的两个参数都是整数,并且进一步我们知道参数1小于等于7(无符合数),那么参数1只能是01234567。

根据参数1的值得到跳转地址向量表:

因此我们可以得到一个Switch函数表:

Case参数1==0:

参数2=0x(140+a6+1b6-1db+36d-f4+f4-29e)=0x290=656;

Case参数1==1:

参数2=0x(a6+1b6-1db+36d-f4+f4-29e)=0x150=336;

Case参数1==2:

参数2=0x(1b6-1db+36d-f4+f4-29e)=0xaa=170;

Case参数1==3:

参数2=0x(-1db+36d-f4+f4-29e)=0xfef4=-268;

Case参数1==4:

参数2=0x(36d-f4+f4-29e)=0xcf=207;

Case参数1==5:

参数2=0x(-f4+f4-29e)=0xfd62=-670;

Case参数1==6:

参数2=0x(f4-29e)=0xfe56=-426;

Case参数1==7:

参数2=0x(-29e)=0xfd62=-670;

注意到最后有个判断条件要求参数1小于等于5:

因此第三关的密码是(以下任一组):

0656;1336;2170;3-268;4207;5-670

 

七、第四关炸弹拆除:

08048d7b:

8048d7b:

83ec2csub$0x2c,%esp

//用户输入的参数存在%esp+1c

8048d7e:

8d44241clea0x1c(%esp),%eax

8048d82:

89442408mov%eax,0x8(%esp)

//读取地址0x8049dfd的内容

8048d86:

c7442404fd9d04movl$0x8049dfd,0x4(%esp)

8048d8d:

08

8048d8e:

8b442430mov0x30(%esp),%eax

8048d92:

890424mov%eax,(%esp)

//调用函数sscanf

8048d95:

e876fbffffcall8048910<__isoc99_sscanf@plt>

//比较返回值是否等于1,不等则引爆

8048d9a:

83f801cmp$0x1,%eax

8048d9d:

7507jne8048da6

//比较输入参数与0的大小,小于等于则引爆

8048d9f:

837c241c00cmpl$0x0,0x1c(%esp)

8048da4:

7f05jg8048dab

8048da6:

e828080000call80495d3

//把输入参数传入函数func4,调用函数func4

8048dab:

8b44241cmov0x1c(%esp),%eax

8048daf:

890424mov%eax,(%esp)

8048db2:

e885ffffffcall8048d3c

//比较返回值是否等于0x1055,不等则引爆

8048db7:

3d55100000cmp$0x1055,%eax

8048dbc:

7405je8048dc3

8048dbe:

e810080000call80495d3

//相等则撤销栈桢,返回

8048dc3:

83c42cadd$0x2c,%esp

8048dc6:

c3ret

主程序流程:

1.读取参数,调用sscanf函数传入参数;

2.比较输入参数与0的大小,小于等于则引爆;

3.把输入参数传入函数func4,并调用函数func4;

4.若函数func4返回值等于0x1055,则返回,进入下一关,否则引爆炸弹。

08048d3c:

8048d3c:

83ec1csub$0x1c,%esp

8048d3f:

895c2414mov%ebx,0x14(%esp)

8048d43:

89742418mov%esi,0x18(%esp)

//把参数传入%ebx

8048d47:

8b5c2420mov0x20(%esp),%ebx

8048d4b:

b801000000mov$0x1,%eax

//比较%ebx与1的大小,大于则继续

8048d50:

83fb01cmp$0x1,%ebx

8048d53:

7e1ajle8048d6f

//%eax<-%ebx-1并传入func4继续递归

8048d55:

8d43fflea-0x1(%ebx),%eax

8048d58:

890424mov%eax,(%esp)

8048d5b:

e8dcffffffcall8048d3c

//%esi=%eax,%ebx-=2

8048d60:

89c6mov%eax,%esi

8048d62:

83eb02sub$0x2,%ebx

//%esp<-%ebx,并传入fun4继续递归

8048d65:

891c24mov%ebx,(%esp)

8048d68:

e8cfffffffcall8048d3c

//%eax+=%esi

8048d6d:

01f0add%esi,%eax

//%ebx<=1,返回

8048d6f:

8b5c2414mov0x14(%esp),%ebx

8048d73:

8b742418mov0x18(%esp),%esi

8048d77:

83c41cadd$0x1c,%esp

8048d7a:

c3ret

func4函数流程:

1.比较传入参数是否大于1,大于1则继续,小于等于1则返回1;

2.循环%eax<-%ebx-1,并递归调用函数func4,直到参数小于等于1;

3.循环变量%ebx每次减2,并传入%esp继续递归调用函数func4;

4.函数返回的所得值加到%eax;

破解思路:

首先我们通过p(char*)0x8049dfd读取该内存地址中的内容:

可知输入参数为一个整数,进一步我们发现它大于0。

为了更好地理解func4函数,我们可以写出其大致的框架:

通过列举或用C程序跑该函数可以得到:

Func4(0)=1;Func4

(1)=1;Func4

(2)=2;Func4(3)=3;Func4(4)=5;Func4(5)=8;Func4(6)=13;Func4(7)=21;Func4(8)=34;Func4(9)=55;Func4(10)=89;Func4(11)=144;Func4(12)=233;Func4(13)=377;Func4(14)=610;Func4(15)=987;Func4(16)=1597;Func4(17)=2584;Func4(18)=4181=0x1055。

因此第四关的密码是:

18

八、第五关炸弹拆除

08048dc7:

8048dc7:

53push%ebx

8048dc8:

83ec18sub$0x18,%esp

8048dcb:

8b5c2420mov0x20(%esp),%ebx

8048dcf:

891c24mov%ebx,(%esp)

//调用string_length函数

8048dd2:

e854020000call804902b

//比较字符串长度,不等于6则引爆

8048dd7:

83f806cmp$0x6,%eax

8048dda:

7405je8048de1

8048ddc:

e8f2070000call80495d3

//把%edx和%eax初始化置0

8048de1:

ba00000000mov$0x0,%edx

//循环开始

8048de6:

b800000000mov$0x0,%eax

//%ecx<-(%ebx+%eax)

8048deb:

0fbe0c03movsbl(%ebx,%eax,1),%ecx

//取%ecx中的内容的低四位

8048def:

83e10fand$0xf,%ecx

//%edx+=*(0x8049a80+4*%ecx)

8048df2:

03148d809a

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1