2014-09-19 119 views
-1

我想破譯這個彙編代碼的功能。我知道它讀取六個整數來解鎖下一個關卡。閱讀彙編代碼

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> 

我覺得這個比較,在第一號和第一個輸入是平等的,如果不是,則跳轉到explode_bomb功能上+39。然後比較下一個輸入號碼和第二個號碼,如果它們相等(匹配),則跳過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

我覺得這比當第一個號碼和第一輸入相等

我不明白你想說那裏。什麼是first number

無論如何,cmpl $0x0,0x18(%esp)明確檢查第一個輸入爲零,並且類似地cmpl $0x1,0x1c(%esp)檢查第二個是1。

然後你有一個循環,測試所有後續的數字。相關的代碼是:

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

公式應該看起來很熟悉,它是一個衆所周知的序列。但即使沒有認識到,給出前兩個數字,找出其餘的是一件簡單的事情。