拆弹实验第二关,循环。
先查看phase_2的代码:
从下面这段代码推测需要输入6个数,且最终存放在-0x30(%ebp)
为起始位置的内存中。
14e8: e8 d4 06 00 00 call 1bc1 <read_six_numbers>
14ed: 83 c4 10 add $0x10,%esp
14f0: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
从下面这段代码推测出,第一个数不能是负数,否则,将会引爆炸弹。那么,假设第一个数是0,继续往下看。
14f0: 83 7d d0 00 cmpl $0x0,-0x30(%ebp)
14f4: 78 0a js 1500 <phase_2+0x33>
发现了一处循环,代码如下:
150c: 83 c6 01 add $0x1,%esi
150f: 83 fe 06 cmp $0x6,%esi
1512: 74 0d je 1521 <phase_2+0x54>
1514: 89 f0 mov %esi,%eax
1516: 03 44 b7 fc add -0x4(%edi,%esi,4),%eax
151a: 39 04 b7 cmp %eax,(%edi,%esi,4)
151d: 74 ed je 150c <phase_2+0x3f>
从上面的代码中可以发现,esi是判断循环是否继续进行的计数器。
参照代码可以得出下面这些判断:
0+1 == 1?
1+2 == 3?
3+3 == 6?
6+4 == 10?
10+5 == 15?
如果不满足上面这些等式,同样会引爆炸弹。
在上面这些推断下,可以猜测,输入的6个数为:0 1 3 6 10 15,运行bomb进行测试:
很幸运,通关了!