了解炸弹实验室第4阶段

时间:2016-04-26 07:50:29

标签: assembly hex decimal reverse-engineering x86-64

我真的在努力弄清楚臭名昭着的炸弹实验室的这一阶段。我知道我们需要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   

0 个答案:

没有答案