二进制炸弹第4阶段 - 无法搞清楚

时间:2014-03-04 17:06:24

标签: assembly x86 reverse-engineering

请帮助,我已经看了一遍,我似乎无法找到任何东西。

    Dump of assembler code for function phase_4:
   0x08048d81 <+0>: push   %ebp
   0x08048d82 <+1>: mov    %esp,%ebp
   0x08048d84 <+3>: sub    $0x28,%esp
   0x08048d87 <+6>: lea    -0xc(%ebp),%eax
   0x08048d8a <+9>: mov    %eax,0x8(%esp)
   0x08048d8e <+13>:    movl   $0x8049a68,0x4(%esp)
   0x08048d96 <+21>:    mov    0x8(%ebp),%eax
   0x08048d99 <+24>:    mov    %eax,(%esp)
   0x08048d9c <+27>:    call   0x8048788 <__isoc99_sscanf@plt>
   0x08048da1 <+32>:    cmp    $0x1,%eax
   0x08048da4 <+35>:    jne    0x8048dac <phase_4+43>
   0x08048da6 <+37>:    cmpl   $0x0,-0xc(%ebp)
   0x08048daa <+41>:    jg     0x8048db1 <phase_4+48>
   0x08048dac <+43>:    call   0x8049236 <explode_bomb>
   0x08048db1 <+48>:    mov    -0xc(%ebp),%eax
   0x08048db4 <+51>:    mov    %eax,(%esp)
   0x08048db7 <+54>:    call   0x8048b50 <func4>
   0x08048dbc <+59>:    cmp    $0x262,%eax
   0x08048dc1 <+64>:    je     0x8048dc8 <phase_4+71>
   0x08048dc3 <+66>:    call   0x8049236 <explode_bomb>
   0x08048dc8 <+71>:    leave  
   0x08048dc9 <+72>:    ret   






 Dump of assembler code for function func4:
   0x08048b50 <+0>: push   %ebp
   0x08048b51 <+1>: mov    %esp,%ebp
   0x08048b53 <+3>: sub    $0x18,%esp
   0x08048b56 <+6>: mov    %ebx,-0x8(%ebp)
   0x08048b59 <+9>: mov    %esi,-0x4(%ebp)
   0x08048b5c <+12>:    mov    0x8(%ebp),%ebx
   0x08048b5f <+15>:    mov    $0x1,%eax
   0x08048b64 <+20>:    cmp    $0x1,%ebx
   0x08048b67 <+23>:    jle    0x8048b83 <func4+51>
   0x08048b69 <+25>:    lea    -0x1(%ebx),%eax
   0x08048b6c <+28>:    mov    %eax,(%esp)
   0x08048b6f <+31>:    call   0x8048b50 <func4>
   0x08048b74 <+36>:    mov    %eax,%esi
   0x08048b76 <+38>:    sub    $0x2,%ebx
   0x08048b79 <+41>:    mov    %ebx,(%esp)
   0x08048b7c <+44>:    call   0x8048b50 <func4>
   0x08048b81 <+49>:    add    %esi,%eax
   0x08048b83 <+51>:    mov    -0x8(%ebp),%ebx
   0x08048b86 <+54>:    mov    -0x4(%ebp),%esi
   0x08048b89 <+57>:    mov    %ebp,%esp
   0x08048b8b <+59>:    pop    %ebp
   0x08048b8c <+60>:    ret  

我一直在想有两个数字,其中一个是610,因为0x08048dbc&lt; + 59&gt;:cmp $ 0x262,%eax,0x262是610.

1 个答案:

答案 0 :(得分:0)

如果查看传递给sscanf的格式字符串,您很可能会看到一个%d指令。行+32检查sscanf正好读取1个数字,否则炸弹会爆炸。

+59正在检查func4610的返回值,因此您需要确定要提供的func4号码,以便610回来。

不要过多地告诉你,func4是一个众所周知的序列的简单递归实现。您应该能够从汇编代码中找到递归公式,然后您可能会认出它。