阅读汇编代码

时间:2014-09-19 17:28:14

标签: assembly binary

我试图破译这个汇编代码的功能。我知道它读取六个整数来解锁下一个级别。

   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

除此之外,我很困惑,并且很难跟进它的作用,检查六个数字以解锁阶段。任何专业知识将不胜感激。感谢

1 个答案:

答案 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();

这个公式看起来应该很熟悉,它是一个众所周知的序列。但即使没有认识到这一点,考虑到前两个数字,找出其余数据是一项简单的任务。