【问题标题】:having trouble with bomb lab phase 4 [closed]炸弹实验室第 4 阶段遇到问题 [关闭]
【发布时间】:2023-03-07 23:34:01
【问题描述】:

我很难理解在这里做什么。我以为我可以使用的数字之一将是 85,但似乎我错了。我知道我应该只得到 2 位小数,但我似乎做不到。非常感谢您的帮助。

阶段_4

Dump of assembler code for function phase_4:
0x08048cd1 <+0>:    push   %ebp
0x08048cd2 <+1>:    mov    %esp,%ebp
0x08048cd4 <+3>:    sub    $0x28,%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   $0x804a5d7,0x4(%esp)
0x08048ced <+28>:   mov    0x8(%ebp),%eax
0x08048cf0 <+31>:   mov    %eax,(%esp)
0x08048cf3 <+34>:   call   0x8048860 <__isoc99_sscanf@plt>
0x08048cf8 <+39>:   cmp    $0x2,%eax
0x08048cfb <+42>:   jne    0x8048d03 <phase_4+50>
0x08048cfd <+44>:   cmpl   $0xe,-0x10(%ebp)
0x08048d01 <+48>:   jbe    0x8048d08 <phase_4+55>
0x08048d03 <+50>:   call   0x80491d7 <explode_bomb>
0x08048d08 <+55>:   movl   $0xe,0x8(%esp)
0x08048d10 <+63>:   movl   $0x0,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   $0x0,-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    $0x18,%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    $0x0,%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   

【问题讨论】:

  • this question 的细微变化。如果这有足够的帮助,我会以重复的形式关闭。
  • 是的,这是迄今为止最有帮助的一个,但我很难找到开始使用它的初始值。

标签: assembly x86 reverse-engineering


【解决方案1】:

显然第二个数字必须为零,因为这是代码在 0x08048d27 处检查的内容。

必须选择第一个数字,使func4 的返回值也为零(请参阅0x08048d23)。如果你查看func4,你会发现它是一个二分搜索(explanation 这里有类似的代码)。找到该项目时,它返回零。否则,如果它落入下半部分,则返回2*func4()。最后,如果它在上半部分,则返回2*func4()+1

鉴于在这种情况下结果必须为零,这意味着必须在仅遍历较低范围时找到数字,否则+1 会潜入结果中。零本身是一个微不足道的解决方案,因为它肯定会在底部找到。

为了完整起见,这里是其他可能性的演练。第一个猜测将是[0, 14] 范围内的中点,即7。对于下一步,我们知道数字必须小于7 才能获得范围[0, 6],这意味着中点3。同样,下一个范围是[0, 2],中点为1。最后我们得到了[0, 0],这是微不足道的结果。

TL;DR:可能的输入是 0 01 03 07 0


由于有其他预期结果的版本,这里有一些额外的帮助:返回值实际上说明了二进制的低-高选择,从最低有效位开始。在上面的例子中,我们有所有0 位,所以都是低选择。假设我们有一个4 的结果,即二进制的100。从右边看,这意味着我们需要一个较低的、另一个较低的和一个最终的上层递归。按照范围,这些映射到[0, 6][0, 2][2, 2]。所以在这种情况下,2 将是解决方案。

【讨论】:

  • 太棒了,非常感谢,我在这方面度过了一段令人难以置信的沮丧时光,答案是 0 0。
  • @GunR 其他 3 个应该也能正常工作。
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2020-09-27
  • 2013-11-07
相关资源
最近更新 更多