我真的在努力弄清楚臭名昭着的炸弹实验室的这一阶段。我知道我们需要2个输入整数,第二个输入(x)必须在1 <1的范围内。 x&lt; = 4,但我无法弄清楚递归方法(func4)。
更具体地说,我无法弄清楚func4需要返回的确切方法,以便我可以跳过&lt; + 67&gt;中的explode_bomb语句。因为%rsp是堆栈指针,它正向前移8(我实际上不知道如何使用gdb命令处理)。 [就此而言,%rsp上运行的x / d给出-72]
请帮忙!谢谢!
编辑:好的我知道这个问题类似于其他关于堆栈溢出的bomblab问题。我更具体地询问如何确定func4的返回值是什么(我知道它是斐波纳契的一种形式)。我可以检查没有直接的常量值,因为我被要求比较移位x字节左右的堆栈指针。
转储函数phase_4的汇编代码:
0x00000000004010ff <+0>: sub $0x18,%rsp
0x0000000000401103 <+4>: lea 0xc(%rsp),%rcx
0x0000000000401108 <+9>: lea 0x8(%rsp),%rdx
0x000000000040110d <+14>: mov $0x4024aa,%esi
0x0000000000401112 <+19>: mov $0x0,%eax
0x0000000000401117 <+24>: callq 0x400ac8 <__isoc99_sscanf@plt>
0x000000000040111c <+29>: cmp $0x2,%eax
0x000000000040111f <+32>: jne 0x40112f <phase_4+48>
0x0000000000401121 <+34>: mov 0xc(%rsp),%eax
0x0000000000401125 <+38>: cmp $0x1,%eax
0x0000000000401128 <+41>: jle 0x40112f <phase_4+48>
0x000000000040112a <+43>: cmp $0x4,%eax
0x000000000040112d <+46>: jle 0x401134 <phase_4+53>
0x000000000040112f <+48>: callq 0x4013da <explode_bomb>
0x0000000000401134 <+53>: mov 0xc(%rsp),%esi
0x0000000000401138 <+57>: mov $0x8,%edi
0x000000000040113d <+62>: callq 0x400e70 <func4>
=> 0x0000000000401142 <+67>: cmp 0x8(%rsp),%eax
0x0000000000401146 <+71>: je 0x40114d <phase_4+78>
0x0000000000401148 <+73>: callq 0x4013da <explode_bomb>
0x000000000040114d <+78>: add $0x18,%rsp
0x0000000000401151 <+82>: retq
转储函数func4的汇编程序代码:
0x0000000000400e70 <+0>: mov %rbx,-0x18(%rsp)
0x0000000000400e75 <+5>: mov %rbp,-0x10(%rsp)
0x0000000000400e7a <+10>: mov %r12,-0x8(%rsp)
0x0000000000400e7f <+15>: sub $0x18,%rsp
0x0000000000400e83 <+19>: mov %edi,%ebx
0x0000000000400e85 <+21>: mov %esi,%ebp
0x0000000000400e87 <+23>: test %edi,%edi
0x0000000000400e89 <+25>: jg 0x400e92 <func4+34>
0x0000000000400e8b <+27>: mov $0x0,%ebp
0x0000000000400e90 <+32>: jmp 0x400eb2 <func4+66>
0x0000000000400e92 <+34>: cmp $0x1,%edi
0x0000000000400e95 <+37>: je 0x400eb2 <func4+66>
0x0000000000400e97 <+39>: lea -0x1(%rbx),%edi
0x0000000000400e9a <+42>: callq 0x400e70 <func4>
0x0000000000400e9f <+47>: mov %eax,%r12d
0x0000000000400ea2 <+50>: lea -0x2(%rbx),%edi
0x0000000000400ea5 <+53>: mov %ebp,%esi
0x0000000000400ea7 <+55>: callq 0x400e70 <func4>
0x0000000000400eac <+60>: add %eax,%r12d
0x0000000000400eaf <+63>: add %r12d,%ebp
0x0000000000400eb2 <+66>: mov %ebp,%eax
0x0000000000400eb4 <+68>: mov (%rsp),%rbx
0x0000000000400eb8 <+72>: mov 0x8(%rsp),%rbp
0x0000000000400ebd <+77>: mov 0x10(%rsp),%r12
0x0000000000400ec2 <+82>: add $0x18,%rsp
0x0000000000400ec6 <+86>: retq