我试图破译这个汇编代码的功能。我知道它读取六个整数来解锁下一个级别。
0x08048c24 <+0>: push %esi
0x08048c25 <+1>: push %ebx
0x08048c26 <+2>: sub $0x34,%esp
我认为前三行只是初衷。
0x08048c29 <+5>: lea 0x18(%esp),%eax
0x08048c2d <+9>: mov %eax,0x4(%esp)
0x08048c31 <+13>: mov 0x40(%esp),%eax
0x08048c35 <+17>: mov %eax,(%esp)
0x08048c38 <+20>: call 0x80493b4 <read_six_numbers>
0x08048c3d <+25>: cmpl $0x0,0x18(%esp)
0x08048c42 <+30>: jne 0x8048c4b <phase_2+39>
0x08048c44 <+32>: cmpl $0x1,0x1c(%esp)
0x08048c49 <+37>: je 0x8048c6a <phase_2+70>
我认为这会比较第一个数字和第一个输入是否相等,如果不相等,则跳转到+39上的explode_bomb函数。然后它将下一个输入数字与第二个数字进行比较,如果它们相等(匹配),则跳过explode_bomb函数。
0x08048c4b <+39>: call 0x8049375 <explode_bomb>
0x08048c50 <+44>: jmp 0x8048c6a <phase_2+70>
0x08048c52 <+46>: mov -0x8(%ebx),%eax
0x08048c55 <+49>: add -0x4(%ebx),%eax
0x08048c58 <+52>: cmp %eax,(%ebx)
0x08048c5a <+54>: je 0x8048c61 <phase_2+61>
0x08048c5c <+56>: call 0x8049375 <explode_bomb>
0x08048c61 <+61>: add $0x4,%ebx
0x08048c64 <+64>: cmp %esi,%ebx
0x08048c66 <+66>: jne 0x8048c52 <phase_2+46>
0x08048c68 <+68>: jmp 0x8048c74 <phase_2+80>
0x08048c6a <+70>: lea 0x20(%esp),%ebx
0x08048c6e <+74>: lea 0x30(%esp),%esi
0x08048c72 <+78>: jmp 0x8048c52 <phase_2+46>
0x08048c74 <+80>: add $0x34,%esp
0x08048c77 <+83>: pop %ebx
0x08048c78 <+84>: pop %esi
0x08048c79 <+85>: ret
除此之外,我很困惑,并且很难跟进它的作用,检查六个数字以解锁阶段。任何专业知识将不胜感激。感谢
答案 0 :(得分:1)
我认为这会比较第一个数字和第一个输入是否相等
我不明白你想在那里说些什么。什么是first number
?
无论如何,cmpl $0x0,0x18(%esp)
清楚地检查第一个输入是否为零,同样cmpl $0x1,0x1c(%esp)
检查第二个输入是否为。
之后你有一个测试所有后续数字的循环。相关代码是:
0x08048c52 <+46>: mov -0x8(%ebx),%eax
0x08048c55 <+49>: add -0x4(%ebx),%eax
0x08048c58 <+52>: cmp %eax,(%ebx)
ebx
持有指向当前数组项的指针,因此-0x4(%ebx)
是前一个元素,-0x8(%ebx)
是之前的元素。因此,不难发现它基本上是if (array[i-2] + array[i-1] != array[i]) explode_bomb();
。
这个公式看起来应该很熟悉,它是一个众所周知的序列。但即使没有认识到这一点,考虑到前两个数字,找出其余数据是一项简单的任务。