二进制炸弹实验报告Word格式文档下载.docx

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

二进制炸弹实验报告Word格式文档下载.docx

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

二进制炸弹实验报告Word格式文档下载.docx

8048c22:

e81d040000call8049044<

strings_not_equal>

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

8048c27:

85c0test%eax,%eax

8048c29:

7405je8048c30<

phase_1+0x20>

8048c2b:

e8a3090000call80495d3<

explode_bomb>

//撤销栈桢,返回

8048c30:

83c41cadd$0x1c,%esp

8048c33:

c3ret

程序流程:

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

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

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

破解思路:

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

因此第一关的密码:

ForNASA,spaceisstillahighpriority.

五、第二关炸弹拆除

08048c34<

phase_2>

8048c34:

53push%ebx

8048c35:

83ec38sub$0x38,%esp

8048c38:

8d442418lea0x18(%esp),%eax

8048c3c:

89442404mov%eax,0x4(%esp)

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

8048c40:

8b442440mov0x40(%esp),%eax

8048c44:

//调用函数read_six_numbers

8048c47:

e88c0a0000call80496d8<

read_six_numbers>

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

8048c4c:

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

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

8048c51:

7405je8048c58<

phase_2+0x24>

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<

phase_2+0x40>

8048c6f:

e85f090000call80495d3<

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

8048c74:

83fb06cmp$0x6,%ebx

8048c77:

75e4jne8048c5d<

phase_2+0x29>

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

8048c79:

83c438add$0x38,%esp

8048c7c:

5bpop%ebx

8048c7d:

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

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

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

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

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

因此第二关的密码是:

12624120720

六、第三关炸弹拆除

08048c7e<

phase_3>

8048c7e:

83ec2csub$0x2c,%esp

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

8048c81:

8d44241clea0x1c(%esp),%eax

8048c85:

8944240cmov%eax,0xc(%esp)

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

8048c89:

8048c8d:

89442408mov%eax,0x8(%esp)

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

8048c91:

c7442404fa9d04movl$0x8049dfa,0x4(%esp)

8048c98:

8048c99:

8b442430mov0x30(%esp),%eax

8048c9d:

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

8048ca0:

e86bfcffffcall8048910<

__isoc99_sscanf@plt>

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

8048ca5:

83f801cmp$0x1,%eax

8048ca8:

7f05jg8048caf<

phase_3+0x31>

8048caa:

e824090000call80495d3<

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

8048caf:

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

8048cb4:

7766ja8048d1c<

phase_3+0x9e>

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

8048cb6:

8b442418mov0x18(%esp),%eax

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

8048cba:

ff2485609a0408jmp*0x8049a60(,%eax,4)

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

8048cc1:

b800000000mov$0x0,%eax//1

8048cc6:

eb05jmp8048ccd<

phase_3+0x4f>

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

8048cc8:

b840010000mov$0x140,%eax//0

8048ccd:

2da6000000sub$0xa6,%eax

8048cd2:

eb05jmp8048cd9<

phase_3+0x5b>

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

8048cd4:

b800000000mov$0x0,%eax//2

8048cd9:

05b6010000add$0x1b6,%eax

8048cde:

eb05jmp8048ce5<

phase_3+0x67>

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

8048ce0:

b800000000mov$0x0,%eax//3

8048ce5:

2ddb010000sub$0x1db,%eax

8048cea:

eb05jmp8048cf1<

phase_3+0x73>

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

8048cec:

b800000000mov$0x0,%eax//4

8048cf1:

056d030000add$0x36d,%eax

8048cf6:

eb05jmp8048cfd<

phase_3+0x7f>

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

8048cf8:

b800000000mov$0x0,%eax//5

8048cfd:

2df4000000sub$0xf4,%eax

8048d02:

eb05jmp8048d09<

phase_3+0x8b>

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

8048d04:

b800000000mov$0x0,%eax//6

8048d09:

05f4000000add$0xf4,%eax

8048d0e:

eb05jmp8048d15<

phase_3+0x97>

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

8048d10:

b800000000mov$0x0,%eax//7

8048d15:

2d9e020000sub$0x29e,%eax

8048d1a:

eb0ajmp8048d26<

phase_3+0xa8>

8048d1c:

e8b2080000call80495d3<

8048d21:

b800000000mov$0x0,%eax

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

8048d26:

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

8048d2b:

7f06jg8048d33<

phase_3+0xb5>

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

8048d2d:

3b44241ccmp0x1c(%esp),%eax

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

8048d31:

7405je8048d38<

phase_3+0xba>

8048d33:

e89b080000call80495d3<

8048d38:

83c42cadd$0x2c,%esp

8048d3b:

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<

phase_4>

8048d7b:

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

8048d7e:

8048d82:

//读取地址0x8049dfd的内容

8048d86:

c7442404fd9d04movl$0x8049dfd,0x4(%esp)

8048d8d:

8048d8e:

8048d92:

//调用函数sscanf

8048d95:

e876fbffffcall8048910<

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

8048d9a:

8048d9d:

7507jne8048da6<

phase_4+0x2b>

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

8048d9f:

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

8048da4:

7f05jg8048dab<

phase_4+0x30>

8048da6:

e828080000call80495d3<

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

8048dab:

8b44241cmov0x1c(%esp),%eax

8048daf:

8048db2:

e885ffffffcall8048d3c<

func4>

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

8048db7:

3d55100000cmp$0x1055,%eax

8048dbc:

7405je8048dc3<

phase_4+0x48>

8048dbe:

e810080000call80495d3<

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

8048dc3:

8048dc6:

主程序流程:

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<

func4+0x33>

//%eax<

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

8048d55:

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

8048d58:

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:

8048d7a:

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<

phase_5>

8048dc7:

8048dc8:

83ec18sub$0x18,%esp

8048dcb:

8048dcf:

//调用string_length函数

8048dd2:

e854020000call804902b<

string_length>

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

8048dd7:

83f806cmp$0x6,%eax

8048dda:

7405je8048de1<

phase_5+0x1a>

8048ddc:

e8f2070000call80495d3<

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

8048de1:

ba00000000mov$0x0,%edx

8048de6:

//%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