我试图弄清楚在二元炸弹实验室的第3阶段消除炸弹的正确输入。我已经发现输入必须是两个整数,并且第一个整数必须小于7.我一直在使用任意的第一个值(1)来尝试通过使用跳转表来计算第二个值,但是我似乎无法得到答案。具体来说,我在此行0x0000000000400ffc <+165>: cmp 0x8(%rsp),%eax
之后继续引爆炸弹。
非常感谢任何帮助或指导。
转储函数phase_3的汇编代码:
0x0000000000400f57 <+0>: sub $0x18,%rsp
0x0000000000400f5b <+4>: lea 0x8(%rsp),%rcx
0x0000000000400f60 <+9>: lea 0xc(%rsp),%rdx
0x0000000000400f65 <+14>: mov $0x4027ed,%esi
0x0000000000400f6a <+19>: mov $0x0,%eax
0x0000000000400f6f <+24>: callq 0x400c30 <__isoc99_sscanf@plt>
0x0000000000400f74 <+29>: cmp $0x1,%eax
0x0000000000400f77 <+32>: jg 0x400f7e <phase_3+39>
0x0000000000400f79 <+34>: callq 0x401574 <explode_bomb>
0x0000000000400f7e <+39>: cmpl $0x7,0xc(%rsp)
0x0000000000400f83 <+44>: ja 0x400feb <phase_3+148>
0x0000000000400f85 <+46>: mov 0xc(%rsp),%eax
0x0000000000400f89 <+50>: jmpq *0x402520(,%rax,8)
0x0000000000400f90 <+57>: mov $0x0,%eax
0x0000000000400f95 <+62>: jmp 0x400f9c <phase_3+69>
0x0000000000400f97 <+64>: mov $0x3a0,%eax
0x0000000000400f9c <+69>: sub $0x3c2,%eax
0x0000000000400fa1 <+74>: jmp 0x400fa8 <phase_3+81>
0x0000000000400fa3 <+76>: mov $0x0,%eax
0x0000000000400fa8 <+81>: add $0x23d,%eax
0x0000000000400fad <+86>: jmp 0x400fb4 <phase_3+93>
0x0000000000400faf <+88>: mov $0x0,%eax
0x0000000000400fb4 <+93>: sub $0x3e6,%eax
0x0000000000400fb9 <+98>: jmp 0x400fc0 <phase_3+105>
0x0000000000400fbb <+100>: mov $0x0,%eax
0x0000000000400fc0 <+105>: add $0x3e6,%eax
0x0000000000400fc5 <+110>: jmp 0x400fcc <phase_3+117>
0x0000000000400fc7 <+112>: mov $0x0,%eax
0x0000000000400fcc <+117>: sub $0x3e6,%eax
0x0000000000400fd1 <+122>: jmp 0x400fd8 <phase_3+129>
0x0000000000400fd3 <+124>: mov $0x0,%eax
0x0000000000400fd8 <+129>: add $0x3e6,%eax
0x0000000000400fdd <+134>: jmp 0x400fe4 <phase_3+141>
0x0000000000400fdf <+136>: mov $0x0,%eax
0x0000000000400fe4 <+141>: sub $0x3e6,%eax
0x0000000000400fe9 <+146>: jmp 0x400ff5 <phase_3+158>
0x0000000000400feb <+148>: callq 0x401574 <explode_bomb>
0x0000000000400ff0 <+153>: mov $0x0,%eax
0x0000000000400ff5 <+158>: cmpl $0x5,0xc(%rsp)
0x0000000000400ffa <+163>: jg 0x401002 <phase_3+171>
=> 0x0000000000400ffc <+165>: cmp 0x8(%rsp),%eax
0x0000000000401000 <+169>: je 0x401007 <phase_3+176>
0x0000000000401002 <+171>: callq 0x401574 <explode_bomb>
0x0000000000401007 <+176>: add $0x18,%rsp
0x000000000040100b <+180>: retq
答案 0 :(得分:1)
我的作业中有相同的阶段3,这就是我得到解决方案的方法
在线&lt; + 165&gt;
(gdb)i r rsp
rsp 0x7fffffffde00 0x7fffffffde00
(gdb)x / d(0x7fffffffde00 + 0x8)
0x7fffffffde08:2(之前我随机写过的数字)
(gdb)i r eax
eax 0xfffffc78 -904
(gdb)print / d 0xfffffc78
$ 1 = 4294966392
答案 1 :(得分:0)
在线&lt; + 165&gt;比较寄存器%eax和0x8(%rsp)中的值,如果这两个相等,则炸弹不引爆。
考虑到对0x8(%rsp)所做的唯一更改是在&lt; + 4&gt;,其中%rcx的有效地址加载到0x8(%rsp),您可能很容易尝试并转入多个值来检查哪个值在开头的%rcx中结束,最终在0x8(%rsp)。尝试使用gdb指令,例如
i r
在进度时检查寄存器中的值。你甚至可以确定你要检查的确切位置(甚至是0x8(%rsp)),只是因为我不记得确切的gdb指令。
%eax在此处被访问,然后在&lt; + 165&gt;之前访问,因此您可能想尝试从那时开始向后行走以检查哪个值最终会在&amp; eax中结束。这比听起来容易,因为代码只涉及mov,sub或使用%eax添加。当你得到这个值时,适当地输入这个值,使它在开始时以%rcx结束,你可以在&lt; + 165&gt;之后通过炸弹。