二进制炸弹第五阶段问题(我的第五阶段似乎与所有人都不一样)

所以我正在做一个二进制炸弹任务,并且陷入了僵局。 试着看看其他问题和指南,但我的看法与我在网上找到的其他问题和指南中描述的完全不同。

该阶段仅需要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 <+75>:mov $ 0x8049960,%ebx

我用了

x / 16b 0x8049960

gdb,它告诉我

0x8049960 array.2954:10 0 0 0 2 0 0 0

0x8049968 array.2954 + 8:14 0 0 0 7 0 00

当我使用该程序时,直到我到达

0x08048d31 <+101>:cmp -0x10(%ebp),%ecx

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

因为82!= 2它只是叫爆炸炸弹。

根据我的理解,它正在阅读我的两个数字,确保我在<+41>处输入了2。 然后它抓取数组中的第一个数字,在这种情况下是10,并将其放入$ eax中+ = <+ 51>。 然后它将eax放在-0xc($ ebp)+ 57。

然后检查以确保$ eax在<+60>处不是15,继续设置$ ecx,并将$ edx设置为0.然后它将指针传递给数组$ ebx(<+75>)。

然后进入从<+80>到<+91>的循环,但我不确定它在做什么。 我得到它将$ edx增加1,当$ eax为15时退出循环,但我无法弄清楚剩下的东西是如何工作的。

我是否正确地理解了循环部分? 而且,如果有人不介意解释<+80>和<+91>之间发生的事情,我会非常感激。

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


然后它抓取数组中的第一个数字,在这种情况下是10,并将其放入$ eax中+ = <+ 51>。

错误。 <+51>读取您输入的第一个数字,而不是数组中的第一个数字。 然后通过丢弃最高位将其屏蔽到0..15范围内,并将其写回到它所来自的局部变量。 当然,它也以eax

该数组包含4个字节的整数,其中有15个。 因此,您可以使用x/15wd进行打印。

现在到循环。 edx显然只是跟踪迭代计数,在那里并不令人意外。 <+83>是一个有趣的部分:它用索引eax当前拥有的数组项的值替换eax 。 那就是eax = array[eax]ecx当然只是总结你所访问的数组元素,这很容易。 退出条件是当您点击数值为15的数组项时。

这一切都归结为这个数组真的是一个链表。 列表的末尾用15标记。输入的第一个数字用作列表遍历的起点。 它应该被选中,直到列表的末尾有11个元素(见<+96> )。 第二个输入数字应该等于访问的数组项的总和。

链接地址: http://www.djcxy.com/p/43853.html

上一篇: Binary Bomb Phase 5 issue (my phase 5 seems to be different from everyone elses)

下一篇: Base pointer and stack pointer