炸弹实验室第 4 阶段遇到问题
having trouble with bomb lab phase 4
我真的很难理解在这里做什么。我认为我可以使用的数字之一是 85,但我似乎错了。我知道我应该只得到 2 位小数,但我似乎做不到。非常感谢您的帮助。
phase_4
Dump of assembler code for function phase_4:
0x08048cd1 <+0>: push %ebp
0x08048cd2 <+1>: mov %esp,%ebp
0x08048cd4 <+3>: sub [=10=]x28,%esp
0x08048cd7 <+6>: lea -0xc(%ebp),%eax
0x08048cda <+9>: mov %eax,0xc(%esp)
0x08048cde <+13>: lea -0x10(%ebp),%eax
0x08048ce1 <+16>: mov %eax,0x8(%esp)
0x08048ce5 <+20>: movl [=10=]x804a5d7,0x4(%esp)
0x08048ced <+28>: mov 0x8(%ebp),%eax
0x08048cf0 <+31>: mov %eax,(%esp)
0x08048cf3 <+34>: call 0x8048860 <__isoc99_sscanf@plt>
0x08048cf8 <+39>: cmp [=10=]x2,%eax
0x08048cfb <+42>: jne 0x8048d03 <phase_4+50>
0x08048cfd <+44>: cmpl [=10=]xe,-0x10(%ebp)
0x08048d01 <+48>: jbe 0x8048d08 <phase_4+55>
0x08048d03 <+50>: call 0x80491d7 <explode_bomb>
0x08048d08 <+55>: movl [=10=]xe,0x8(%esp)
0x08048d10 <+63>: movl [=10=]x0,0x4(%esp)
0x08048d18 <+71>: mov -0x10(%ebp),%eax
0x08048d1b <+74>: mov %eax,(%esp)
0x08048d1e <+77>: call 0x8048c80 <func4>
0x08048d23 <+82>: test %eax,%eax
0x08048d25 <+84>: jne 0x8048d2d <phase_4+92>
0x08048d27 <+86>: cmpl [=10=]x0,-0xc(%ebp)
0x08048d2b <+90>: je 0x8048d32 <phase_4+97>
0x08048d2d <+92>: call 0x80491d7 <explode_bomb>
0x08048d32 <+97>: leave
0x08048d33 <+98>: ret
函数 4:
Dump of assembler code for function func4:
0x08048c80 <+0>: push %ebp
0x08048c81 <+1>: mov %esp,%ebp
0x08048c83 <+3>: sub [=11=]x18,%esp
0x08048c86 <+6>: mov 0x8(%ebp),%edx
0x08048c89 <+9>: mov 0xc(%ebp),%eax
0x08048c8c <+12>: mov 0x10(%ebp),%ecx
0x08048c8f <+15>: sub %eax,%ecx
0x08048c91 <+17>: shr %ecx
0x08048c93 <+19>: add %eax,%ecx
0x08048c95 <+21>: cmp %edx,%ecx
0x08048c97 <+23>: jbe 0x8048cae <func4+46>
0x08048c99 <+25>: dec %ecx
0x08048c9a <+26>: mov %ecx,0x8(%esp)
0x08048c9e <+30>: mov %eax,0x4(%esp)
0x08048ca2 <+34>: mov %edx,(%esp)
0x08048ca5 <+37>: call 0x8048c80 <func4>
0x08048caa <+42>: add %eax,%eax
0x08048cac <+44>: jmp 0x8048ccf <func4+79>
0x08048cae <+46>: mov [=11=]x0,%eax
0x08048cb3 <+51>: cmp %edx,%ecx
0x08048cb5 <+53>: jae 0x8048ccf <func4+79>
0x08048cb7 <+55>: mov 0x10(%ebp),%eax
0x08048cba <+58>: mov %eax,0x8(%esp)
0x08048cbe <+62>: inc %ecx
0x08048cbf <+63>: mov %ecx,0x4(%esp)
0x08048cc3 <+67>: mov %edx,(%esp)
0x08048cc6 <+70>: call 0x8048c80 <func4>
0x08048ccb <+75>: lea 0x1(%eax,%eax,1),%eax
0x08048ccf <+79>: leave
0x08048cd0 <+80>: ret
显然第二个数字必须为零,因为这是代码在 0x08048d27
.
处检查的内容
必须选择第一个数字,使 func4
的 return 值也为零(参见 0x08048d23
)。如果您查看 func4
,您会发现它是一个二进制搜索(explanation 的类似代码)。找到该项目后,它 return 为零。否则如果落入下半部,则returns2*func4()
。最后如果在上半区,则returns 2*func4()+1
。
鉴于在这种情况下结果必须为零,这意味着必须在仅遍历较低范围时找到数字,否则 +1
会潜入结果中。零本身是一个微不足道的解决方案,因为它肯定会在底部找到。
为了完整起见,这里是其他可能性的演练。第一个猜测将是 [0, 14]
范围内的中点,即 7
。对于下一步,我们知道数字必须小于 7
才能获得范围 [0, 6]
,这意味着中点 3
。同样,下一个范围是 [0, 2]
,中点 1
。最后我们得到了 [0, 0]
,这个微不足道的结果。
TL;DR:可能的输入是 0 0
、1 0
、3 0
和 7 0
。
由于有其他预期结果的版本,这里有一些额外的帮助:return 值实际上从最低有效位开始以二进制拼写出低-高选项。在上面的例子中,我们有所有 0
位,所以都是低选择。假设我们有一个 4
的结果,即二进制的 100
。从右边看,这意味着我们需要一个较低的、另一个较低的和最终的较高的递归。按照范围,这些映射到 [0, 6]
、[0, 2]
和 [2, 2]
。所以在这种情况下 2
将是解决方案。
我真的很难理解在这里做什么。我认为我可以使用的数字之一是 85,但我似乎错了。我知道我应该只得到 2 位小数,但我似乎做不到。非常感谢您的帮助。
phase_4
Dump of assembler code for function phase_4:
0x08048cd1 <+0>: push %ebp
0x08048cd2 <+1>: mov %esp,%ebp
0x08048cd4 <+3>: sub [=10=]x28,%esp
0x08048cd7 <+6>: lea -0xc(%ebp),%eax
0x08048cda <+9>: mov %eax,0xc(%esp)
0x08048cde <+13>: lea -0x10(%ebp),%eax
0x08048ce1 <+16>: mov %eax,0x8(%esp)
0x08048ce5 <+20>: movl [=10=]x804a5d7,0x4(%esp)
0x08048ced <+28>: mov 0x8(%ebp),%eax
0x08048cf0 <+31>: mov %eax,(%esp)
0x08048cf3 <+34>: call 0x8048860 <__isoc99_sscanf@plt>
0x08048cf8 <+39>: cmp [=10=]x2,%eax
0x08048cfb <+42>: jne 0x8048d03 <phase_4+50>
0x08048cfd <+44>: cmpl [=10=]xe,-0x10(%ebp)
0x08048d01 <+48>: jbe 0x8048d08 <phase_4+55>
0x08048d03 <+50>: call 0x80491d7 <explode_bomb>
0x08048d08 <+55>: movl [=10=]xe,0x8(%esp)
0x08048d10 <+63>: movl [=10=]x0,0x4(%esp)
0x08048d18 <+71>: mov -0x10(%ebp),%eax
0x08048d1b <+74>: mov %eax,(%esp)
0x08048d1e <+77>: call 0x8048c80 <func4>
0x08048d23 <+82>: test %eax,%eax
0x08048d25 <+84>: jne 0x8048d2d <phase_4+92>
0x08048d27 <+86>: cmpl [=10=]x0,-0xc(%ebp)
0x08048d2b <+90>: je 0x8048d32 <phase_4+97>
0x08048d2d <+92>: call 0x80491d7 <explode_bomb>
0x08048d32 <+97>: leave
0x08048d33 <+98>: ret
函数 4:
Dump of assembler code for function func4:
0x08048c80 <+0>: push %ebp
0x08048c81 <+1>: mov %esp,%ebp
0x08048c83 <+3>: sub [=11=]x18,%esp
0x08048c86 <+6>: mov 0x8(%ebp),%edx
0x08048c89 <+9>: mov 0xc(%ebp),%eax
0x08048c8c <+12>: mov 0x10(%ebp),%ecx
0x08048c8f <+15>: sub %eax,%ecx
0x08048c91 <+17>: shr %ecx
0x08048c93 <+19>: add %eax,%ecx
0x08048c95 <+21>: cmp %edx,%ecx
0x08048c97 <+23>: jbe 0x8048cae <func4+46>
0x08048c99 <+25>: dec %ecx
0x08048c9a <+26>: mov %ecx,0x8(%esp)
0x08048c9e <+30>: mov %eax,0x4(%esp)
0x08048ca2 <+34>: mov %edx,(%esp)
0x08048ca5 <+37>: call 0x8048c80 <func4>
0x08048caa <+42>: add %eax,%eax
0x08048cac <+44>: jmp 0x8048ccf <func4+79>
0x08048cae <+46>: mov [=11=]x0,%eax
0x08048cb3 <+51>: cmp %edx,%ecx
0x08048cb5 <+53>: jae 0x8048ccf <func4+79>
0x08048cb7 <+55>: mov 0x10(%ebp),%eax
0x08048cba <+58>: mov %eax,0x8(%esp)
0x08048cbe <+62>: inc %ecx
0x08048cbf <+63>: mov %ecx,0x4(%esp)
0x08048cc3 <+67>: mov %edx,(%esp)
0x08048cc6 <+70>: call 0x8048c80 <func4>
0x08048ccb <+75>: lea 0x1(%eax,%eax,1),%eax
0x08048ccf <+79>: leave
0x08048cd0 <+80>: ret
显然第二个数字必须为零,因为这是代码在 0x08048d27
.
必须选择第一个数字,使 func4
的 return 值也为零(参见 0x08048d23
)。如果您查看 func4
,您会发现它是一个二进制搜索(explanation 的类似代码)。找到该项目后,它 return 为零。否则如果落入下半部,则returns2*func4()
。最后如果在上半区,则returns 2*func4()+1
。
鉴于在这种情况下结果必须为零,这意味着必须在仅遍历较低范围时找到数字,否则 +1
会潜入结果中。零本身是一个微不足道的解决方案,因为它肯定会在底部找到。
为了完整起见,这里是其他可能性的演练。第一个猜测将是 [0, 14]
范围内的中点,即 7
。对于下一步,我们知道数字必须小于 7
才能获得范围 [0, 6]
,这意味着中点 3
。同样,下一个范围是 [0, 2]
,中点 1
。最后我们得到了 [0, 0]
,这个微不足道的结果。
TL;DR:可能的输入是 0 0
、1 0
、3 0
和 7 0
。
由于有其他预期结果的版本,这里有一些额外的帮助:return 值实际上从最低有效位开始以二进制拼写出低-高选项。在上面的例子中,我们有所有 0
位,所以都是低选择。假设我们有一个 4
的结果,即二进制的 100
。从右边看,这意味着我们需要一个较低的、另一个较低的和最终的较高的递归。按照范围,这些映射到 [0, 6]
、[0, 2]
和 [2, 2]
。所以在这种情况下 2
将是解决方案。