二进制炸弹实验报告.docx
- 文档编号:8281073
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:26
- 大小:109.95KB
二进制炸弹实验报告.docx
《二进制炸弹实验报告.docx》由会员分享,可在线阅读,更多相关《二进制炸弹实验报告.docx(26页珍藏版)》请在冰豆网上搜索。
二进制炸弹实验报告
二进制炸弹实验报告
实验目的:
通过二进制炸弹实验,熟悉汇编语言及其机器码表示,熟悉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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二进制 炸弹 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)