phase_3:条件/分支:含switch语句
首先,查看phase_3的反汇编代码段:
00001529 <phase_3>:
1529: 55 push %ebp
152a: 89 e5 mov %esp,%ebp
152c: 53 push %ebx
152d: 83 ec 14 sub $0x14,%esp
1530: e8 db fc ff ff call 1210 <__x86.get_pc_thunk.bx>
1535: 81 c3 cb 3a 00 00 add $0x3acb,%ebx
153b: 8d 45 f0 lea -0x10(%ebp),%eax
153e: 50 push %eax
153f: 8d 45 f4 lea -0xc(%ebp),%eax
1542: 50 push %eax
1543: 8d 83 ad e3 ff ff lea -0x1c53(%ebx),%eax
1549: 50 push %eax
154a: ff 75 08 pushl 0x8(%ebp)
154d: e8 ce fb ff ff call 1120 <__isoc99_sscanf@plt>
1552: 83 c4 10 add $0x10,%esp
1555: 83 f8 01 cmp $0x1,%eax
1558: 7e 14 jle 156e <phase_3+0x45>
155a: 83 7d f4 07 cmpl $0x7,-0xc(%ebp)
155e: 77 4e ja 15ae <.L17+0x7>
1560: 8b 45 f4 mov -0xc(%ebp),%eax
1563: 89 da mov %ebx,%edx
1565: 03 94 83 a0 e1 ff ff add -0x1e60(%ebx,%eax,4),%edx
156c: ff e2 jmp *%edx
156e: e8 fc 05 00 00 call 1b6f <explode_bomb>
1573: eb e5 jmp 155a <phase_3+0x31>
从下面这几行代码推测出,要输入两个数,否则会爆炸。其中,第一个参数存放在-0xc(%ebp)
处,第二个参数存放在-0x10(%ebp)
。
154d: e8 ce fb ff ff call 1120 <__isoc99_sscanf@plt>
1552: 83 c4 10 add $0x10,%esp
1555: 83 f8 01 cmp $0x1,%eax
1558: 7e 14 jle 156e <phase_3+0x45>
从下面这两行推测出第一个参数不能大于7。这里我们假设第一个数为0。
155a: 83 7d f4 07 cmpl $0x7,-0xc(%ebp)
155e: 77 4e ja 15ae <.L17+0x7>
下面两行告诉我们跳转到另一个地方,gdb
调试查看跳转到哪里了。
1565: 03 94 83 a0 e1 ff ff add -0x1e60(%ebx,%eax,4),%edx
156c: ff e2 jmp *%edx
disas
得到下面这段反汇编代码更方便查看:
在67行处设置断点,发现跳转到了145行,将0x13e赋给eax,然后又跳转到了81行。将eax中的值和我们输入的第二个参数进行比较,如果不相等,就会爆炸。到这里,我们可以推测第二个数是0x13e,记住,输入时输入的是10进制数,转换成10进制数318后输入。
下面是通关操作:
为了防止出错爆炸,我在引爆炸弹的地方都设置了断点。很幸运,推测是对的,通关了!