隐藏阶段,phase_4 之后附加特定字符串后出现
怎么找出隐藏关的就不赘述了。直接进入正题:
先查secret_phase:
1869: 56 push %esi #我们输入的数
186a: 8d 83 24 05 00 00 lea 0x524(%ebx),%eax #查看0x524(%ebx)中内容为0x24
1870: 50 push %eax
1871: e8 6d ff ff ff call 17e3 <fun7>
这段代码告诉我们调用fun7函数时传入了两个参数,一个是0x24,一个是我们输入的数。继续往下看:
1871: e8 6d ff ff ff call 17e3 <fun7>
1876: 83 c4 10 add $0x10,%esp
1879: 85 c0 test %eax,%eax #判断eax是否为0或正负数
187b: 75 25 jne 18a2 <secret_phase+0x6d> #ZF=0,即eax不为0,爆炸
这段代码说明调用fun7之后,eax的值必须为0。
现在查看fun7的代码:
17ea: 8b 55 08 mov 0x8(%ebp),%edx #0x24
17ed: 8b 4d 0c mov 0xc(%ebp),%ecx #我们输入的数
17f0: 85 d2 test %edx,%edx
17f2: 74 3a je 182e <fun7+0x4b> #如果edx为0,爆炸
17f4: 8b 1a mov (%edx),%ebx
17f6: 39 cb cmp %ecx,%ebx
17f8: 7f 0c jg 1806 <fun7+0x23> #如果ebx(即edx)大于ecx,跳至1806
17fa: b8 00 00 00 00 mov $0x0,%eax #0传给eax,这正是我们需要的
17ff: 75 18 jne 1819 <fun7+0x36> #如果ebx小于ecx,跳至1819
1801: 8b 5d fc mov -0x4(%ebp),%ebx
1804: c9 leave
1805: c3 ret
通过上面的代码,我们可以知道,当ecx和edx相等时,eax会被置0,这正是我们希望的。至于大于和小于时有什么操作,对这个炸弹而言不重要了,只要输入的数是36(由0x24换算而来),就能返回0。现在来验证猜测:
很幸运,通关了!