了解炸弹实验室

时间:2014-10-18 00:05:08

标签: assembly x86

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

所以对于第一个,我正在寻找的这六个数字,不是数字是结果还是数字以适应代码?

我是否必须完成所有代码,或者只有几行我可以找到这些数字?开始认为我过度思考,找到那些数字然后我尝试的方式要容易得多。

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

2 个答案:

答案 0 :(得分:3)

@ user3399655,您只需阅读功能反汇编并了解其功能。当你理解它时,你将需要输入的六个数字是清楚的。

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

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

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

  4. 好的,另一个暗示。 if块通常转换为条件跳转,如果条件为 false ,则跳转 over 块的内容。如果条件为真,则它不进行跳转,并且进入块的内容。 (这有意义吗?如果需要,可以考虑一下。)如果不满足结束循环的条件,循环转换为向后跳的条件跳转

  5. 循环有一个索引变量。你能看到索引变量保存在哪个寄存器中吗?你能告诉它是否上升或下降?在循环终止之前它还能走多远?

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

答案 1 :(得分:0)

感谢您给我时间回答我Alex D的一些信息:)很长时间来回答您的回答。

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

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

  3. 我应该知道如果将其他内容和C中的内容翻译成汇编。

  4. 我一直在gdb中观察它是如何通过循环(跳跃)进行的,并且现在已经达到5次跳跃并且停在第6次跳跃,所以我认为我越来越近了。

  5. 如果我正在观看gdb,那就认为它是EAX,它随着步进越来越高。

  6. 别以为我能说出来。

  7. 再次感谢您给予时间回复评论,认为当我的脑袋里的灯亮起时会更容易:)