phase_5:指针
先找到phase_5反汇编得到的代码段:
00001686 <phase_5>:
1686: 55 push %ebp
1687: 89 e5 mov %esp,%ebp
1689: 57 push %edi
168a: 56 push %esi
168b: 53 push %ebx
168c: 83 ec 18 sub $0x18,%esp
168f: e8 7c fb ff ff call 1210 <__x86.get_pc_thunk.bx>
1694: 81 c3 6c 39 00 00 add $0x396c,%ebx
169a: 8b 75 08 mov 0x8(%ebp),%esi
169d: 56 push %esi
169e: e8 a1 02 00 00 call 1944 <string_length> #推测可能要输入一个字符串
16a3: 83 c4 10 add $0x10,%esp
16a6: 83 f8 06 cmp $0x6,%eax #推测字符串的长度应该是6
16a9: 75 2d jne 16d8 <phase_5+0x52>
16ab: 89 f0 mov %esi,%eax
16ad: 83 c6 06 add $0x6,%esi
16b0: b9 00 00 00 00 mov $0x0,%ecx
16b5: 8d bb c0 e1 ff ff lea -0x1e40(%ebx),%edi
16bb: 0f b6 10 movzbl (%eax),%edx
16be: 83 e2 0f and $0xf,%edx #每次去一个字符串进行与运算
16c1: 03 0c 97 add (%edi,%edx,4),%ecx #进行了某种转换,将结果放在ecx中
16c4: 83 c0 01 add $0x1,%eax
16c7: 39 f0 cmp %esi,%eax #循环进行6次
16c9: 75 f0 jne 16bb <phase_5+0x35>
16cb: 83 f9 37 cmp $0x37,%ecx #6次循环后,ecx中的值应该是37
16ce: 75 0f jne 16df <phase_5+0x59>
16d0: 8d 65 f4 lea -0xc(%ebp),%esp
16d3: 5b pop %ebx
16d4: 5e pop %esi
16d5: 5f pop %edi
16d6: 5d pop %ebp
16d7: c3 ret
16d8: e8 92 04 00 00 call 1b6f <explode_bomb>
16dd: eb cc jmp 16ab <phase_5+0x25>
16df: e8 8b 04 00 00 call 1b6f <explode_bomb>
16e4: eb ea jmp 16d0 <phase_5+0x4a>
对代码进行分析,我先输入了6个数字,发现每次循环都会给ecx加上一个数,我猜想可能是输入的每一位数字,经验证,猜想不成立,也不是ASCII码的低四位,但是因该与ASCII有关。我没有继续细究,而是将每个数字都输一遍,找到对应的数,类似翻译密码。操作如下:
我输入了543210,之后又测试了6789ab,通过ecx的变化值得到密码表如下:
0 ——> 0x2
1 ——> 0xa
2 ——> 0x6
3 ——> 0x1
4 ——> 0xc
5 ——> 0x10
6 ——> 0x9
7 ——> 0x3
8 ——> 0x4
9 ——> 0x7
a ——> 0xa
b ——> 0x6
我猜想,只要让输入的六个数对应的值的和为0x37,就能通关。我输入的是145688。很幸运,这次又猜对了!
可以看到,在加上最后一个数后,ecx的值已经变为0x37。通关了!
答案不唯一。拆弹实验推荐安装peda,确实能给拆弹带来很多便利。安装教程链接如下:
Ubuntu安装peda