二进制炸弹实验报告_第1页
二进制炸弹实验报告_第2页
二进制炸弹实验报告_第3页
二进制炸弹实验报告_第4页
二进制炸弹实验报告_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、二进制炸弹实验报告实验目的: 通过二进制炸弹实验,熟悉汇编语言及其机器码表示,熟悉GDB调试工具。实验简介:这个实验是一个过关游戏,共有6关。在一台Linux服务器上有一个可执行的炸弹文件,运行它游戏就开始了。每一关相当于是一扇门,要求你输入密码,只有密码正确才能通过,进入下一关,否则它会“爆炸”,每输入错误一次就会“爆炸”一次,服务器会记录你“爆炸”的次数,“爆炸”次数越多扣分越多。你是一位“黑客”,你所拥有的所有资源就是这个可执行的炸弹文件,你需要破译这个炸弹文件,从中找出每一关的过关密码,如果破译错误,你需要付出相应的代价。实验流程:一、 使用PuTTy登录并修改密码l PuTTY 是一

2、套免费的SSH/Telnet 程序,相当于一个跨平台的远程登录工具,通过它登录远程Linux主机进行实验操作。l 登录后通过passwd username指令修改密码。二、 反汇编并利用winscp工具下载反汇编代码l 通过ls指令显示当前目录下的文件,找到压缩包bomb56.tar,即目标炸弹。通过tar xvf bomb56.tar解压此压缩包,然后再通过ls显示解压出的文件:bomb、bomb.c和README。l 通过objdump d bomb >>bomb.txt将炸弹程序反汇编并重定向到bomb.txt,通过ls显示反汇编出的代码文件bomb.txt。l 打开wins

3、cp工具,登录到远程主机,将远程主机上的文件下载到本机上,便于查看。三、 查看目标文件并做好调试准备l 文件介绍:bomb.txt:反汇编得到的代码文件,也是主要研究的目标文件。bomb.c:主函数,通过调用每一关的函数实现,未显示每关的具体代码。bomb:炸弹程序,当调试得出每一关的密码后打开程序运行来拆炸弹。l 通过gdb bomb指令进入gdb调试环境。l 大致浏览反汇编代码,可以观察到整个程序一共有六关,分别为phase_1到phase_6,并有一关隐藏关secret_phase,每次输入错误时会调用引爆函数explode_bomb,因此为避免调试时引爆炸弹,需要首先在引爆函数前设置断

4、点,即break explode_bomb。四、 第一关炸弹拆除08048c10 <phase_1>: 8048c10:83 ec 1c sub $0x1c,%esp /取0x8049a04处的内容存入%esp+4 8048c13:c7 44 24 04 04 9a 04 movl $0x8049a04,0x4(%esp) 8048c1a:08 /取用户输入的内容存入%esp 8048c1b:8b 44 24 20 mov 0x20(%esp),%eax 8048c1f:89 04 24 mov %eax,(%esp) /调用字符串比较函数 8048c22:e8 1d 04 00

5、00 call 8049044 <strings_not_equal> /判断%eax是否为0,为0跳转,不为0引爆 8048c27:85 c0 test %eax,%eax 8048c29:74 05 je 8048c30 <phase_1+0x20> 8048c2b:e8 a3 09 00 00 call 80495d3 <explode_bomb> /撤销栈桢,返回 8048c30:83 c4 1c add $0x1c,%esp 8048c33:c3 ret 程序流程:1. 取内存地址0x8049a04处的内容;2. 取用户输入的内容(即密码);3.

6、比较两者的值,相等则%eax置为0,进入下一关,不相等则调用引爆程序引爆炸弹。破解思路:通过p (char *) 0x8049a04指令取出该地址的字符串,得到: 因此第一关的密码:For NASA, space is still a high priority.五、 第二关炸弹拆除08048c34 <phase_2>: 8048c34:53 push %ebx 8048c35:83 ec 38 sub $0x38,%esp 8048c38:8d 44 24 18 lea 0x18(%esp),%eax 8048c3c:89 44 24 04 mov %eax,0x4(%esp)

7、/取用户输入的内容,存入%esp 8048c40:8b 44 24 40 mov 0x40(%esp),%eax 8048c44:89 04 24 mov %eax,(%esp) /调用函数read_six_numbers 8048c47:e8 8c 0a 00 00 call 80496d8 <read_six_numbers> /比较第一个输入的的数是否为1 8048c4c:83 7c 24 18 01 cmpl $0x1,0x18(%esp) /若为1则跳转下一步,否则引爆 8048c51:74 05 je 8048c58 <phase_2+0x24> 8048c

8、53:e8 7b 09 00 00 call 80495d3 <explode_bomb> /设置循环变量初始值%ebx=1 8048c58:bb 01 00 00 00 mov $0x1,%ebx /循环开始 /保存当前循环变量 %eax <- %ebx 8048c5d:89 d8 mov %ebx,%eax /循环变量后移 %edx <- %ebx+=1 8048c5f:83 c3 01 add $0x1,%ebx 8048c62:89 da mov %ebx,%edx /%edx *= *(%esp+%eax*4+14) 8048c64:0f af 54 84 1

9、4 imul 0x14(%esp,%eax,4),%edx /比较%edx与*(%esp+%eax*4+18) 8048c69:39 54 84 18 cmp %edx,0x18(%esp,%eax,4) /相等则跳转下一步,否则引爆 8048c6d:74 05 je 8048c74 <phase_2+0x40> 8048c6f:e8 5f 09 00 00 call 80495d3 <explode_bomb> /比较%ebx是否为6,不等则继续循环 8048c74:83 fb 06 cmp $0x6,%ebx 8048c77:75 e4 jne 8048c5d &l

10、t;phase_2+0x29> /循环结束,撤销栈桢,返回 8048c79:83 c4 38 add $0x38,%esp 8048c7c:5b pop %ebx 8048c7d:c3 ret 程序流程:1. 读取用户输入内容(为6个数字);2. 判断输入的第一个值是否为1,不是则引爆炸弹;3. 做一个6次循环,判断后一个数是否等于前一个数乘当前循环变量,不是则引爆炸弹;4. 六个数字判断相等结束后,进入下一关破解思路:设输入内容为一个数组Key6,则可知Key0=1,Keyi+1=Keyi*(i+1)。因此第二关的密码是:1 2 6 24 120 720六、 第三关炸弹拆除08048c

11、7e <phase_3>: 8048c7e:83 ec 2c sub $0x2c,%esp /用户输入的参数2存在%esp+1c 8048c81:8d 44 24 1c lea 0x1c(%esp),%eax 8048c85:89 44 24 0c mov %eax,0xc(%esp) /用户输入的参数1存在%esp+18 8048c89:8d 44 24 18 lea 0x18(%esp),%eax 8048c8d:89 44 24 08 mov %eax,0x8(%esp) /取出地址8049dfa中的内容”%d %d” 8048c91:c7 44 24 04 fa 9d 04

12、 movl $0x8049dfa,0x4(%esp) 8048c98:08 8048c99:8b 44 24 30 mov 0x30(%esp),%eax 8048c9d:89 04 24 mov %eax,(%esp) /调用sscanf函数,传入输入参数 8048ca0:e8 6b fc ff ff call 8048910 <_isoc99_sscanfplt> /判断返回值是否大于1,大于则引爆 8048ca5:83 f8 01 cmp $0x1,%eax 8048ca8:7f 05 jg 8048caf <phase_3+0x31> 8048caa:e8 24

13、 09 00 00 call 80495d3 <explode_bomb> /比较参数1是否大于7,大于则引爆 8048caf:83 7c 24 18 07 cmpl $0x7,0x18(%esp) 8048cb4:77 66 ja 8048d1c <phase_3+0x9e> /把参数1存入%eax,作为地址搜索变量 8048cb6:8b 44 24 18 mov 0x18(%esp),%eax /跳转到地址0x8049a60+4*%eax处 8048cba:ff 24 85 60 9a 04 08 jmp *0x8049a60(,%eax,4) /参数1为1时跳转到

14、此处,并继续跳转 8048cc1:b8 00 00 00 00 mov $0x0,%eax /1 8048cc6:eb 05 jmp 8048ccd <phase_3+0x4f> /参数1为0时跳转到此处,并继续跳转 8048cc8:b8 40 01 00 00 mov $0x140,%eax /0 8048ccd:2d a6 00 00 00 sub $0xa6,%eax 8048cd2:eb 05 jmp 8048cd9 <phase_3+0x5b> /参数1为2时跳转到此处,并继续跳转 8048cd4:b8 00 00 00 00 mov $0x0,%eax /2

15、 8048cd9:05 b6 01 00 00 add $0x1b6,%eax 8048cde:eb 05 jmp 8048ce5 <phase_3+0x67>/参数1为3时跳转到此处,并继续跳转 8048ce0:b8 00 00 00 00 mov $0x0,%eax /3 8048ce5:2d db 01 00 00 sub $0x1db,%eax 8048cea:eb 05 jmp 8048cf1 <phase_3+0x73> /参数1为4时跳转到此处,并继续跳转 8048cec:b8 00 00 00 00 mov $0x0,%eax /4 8048cf1:05

16、 6d 03 00 00 add $0x36d,%eax 8048cf6:eb 05 jmp 8048cfd <phase_3+0x7f> /参数1为5时跳转到此处,并继续跳转 8048cf8:b8 00 00 00 00 mov $0x0,%eax /5 8048cfd:2d f4 00 00 00 sub $0xf4,%eax 8048d02:eb 05 jmp 8048d09 <phase_3+0x8b> /参数1为6时跳转到此处,并继续跳转 8048d04:b8 00 00 00 00 mov $0x0,%eax /6 8048d09:05 f4 00 00 0

17、0 add $0xf4,%eax 8048d0e:eb 05 jmp 8048d15 <phase_3+0x97> /参数1为7时跳转到此处,并继续跳转 8048d10:b8 00 00 00 00 mov $0x0,%eax /7 8048d15:2d 9e 02 00 00 sub $0x29e,%eax 8048d1a:eb 0a jmp 8048d26 <phase_3+0xa8> 8048d1c:e8 b2 08 00 00 call 80495d3 <explode_bomb> 8048d21:b8 00 00 00 00 mov $0x0,%e

18、ax /比较参数1是否大于5,大于则引爆 8048d26:83 7c 24 18 05 cmpl $0x5,0x18(%esp) 8048d2b:7f 06 jg 8048d33 <phase_3+0xb5> /比较参数2与计算得到的%eax是否相等 8048d2d:3b 44 24 1c cmp 0x1c(%esp),%eax /相等则返回,不相等则引爆 8048d31:74 05 je 8048d38 <phase_3+0xba> 8048d33:e8 9b 08 00 00 call 80495d3 <explode_bomb> 8048d38:83

19、c4 2c add $0x2c,%esp 8048d3b:c3 ret 程序流程: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只能是0 1 2 3 4 5 6 7。根

20、据参数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)

21、=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:因此第三关的密码是(以下任一组):0 656;1 336;2 170;3 -268;4 207;5 -670七、 第四关炸弹拆除:08048d7b <phase_4>: 8048d7b:83 ec 2c sub $0x2c,%esp /用户输入的参数存在%esp+1c

22、 8048d7e:8d 44 24 1c lea 0x1c(%esp),%eax 8048d82:89 44 24 08 mov %eax,0x8(%esp) /读取地址0x8049dfd的内容 8048d86:c7 44 24 04 fd 9d 04 movl $0x8049dfd,0x4(%esp) 8048d8d:08 8048d8e:8b 44 24 30 mov 0x30(%esp),%eax 8048d92:89 04 24 mov %eax,(%esp) /调用函数sscanf 8048d95:e8 76 fb ff ff call 8048910 <_isoc99_ssc

23、anfplt> /比较返回值是否等于1,不等则引爆 8048d9a:83 f8 01 cmp $0x1,%eax 8048d9d:75 07 jne 8048da6 <phase_4+0x2b> /比较输入参数与0的大小,小于等于则引爆 8048d9f:83 7c 24 1c 00 cmpl $0x0,0x1c(%esp) 8048da4:7f 05 jg 8048dab <phase_4+0x30> 8048da6:e8 28 08 00 00 call 80495d3 <explode_bomb> /把输入参数传入函数func4,调用函数func4

24、 8048dab:8b 44 24 1c mov 0x1c(%esp),%eax 8048daf:89 04 24 mov %eax,(%esp) 8048db2:e8 85 ff ff ff call 8048d3c <func4> /比较返回值是否等于0x1055,不等则引爆 8048db7:3d 55 10 00 00 cmp $0x1055,%eax 8048dbc:74 05 je 8048dc3 <phase_4+0x48> 8048dbe:e8 10 08 00 00 call 80495d3 <explode_bomb> /相等则撤销栈桢,返

25、回 8048dc3:83 c4 2c add $0x2c,%esp 8048dc6:c3 ret 主程序流程:1. 读取参数,调用sscanf函数传入参数;2. 比较输入参数与0的大小,小于等于则引爆;3. 把输入参数传入函数func4,并调用函数func4;4. 若函数func4返回值等于0x1055,则返回,进入下一关,否则引爆炸弹。08048d3c <func4>: 8048d3c:83 ec 1c sub $0x1c,%esp 8048d3f:89 5c 24 14 mov %ebx,0x14(%esp) 8048d43:89 74 24 18 mov %esi,0x18(

26、%esp) /把参数传入%ebx 8048d47:8b 5c 24 20 mov 0x20(%esp),%ebx 8048d4b:b8 01 00 00 00 mov $0x1,%eax /比较%ebx与1的大小,大于则继续 8048d50:83 fb 01 cmp $0x1,%ebx 8048d53:7e 1a jle 8048d6f <func4+0x33> /%eax<-%ebx-1并传入func4继续递归 8048d55:8d 43 ff lea -0x1(%ebx),%eax 8048d58:89 04 24 mov %eax,(%esp) 8048d5b:e8 d

27、c ff ff ff call 8048d3c <func4> /%esi=%eax,%ebx-=2 8048d60:89 c6 mov %eax,%esi 8048d62:83 eb 02 sub $0x2,%ebx /%esp<-%ebx,并传入fun4继续递归 8048d65:89 1c 24 mov %ebx,(%esp) 8048d68:e8 cf ff ff ff call 8048d3c <func4> /%eax += %esi 8048d6d:01 f0 add %esi,%eax /%ebx<=1,返回 8048d6f:8b 5c 24

28、14 mov 0x14(%esp),%ebx 8048d73:8b 74 24 18 mov 0x18(%esp),%esi 8048d77:83 c4 1c add $0x1c,%esp 8048d7a:c3 ret func4函数流程:1. 比较传入参数是否大于1,大于1则继续,小于等于1则返回1;2. 循环%eax <- %ebx-1,并递归调用函数func4,直到参数小于等于1;3. 循环变量%ebx每次减2,并传入%esp继续递归调用函数func4;4. 函数返回的所得值加到%eax;破解思路:首先我们通过p(char *)0x8049dfd读取该内存地址中的内容:可知输入参数

29、为一个整数,进一步我们发现它大于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)

30、=4181=0x1055。因此第四关的密码是:18八、 第五关炸弹拆除08048dc7 <phase_5>: 8048dc7:53 push %ebx 8048dc8:83 ec 18 sub $0x18,%esp 8048dcb:8b 5c 24 20 mov 0x20(%esp),%ebx 8048dcf:89 1c 24 mov %ebx,(%esp) /调用string_length函数 8048dd2:e8 54 02 00 00 call 804902b <string_length> /比较字符串长度,不等于6则引爆 8048dd7:83 f8 06 cm

31、p $0x6,%eax 8048dda:74 05 je 8048de1 <phase_5+0x1a> 8048ddc:e8 f2 07 00 00 call 80495d3 <explode_bomb> /把%edx和%eax初始化置0 8048de1:ba 00 00 00 00 mov $0x0,%edx /循环开始 8048de6:b8 00 00 00 00 mov $0x0,%eax /%ecx <- (%ebx+%eax) 8048deb:0f be 0c 03 movsbl (%ebx,%eax,1),%ecx /取%ecx中的内容的低四位 804

32、8def:83 e1 0f and $0xf,%ecx /%edx += *(0x8049a80+4*%ecx) 8048df2:03 14 8d 80 9a 04 08 add 0x8049a80(,%ecx,4),%edx /循环变量%eax+=1 8048df9:83 c0 01 add $0x1,%eax /比较循环变量%eax与6,不等则再循环 8048dfc:83 f8 06 cmp $0x6,%eax 8048dff:75 ea jne 8048deb <phase_5+0x24> /循环结束 /比较%edx是否等于0x36,不等则引爆 8048e01:83 fa 3

33、6 cmp $0x36,%edx 8048e04:74 05 je 8048e0b <phase_5+0x44> 8048e06:e8 c8 07 00 00 call 80495d3 <explode_bomb> /相等则撤销栈桢,返回 8048e0b:83 c4 18 add $0x18,%esp 8048e0e:5b pop %ebx 8048e0f:90 nop8048e10:c3 ret程序流程:1. 调用string_length的字符串长度函数,测得的长度若不为6则引爆;2. 做一个6次的循环,循环变量%eax从1到6,令%ecx<-(%ebx+%e

34、ax);3. 只保留%ecx的低四位,并以此作为地址搜索变量,取出0x8049a80+4*%ecx中的数加到%edx上,如此循环6次后跳出;4. 比较总和%edx的值是否等于0x36(54),相等则返回进入下一关,不等则引爆。破解思路:首先我们得知输入的字符串长度为6,然后通过p /x *(0x8049a80+4*%ecx)的指令得到:上述值分别对应%eax=04。因为字符在机器中是以ASCII码的形式存储,因此我们要寻找的一个6位字符串要满足其每个字符的ASCII码位数对应的值相加为0x36即54。因此不妨取3*(c+6)=0x36,即取ASCII码位数(16进制)分别为2和4的的字母,例如

35、B(42H)和D(44H),重复三次即可。因此第五关的密码为(不唯一):BBBDDD九、 第六关炸弹拆除08048e11 <phase_6>: 8048e11:56 push %esi 8048e12:53 push %ebx 8048e13:83 ec 44 sub $0x44,%esp 8048e16:8d 44 24 10 lea 0x10(%esp),%eax 8048e1a:89 44 24 04 mov %eax,0x4(%esp) 8048e1e:8b 44 24 50 mov 0x50(%esp),%eax 8048e22:89 04 24 mov %eax,(%e

36、sp) /调用函数read_six_numbers 8048e25:e8 ae 08 00 00 call 80496d8 <read_six_numbers> /初始化循环变量%esi=0 8048e2a:be 00 00 00 00 mov $0x0,%esi /循环1开始 /%eax <- *(%esp+4*%esi) 8048e2f:8b 44 b4 10 mov 0x10(%esp,%esi,4),%eax /比较%eax-1是否大于5(无符号数) 8048e33:83 e8 01 sub $0x1,%eax 8048e36:83 f8 05 cmp $0x5,%e

37、ax /小于等于则继续 8048e39:76 05 jbe 8048e40 <phase_6+0x2f> 8048e3b:e8 93 07 00 00 call 80495d3 <explode_bomb> /循环变量%esi+=1 8048e40:83 c6 01 add $0x1,%esi /判断%esi是否等于6,等于则跳出循环 8048e43:83 fe 06 cmp $0x6,%esi 8048e46:74 33 je 8048e7b <phase_6+0x6a> /%ebx=%esi 8048e48:89 f3 mov %esi,%ebx /取出%esp+4*%ebx+10 8048e4a:8b 44 9c 10 mov 0x10(%esp,%ebx,4),%eax /与%esp+4*%esi+c比较,相等则引爆 8048e4e:39 44 b4 0c cmp %eax,0xc(%esp,%esi,4) 8048e52:75 05 jne 8048e59 <phase_6+0x48> 8048e54:e8 7a 07 00 00 call 80495d3 <exp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论