二进制炸弹练习的第四阶段

时间:2019-05-25 18:18:54

标签: assembly x86 gdb system

我知道此问题有多种版本,但是在提供给我的代码中找不到能帮助我理解功能4的汇编代码的版本。这不是为了做作业,因为现在是夏天,课程已经结束,而是让我了解自己做错了什么的方法(而且我的教授不是最有用的)。

根据我收集到的信息,我知道将使炸弹爆炸的输入将是两个类型为'%d'的值。我还注意到,其中一个值必须等于或小于4。这是因为之前调用过的比较语句很少。从用户扫描的值减去了2的值,然后将其与2的值进行比较。如果它不小于或等于2,则不会跳过动臂线并且不会超过动臂线。 。因此,这意味着0xc(%rsp)中的值必须为4或以下。

我认为函数4应该执行某种类型的递归,但是我对正在发生的事情感到非常困惑。我非常确定该函数的输出应该与0x8(%rsp)中的其他输入值相同,因为该值与寄存器%eax中存储的值(func4的输出)进行了比较。

因此,我对函数4中到底发生了什么以及该问题的解决方案感到困惑。

Dump of assembler code for function phase_4:
   0x000000000040102e <+0>:     sub    $0x18,%rsp
   0x0000000000401032 <+4>:     lea    0xc(%rsp),%rcx
   0x0000000000401037 <+9>:     lea    0x8(%rsp),%rdx
   0x000000000040103c <+14>:    mov    $0x402819,%esi
   0x0000000000401041 <+19>:    mov    $0x0,%eax
   0x0000000000401046 <+24>:    callq  0x400c10 <__isoc99_sscanf@plt>
   0x000000000040104b <+29>:    cmp    $0x2,%eax
   0x000000000040104e <+32>:    jne    0x40105c <phase_4+46>
   0x0000000000401050 <+34>:    mov    0xc(%rsp),%eax
   0x0000000000401054 <+38>:    sub    $0x2,%eax
   0x0000000000401057 <+41>:    cmp    $0x2,%eax
   0x000000000040105a <+44>:    jbe    0x401061 <phase_4+51>
   0x000000000040105c <+46>:    callq  0x401544 <boom>
   0x0000000000401061 <+51>:    mov    0xc(%rsp),%esi
   0x0000000000401065 <+55>:    mov    $0x5,%edi
   0x000000000040106a <+60>:    callq  0x400ff6 <func4>
   0x000000000040106f <+65>:    cmp    0x8(%rsp),%eax
   0x0000000000401073 <+69>:    je     0x40107a <phase_4+76>
   0x0000000000401075 <+71>:    callq  0x401544 <boom>
   0x000000000040107a <+76>:    add    $0x18,%rsp
   0x000000000040107e <+80>:    retq

Dump of assembler code for function func4:
   0x0000000000400ff6 <+0>:     push   %r12
   0x0000000000400ff8 <+2>:     push   %rbp
   0x0000000000400ff9 <+3>:     push   %rbx
   0x0000000000400ffa <+4>:     mov    %edi,%ebx
   0x0000000000400ffc <+6>:     test   %edi,%edi
   0x0000000000400ffe <+8>:     jle    0x401024 <func4+46>
   0x0000000000401000 <+10>:    mov    %esi,%ebp
   0x0000000000401002 <+12>:    mov    %esi,%eax
   0x0000000000401004 <+14>:    cmp    $0x1,%edi
   0x0000000000401007 <+17>:    je     0x401029 <func4+51>
   0x0000000000401009 <+19>:    lea    -0x1(%rdi),%edi
   0x000000000040100c <+22>:    callq  0x400ff6 <func4>
   0x0000000000401011 <+27>:    lea    (%rax,%rbp,1),%r12d
   0x0000000000401015 <+31>:    lea    -0x2(%rbx),%edi
   0x0000000000401018 <+34>:    mov    %ebp,%esi
   0x000000000040101a <+36>:    callq  0x400ff6 <func4>
   0x000000000040101f <+41>:    add    %r12d,%eax
   0x0000000000401022 <+44>:    jmp    0x401029 <func4+51>
   0x0000000000401024 <+46>:    mov    $0x0,%eax
   0x0000000000401029 <+51>:    pop    %rbx
   0x000000000040102a <+52>:    pop    %rbp
   0x000000000040102b <+53>:    pop    %r12
   0x000000000040102d <+55>:    retq

预先感谢您的帮助!我轻轻松松地完成了前三个阶段,所以我想知道我在哪里出错了!

编辑:

更多地查看了代码之后,我相信这可能是对类似于斐波那契序列的某种表达。函数4返回两次,一次返回值减一,第二次返回值减二。 (x-1)+(x-2)类型的情况(因为添加了这些值然后返回。)

我仍然对应该如何编造可以使炸弹消散的价值感到困惑。

0 个答案:

没有答案