【问题标题】:Understanding bomb lab了解炸弹实验室
【发布时间】:2014-10-18 00:05:08
【问题描述】:

希望您能帮助我了解如何找出这六个数字。尝试了几组我认为是正确的数字,但我猜我理解不正确。

首先,我正在寻找的这六个数字,是不是作为结果的数字或我输入以适合代码的数字?

我是否必须浏览所有代码,或者只有几行代码可以找出这些数字?开始认为我想多了,找到这些数字比我尝试的方法容易得多。

08048b74 <phase_2>:
 8048b74:       53                      push   %ebx
 8048b75:       83 ec 38                sub    $0x38,%esp
 8048b78:       8d 44 24 18             lea    0x18(%esp),%eax
 8048b7c:       89 44 24 04             mov    %eax,0x4(%esp)
 8048b80:       8b 44 24 40             mov    0x40(%esp),%eax
 8048b84:       89 04 24                mov    %eax,(%esp)
 8048b87:       e8 28 07 00 00          call   80492b4 <read_six_numbers>
 8048b8c:       83 7c 24 18 00          cmpl   $0x0,0x18(%esp)
 8048b91:       79 22                   jns    8048bb5 <phase_2+0x41>
 8048b93:       e8 dd 06 00 00          call   8049275 <explode_bomb>
 8048b98:       eb 1b                   jmp    8048bb5 <phase_2+0x41>
 8048b9a:       89 d8                   mov    %ebx,%eax
 8048b9c:       03 44 9c 14             add    0x14(%esp,%ebx,4),%eax
 8048ba0:       39 44 9c 18             cmp    %eax,0x18(%esp,%ebx,4)
 8048ba4:       74 05                   je     8048bab <phase_2+0x37>
 8048ba6:       e8 ca 06 00 00          call   8049275 <explode_bomb>
 8048bab:       83 c3 01                add    $0x1,%ebx
 8048bae:       83 fb 06                cmp    $0x6,%ebx
 8048bb1:       75 e7                   jne    8048b9a <phase_2+0x26>
 8048bb3:       eb 07                   jmp    8048bbc <phase_2+0x48>
 8048bb5:       bb 01 00 00 00          mov    $0x1,%ebx
 8048bba:       eb de                   jmp    8048b9a <phase_2+0x26>
 8048bbc:       83 c4 38                add    $0x38,%esp
 8048bbf:       5b                      pop    %ebx
 8048bc0:       c3                      ret

【问题讨论】:

  • 不清楚你在问什么。
  • 我在 ssh 中使用 gdb,我试图找到正确的 6 个数字,这样我的炸弹就不会爆炸,我应该从这个汇编代码中找到这 6 个数字。如果不清楚,我很抱歉,但我正在尝试自己理解它,并且已经坚持了 2 天它是如何工作的。
  • 这不是很多代码。是的,您应该尝试弄清楚它在做什么。重要的部分在8048b9a。使用反汇编旁边的伪代码或 C 代码更新您的问题。请注意,以下阶段会更难,所以请尝试学习。

标签: assembly x86


【解决方案1】:

@user3399655,你只需要阅读函数反汇编并了解它的作用。明白了,你需要输入的六个数字是什么就一目了然了。

  1. 首先,您知道反汇编中的每条指令的作用吗? (PUSH、SUB、LEA、MOV、CALL、CMP...)如果没有,请在Intel's Developer Manuals 中查找您不知道的那些。您需要手册 2A-C。如果您不理解指令的定义,请在此处提出具体问题。

  2. 您了解调用堆栈的概念吗?你知道堆栈上的变量空间是如何分配的,以及它们是如何在汇编中访问的吗?否则,您将无法理解此功能。

  3. 你知道像if...elsefor(;;) 这样的C 控制结构是如何翻译成汇编的吗?尝试打印出您发布的反汇编,并绘制箭头显示每个条件/无条件跳转指令的位置。作为提示,该函数看起来有 2 个 if 块和一个循环。你能看出哪些跳转是哪个控制结构的一部分吗?

  4. 好的,另一个提示。 if 块通常转换为条件跳转,如果条件为 false,则跳转块的内容。如果条件为真,则不进行跳转,直接跳转到块的内容。 (这样有意义吗?如果需要,请考虑一下。)循环转换为条件跳转,如果不满足结束循环的条件,则向后跳转。

    李>
  5. 循环只有一个索引变量。你能看到索引变量保存在哪个寄存器中吗?你能判断它是上升还是下降?在循环终止之前它走了多远?

  6. 你能告诉phase_2的堆栈帧中6个数字将被保存在哪里吗?每个字节使用多少字节?如果需要,您可以尝试阅读 read_six_numbers 的代码。或者只是在调试器中运行代码,然后查看堆栈。

【讨论】:

  • 感谢您抽出时间回复我一些信息 :)
  • @user3399655,针对您所说的,循环变量未保存在 EAX 中。它是一个在循环开始时初始化的寄存器,在每次迭代中添加一次,用于在不满足终止条件时跳转到循环开头的 CMP/JNE。关于数字在堆栈中的保存位置,尝试在gdb 中输入“1 2 3 4 5 6”、x/40w $esp(在read_six_numbers 返回之后),然后查找这些数字。查看它们存储位置与*$esp 的偏移量(以字节为单位)。
  • 这很重要,因为 6 个数字作为数组存储在堆栈上,代码使用相对于$esp 的地址来访问它们。如果您知道它们相对于$esp 的位置,您可能能够找出在每次循环迭代中访问数组的哪些元素。
【解决方案2】:

感谢您抽出时间回复我 Alex D 提供的一些信息 :) 对您的回答发表评论太久了。

  1. 我理解这些指令中的大部分内容。我现在知道 cmp 是我必须注意的重要部分。

  2. 我想我对调用堆栈有所了解。

  3. 我应该知道 C 中的 if else 和 for 是如何翻译成汇编的。

  4. 我一直在 gdb 中使用 stepping 观察它如何通过循环(跳跃),现在已经跳了 5 次,在第 6 次停止,所以我想我越来越近了。

  5. 如果我在看 gdb,认为它是 EAX,它会随着步进而变得更高。

  6. 别以为我能说出来。

再次感谢您抽出时间回复评论,我想当我脑子里的灯亮起时会容易得多:)

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 2015-09-07
    • 2017-03-04
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2020-09-27
    相关资源
    最近更新 更多