二进制炸弹第五阶段问题(我的第五阶段似乎与所有人都不一样)
所以我正在做一个二进制炸弹任务,并且陷入了僵局。 试着看看其他问题和指南,但我的看法与我在网上找到的其他问题和指南中描述的完全不同。
该阶段仅需要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>
)。 第二个输入数字应该等于访问的数组项的总和。
上一篇: Binary Bomb Phase 5 issue (my phase 5 seems to be different from everyone elses)