2014-10-18 67 views
-3

希望你能帮助我了解如何找出六个数字。曾尝试过几组数字,我认为是正确的,但猜测我不理解它的权利。了解炸弹实验室

因此,对于第一个,我正在寻找的这六个数字,是不是数字是我为了适应代码而输入的结果或数字?

我必须通过所有的代码或只有几行我可以找出这些数字吗?开始认为我在想这件事,那么找到这些数字,然后尝试我的方法就容易多了。

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 
+0

目前尚不清楚,不管你是问接通。 – chbaker0 2014-10-18 00:07:52

+0

六个数字是什么? – Degustaf 2014-10-18 00:08:57

+0

我在一个ssh中使用gdb,我试图找到正确的6个数字,所以我的炸弹不会被打击,我应该从这个汇编代码中找出这6个数字。 如果不清楚,我很抱歉,但我试图自己理解它,并且一直坚持了两天它的工作原理。 – user3399655 2014-10-18 00:12:23

回答

3

@ user3399655,你只需要阅读函数反汇编,并理解它的作用。当你理解它时,你将需要输入的六个数字是清楚的。

  1. 首先,你知道是什么在拆卸每个指令呢? (PUSH,SUB,LEA,MOV,CALL,CMP ...)如果没有,请在Intel's Developer Manuals中查找您不认识的人。你需要手册2A-C。如果您不明白指令的定义,请在此处询问具体的问题。

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

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

  4. 好的,另一个提示。一个if块通常转换为条件跳转,如果条件为false,则跳转超过块的内容。如果条件为真,则不会跳转,并且直到块的内容。 (这是否有意义?如果需要,可以考虑一分钟。)如果结束循环的条件未满足,则循环转换为跳转的条件跳转。

  5. 循环有一个索引变量。你能看到索引变量保存在哪个寄存器中吗?你能说出它是升高还是降低?在循环终止之前它有多远?

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

+0

+1不用勺子喂他 – Leeor 2014-10-19 19:45:43

+0

谢谢你给我时间来回答我的一些信息:) – user3399655 2014-10-19 20:24:09

+0

@ user3399655,回应你所说的,循环变量不在EAX中。它是一个寄存器,它在循环开始时被初始化,在每次迭代时被添加到一次,并且用于CMP/JNE,当不满足终止条件时跳转到循环的开始。关于数字保存在堆栈中的位置,请尝试在'gdb'中输入“1 2 3 4 5 6”,'x/40w $ esp'(在'read_six_numbers'返回之后),然后查找这些数字。从'* $ esp'查看它们存储的偏移量(以字节为单位)。 – 2014-10-20 03:41:52

0

谢谢你给我时间回答我Alex D的一些信息:)这是很长的时间来评论你的答案。

  1. I'm理解其中大部分指令的一样。我现在知道cmp是我必须注意的重要部分。

  2. 我想我知道一些关于调用堆栈。

  3. 我应该知道如果其他和在C被转换成汇编。

  4. 我一直在用gdb监视它是如何通过循环(跳转),现在跳到5跳,并停在第6跳,所以我认为我越来越近了。

  5. 想象一下,如果我正在观看gdb,它的EAX会越来越高。

  6. 不要以为我能说出来。

再次谢谢你给的时间发表意见回来,认为这将是更容易的灯光时,在我的脑海:)