bomblab下载页:http://download.csdn.net/download/u013648407/7279933 其中bomb是可执行文件 需要用objdump指令反汇编,c1.txt是我反汇编所得到的assembly code。
*****************************************************************************************************************************************************************************************
the second lab,bomb lab。
在我看来这个lab难度比较大。需要花不少时间和精力才能完成。对于这个lab,不同的人有不同的看法,有的人觉得通过阅读assembly code 来提高纯粹的阅读代码能力更重要,有的人觉得合理运用gdb获得更大效率更重要,仁者见仁吧。但不得不说这个lab是很有趣的一个lab,拆除炸弹那一瞬间的快感是无法用言语形容的。想要尝试的朋友可以自行下载,良心0积分。
废话不说,开始:
*****************************************************************************************************************************************************************************************
Q1:
080490b9 <phase_1>:
80490b9: 55 push %ebp
80490ba: 89 e5 mov %esp,%ebp
80490bc: 83 ec 18 sub $0x18,%esp
80490bf: c7 44 24 04 ec 9d 04 movl $0x8049dec,0x4(%esp)<-将内存0x8049dec中的内容压栈
80490c6: 08
80490c7: 8b 45 08 mov 0x8(%ebp),%eax
80490ca: 89 04 24 mov %eax,(%esp)<-将输入的内容压栈
80490cd: e8 3d 00 00 00 call 804910f <strings_not_equal> <-调用这个函数,看名字知道是判断字符串相等与否的
80490d2: 85 c0 test %eax,%eax<-判断返回值,返回值是1则跳到bomb,说明要求上面两个压栈的字符串必须相等
80490d4: 74 05 je 80490db <phase_1+0x22>
80490d6: e8 44 07 00 00 call 804981f <explode_bomb>
80490db: c9 leave
80490dc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
80490e0: c3 ret
80490e1: 90 nop
分析如上,解决方法就是用gbd查看0x8049dec中的字符串,再将该字符串作为密码输入即可。指令为x/s 0x8049dec
*****************************************************************************************************************************************************************************************
Q2:
080490b9 <phase_1>:
80490b9: 55 push %ebp
80490ba: 89 e5 mov %esp,%ebp
80490bc: 83 ec 18 sub $0x18,%esp
80490bf: c7 44 24 04 ec 9d 04 movl $0x8049dec,0x4(%esp)<-将内存0x8049dec中的内容压栈
80490c6: 08
80490c7: 8b 45 08 mov 0x8(%ebp),%eax
80490ca: 89 04 24 mov %eax,(%esp)<-将输入的内容压栈
80490cd: e8 3d 00 00 00 call 804910f <strings_not_equal> <-调用这个函数,看名字知道是判断字符串相等与否的
80490d2: 85 c0 test %eax,%eax<-判断返回值,返回值是1则跳到bomb,说明要求上面两个压栈的字符串必须相等
80490d4: 74 05 je 80490db <phase_1+0x22>
80490d6: e8 44 07 00 00 call 804981f <explode_bomb>
80490db: c9 leave
80490dc: 8d 74 26 00 lea 0x0(%esi,%eiz,1),%esi
80490e0: c3 ret
80490e1: 90 nop
通过对主要部分的分析,看出这个密码是一个数列,首项为1,a[n]=n*a[n-1].
答案即是1 2 6 24 120 720
*****************************************************************************************************************************************************************************************
08048eb1 <phase_3>:
8048eb1: 55 push %ebp
8048eb2: 89 e5 mov %esp,%ebp
8048eb4: 53 push %ebx
8048eb5: 83 ec 34 sub $0x34,%esp
8048eb8: 8d 45 f0 lea -0x10(%ebp),%eax<-第三个输入存储在-0x10(%ebp)
8048ebb: 89 44 24 10 mov %eax,0x10(%esp)
8048ebf: 8d 45 ef lea -0x11(%ebp),%eax<-第二个输入存储在-0x11(%ebp)
8048ec2: 89 44 24 0c mov %eax,0xc(%esp)
8048ec6: 8d 45 f4 lea -0xc(%ebp),%eax<-第一个输入存储在-0xc(%ebp)
8048ec9: 89 44 24 08 mov %eax,0x8(%esp)
8048ecd: c7 44 24 04 2e 9e 04 movl $0x8049e2e,0x4(%esp)<-此处使用gdb设置断点调试得到0x8049e2e中存储的是一个“%d,%c,%d”,即输入的格式
8048ed4: 08
8048ed5: 8b 45 08 mov 0x8(%ebp),%eax
8048ed8: 89 04 24 mov %eax,(%esp)
8048edb: e8 48 fb ff ff call 8048a28 <sscanf@plt>
8048ee0: 83 f8 02 cmp $0x2,%eax<-输入数据个数必须大于2,否则爆炸
8048ee3: 7f 05 jg 8048eea <phase_3+0x39>
8048ee5: e8 35 09 00 00 call 804981f <explode_bomb>
8048eea: 83 7d f4 07 cmpl $0x7,-0xc(%ebp)
8048eee: 66 90 xchg %ax,%ax
8048ef0: 0f 87 34 01 00 00 ja 804902a <phase_3+0x179><-以上三行比较输入的第一个数字与7,若第一个输入大于7则爆炸(804802a直接相当于跳转到爆炸函数)
8048ef6: 8b 5d f4 mov -0xc(%ebp),%eb