phase_4:递归调用和栈
首先查看phase_4的反汇编代码段:
00001623 <phase_4>:
1623: 55 push %ebp
1624: 89 e5 mov %esp,%ebp
1626: 53 push %ebx
1627: 83 ec 14 sub $0x14,%esp
162a: e8 e1 fb ff ff call 1210 <__x86.get_pc_thunk.bx>
162f: 81 c3 d1 39 00 00 add $0x39d1,%ebx
1635: 8d 45 f0 lea -0x10(%ebp),%eax #这里应该是输入的第二个参数位置
1638: 50 push %eax
1639: 8d 45 f4 lea -0xc(%ebp),%eax #这里应该是输入的第二个参数位置
163c: 50 push %eax
163d: 8d 83 ad e3 ff ff lea -0x1c53(%ebx),%eax
1643: 50 push %eax
1644: ff 75 08 pushl 0x8(%ebp)
1647: e8 d4 fa ff ff call 1120 <__isoc99_sscanf@plt>
164c: 83 c4 10 add $0x10,%esp
164f: 83 f8 02 cmp $0x2,%eax #输入的数的个数不等于2就会爆炸
1652: 75 06 jne 165a <phase_4+0x37>
1654: 83 7d f4 0e cmpl $0xe,-0xc(%ebp) #第一个数大于14就会爆炸
1658: 76 05 jbe 165f <phase_4+0x3c>
165a: e8 10 05 00 00 call 1b6f <explode_bomb>
165f: 83 ec 04 sub $0x4,%esp
1662: 6a 0e push $0xe
1664: 6a 00 push $0x0
1666: ff 75 f4 pushl -0xc(%ebp)
1669: e8 5a ff ff ff call 15c8 <func4>
166e: 83 c4 10 add $0x10,%esp
1671: 83 f8 01 cmp $0x1,%eax 调用func4函数后,若eax不等于1,就会爆炸
1674: 75 06 jne 167c <phase_4+0x59>
1676: 83 7d f0 01 cmpl $0x1,-0x10(%ebp) #第二个数不等于2就会爆炸
167a: 74 05 je 1681 <phase_4+0x5e>
167c: e8 ee 04 00 00 call 1b6f <explode_bomb>
1681: 8b 5d fc mov -0x4(%ebp),%ebx
1684: c9 leave
1685: c3 ret
从上面的代码中可以推测出,要输入两个数,第二个数必须是1,第一个数不能大于14。在func4函数中进行了一堆操作,反映在eax的值上,然后检测eax中的值是否为1,不等于1就会爆炸。func4函数有点长,我就没有细究其过程,现在,可以在explode_bomb处设置断点,然后输入x 1, x的值从0试到14,就能得出结果。下面是通关操作:
很幸运,我的推测是对的,输入的值为8 1
时,通过了第四关。