【问题标题】:Binary Bomb Phase 5 issue (my phase 5 seems to be different from everyone elses)Binary Bomb Phase 5 问题(我的 Phase 5 似乎与其他人不同)
【发布时间】:2015-05-07 19:40:53
【问题描述】:

所以我正在做一个二元炸弹任务并且卡住了。尝试查看其他问题和指南,但我的似乎与我在网上找到的其他问题和指南中描述的完全不同。

该阶段只需要 2 个无符号整数作为输入。此处以 11 2 作为输入运行后在 gdb 中反汇编。

Dump of assembler code for function phase_5:
0x08048ccc <+0>:     push   %ebp
0x08048ccd <+1>:     mov    %esp,%ebp
0x08048ccf <+3>:     push   %esi
0x08048cd0 <+4>:     push   %ebx
=> 0x08048cd1 <+5>:     sub    $0x20,%esp
0x08048cd4 <+8>:     lea    -0x10(%ebp),%eax
0x08048cd7 <+11>:    mov    %eax,0xc(%esp)
0x08048cdb <+15>:    lea    -0xc(%ebp),%eax
0x08048cde <+18>:    mov    %eax,0x8(%esp)
0x08048ce2 <+22>:    movl   $0x8049b0a,0x4(%esp)
0x08048cea <+30>:    mov    0x8(%ebp),%eax
0x08048ced <+33>:    mov    %eax,(%esp)
0x08048cf0 <+36>:    call   0x8048788 <__isoc99_sscanf@plt>
0x08048cf5 <+41>:    cmp    $0x1,%eax
0x08048cf8 <+44>:    jg     0x8048cff <phase_5+51>
0x08048cfa <+46>:    call   0x80492b6 <explode_bomb>
0x08048cff <+51>:    mov    -0xc(%ebp),%eax
0x08048d02 <+54>:    and    $0xf,%eax
0x08048d05 <+57>:    mov    %eax,-0xc(%ebp)
0x08048d08 <+60>:    cmp    $0xf,%eax
0x08048d0b <+63>:    je     0x8048d36 <phase_5+106>
0x08048d0d <+65>:    mov    $0x0,%ecx
0x08048d12 <+70>:    mov    $0x0,%edx
0x08048d17 <+75>:    mov    $0x8049960,%ebx
0x08048d1c <+80>:    add    $0x1,%edx
0x08048d1f <+83>:    mov    (%ebx,%eax,4),%eax
0x08048d22 <+86>:    add    %eax,%ecx
0x08048d24 <+88>:    cmp    $0xf,%eax
0x08048d27 <+91>:    jne    0x8048d1c <phase_5+80>
0x08048d29 <+93>:    mov    %eax,-0xc(%ebp)
0x08048d2c <+96>:    cmp    $0xb,%edx
0x08048d2f <+99>:    jne    0x8048d36 <phase_5+106>
0x08048d31 <+101>:   cmp    -0x10(%ebp),%ecx
0x08048d34 <+104>:   je     0x8048d3b <phase_5+111>
0x08048d36 <+106>:   call   0x80492b6 <explode_bomb>
0x08048d3b <+111>:   add    $0x20,%esp
0x08048d3e <+114>:   pop    %ebx
0x08048d3f <+115>:   pop    %esi
0x08048d40 <+116>:   pop    %ebp
0x08048d41 <+117>:   ret

对于 0x08048d17 行:mov $0x8049960,%ebx

我用过

x/16b 0x8049960

gdb 它告诉我

0x8049960 数组.2954: 10 0 0 0 2 0 0 0

0x8049968 数组.2954+8: 14 0 0 0 7 0 00

当我完成程序时,直到我到达

0x08048d31 : cmp -0x10(%ebp),%ecx

%edx = 11、%ecx = 82 和 %ebp-0x10 = 2(使用 print 获取前两个的值和 x/d $ebp-0x10 的最后一个)

因为 82 != 2 它只是调用了 explode_bomb。

据我了解,它正在读取我的 2 个数字,确保我在 处输入了 2。 然后它从数组中获取第一个数字,在本例中为 10,并将其放入 $eax 的 += 处。然后在 处将 eax 放入 -0xc($ebp)。

然后它检查以确保在 处 $eax 不是 15,然后将 $ecx 和 $edx 设置为 0。然后在 处将指向数组的指针传递给 $ebx .

然后它进入一个从 到 的循环,但我不确定它到底在做什么。我知道它将 $edx 增加 1 并且当 $eax 为 15 时退出循环,但我不知道其余的东西是如何工作的。

我对循环部分的理解是否正确?而且,如果有人不介意解释 和 之间发生的事情,我将不胜感激。

附言对不起,如果我的格式是错误的。

【问题讨论】:

    标签: assembly x86


    【解决方案1】:

    然后它从数组中获取第一个数字,在这种情况下是 10 并在 += 处将其放入 $eax。

    错了。 &lt;+51&gt; 读取您输入的第一个数字,而不是数组中的第一个数字。然后通过丢弃最高位将其掩码到 0..15 范围内,并写回它来自的局部变量。当然,它也存在于eax

    数组包含 4 个字节的整数,共有 15 个。因此,您可以使用x/15wd 打印它。

    现在进入循环。 edx 显然只是在跟踪迭代次数,这并不奇怪。 &lt;+83&gt; 是有趣的部分:它将eax 替换为索引eax 当前持有的数组项的值。那是eax = array[eax]ecx 当然只是总结您访问过的数组元素,这又很容易。退出条件是当您点击值为 15 的数组项时。

    归根结底,这个数组实际上是一个链表。列表的末尾用 15 标记。您输入的第一个数字用作列表遍历的起点。应该选择它,以便在列表末尾有 11 个元素(请参阅&lt;+96&gt;)。第二个输入数字应该等于访问过的数组项的总和。

    【讨论】:

    • 感谢您的解释,在阅读您的更正后设法使其工作。
    • 对不起!我发现这个答案非常有帮助。但是,我还有一些问题。首先,掩码是指程序将对我们的第一个输入应用掩码,对吗?如果是这样为了让它能够遍历11个元素那么当我们进入第一个输入器时,我们也应该先用掩码计算它,对吗?其次,例如如果数组是[10, 2, 14, 7, 8, 12, 15, 11, 0, 4, 1, 13, 3, 9, 6, 5],那么为了让它遍历11元素并以 15 结束,我们必须从值为 3 的元素开始?如果我的问题不清楚,请告诉我。非常感谢!
    • 我计算的方式是 12 步而不是 11 步,但我可能会落后 1 步 :)
    猜你喜欢
    • 2019-02-27
    • 2013-01-16
    • 2018-08-01
    • 2015-06-15
    相关资源
    最近更新 更多