2014-02-11 49 views
2

我有以下的彙編代碼:組裝拼圖 - 二進制炸彈

0x08048d36 <+0>:  push %ebp 
0x08048d37 <+1>:  mov %esp,%ebp 
0x08048d39 <+3>:  push %esi 
0x08048d3a <+4>:  push %ebx 
0x08048d3b <+5>:  sub $0x20,%esp 
0x08048d3e <+8>:  lea -0x10(%ebp),%eax 
0x08048d41 <+11>: mov %eax,0xc(%esp) 
0x08048d45 <+15>: lea -0xc(%ebp),%eax 
0x08048d48 <+18>: mov %eax,0x8(%esp) 
0x08048d4c <+22>: movl $0x804a28a,0x4(%esp) 
0x08048d54 <+30>: mov 0x8(%ebp),%eax 
0x08048d57 <+33>: mov %eax,(%esp) 
0x08048d5a <+36>: call 0x8048758 <[email protected]> 
0x08048d5f <+41>: cmp $0x1,%eax 
0x08048d62 <+44>: jg  0x8048d69 <phase_5+51> 
0x08048d64 <+46>: call 0x80491a8 <explode_bomb> 
0x08048d69 <+51>: mov -0xc(%ebp),%eax 
0x08048d6c <+54>: and $0xf,%eax 
0x08048d6f <+57>: mov %eax,-0xc(%ebp) 
0x08048d72 <+60>: cmp $0xf,%eax 
0x08048d75 <+63>: je  0x8048da0 <phase_5+106> 
0x08048d77 <+65>: mov $0x0,%ecx 
0x08048d7c <+70>: mov $0x0,%edx 
0x08048d81 <+75>: mov $0x804a1e0,%ebx 
0x08048d86 <+80>: add $0x1,%edx 
0x08048d89 <+83>: mov (%ebx,%eax,4),%eax 
0x08048d8c <+86>: add %eax,%ecx 
0x08048d8e <+88>: cmp $0xf,%eax 
0x08048d91 <+91>: jne 0x8048d86 <phase_5+80> 
0x08048d93 <+93>: mov %eax,-0xc(%ebp) 
0x08048d96 <+96>: cmp $0xf,%edx 
0x08048d99 <+99>: jne 0x8048da0 <phase_5+106> 
0x08048d9b <+101>: cmp -0x10(%ebp),%ecx 
0x08048d9e <+104>: je  0x8048da5 <phase_5+111> 
0x08048da0 <+106>: call 0x80491a8 <explode_bomb> 
0x08048da5 <+111>: add $0x20,%esp 
0x08048da8 <+114>: pop %ebx 
0x08048da9 <+115>: pop %esi 
0x08048daa <+116>: pop %ebp 
0x08048dab <+117>: ret  

SCANF希望從用戶的兩個數字。行< +75>中引用的地址$ 0x804a1e0似乎引用了一個數組。當我獲得該數組的值時,我得到:

(gdb) x/15dw 0x804a1e0 
0x804a1e0 <array.2985>: 10  2  14  7 
0x804a1f0 <array.2985+16>:  8  12  15  11 
0x804a200 <array.2985+32>:  0  4  1  13 
0x804a210 <array.2985+48>:  3  9  6 

雖然我不知道我應該怎麼處理這些信息。我知道這個彙編代碼中有一個循環,它會一直回到< +80>,直到$ eax保持15的值,但是我失去了這個函數成功退出的代碼。

+0

你想gdb命令'的x/15dw 0x804a1e0'來顯示陣列中的內容(即,不字節)。 –

+0

感謝您的提示。我編輯了這個問題。 – rywhite

回答

4

代碼看起來像它基本上

static int array[15] = { 10, 2, 14, 7, 8, 12, 15, 11, 0, 4, 1, 13, 3, 9, 6 }; 
void phase_5(char *s) { 
    int a, b; 
    if (sscanf(s, "%d%d", &a, &b) <= 1) 
     explode_bomb(); 
    a &= 0xf; 
    if (a != 0xf) { 
     int c = 0, d = 0; 
     do { 
      d++; 
      a = array[a]; 
      c += a; 
     } while (a != 0xf); 
     if (d == 15 && c == b) return; 
    } 
    explode_bomb(); 
} 
+0

現象。你和組裝工作了多長時間? – rywhite

+3

@ beachwood23:可能因爲在你出生之前... –

+0

@ChrisDodd對不起,我是C新手,你能解釋一下嗎,你怎麼從上面得到%d%d的價值?是(15,115)?我試圖遵循這一點,但仍然沒有得到它。 a = 15,b = sum(數組[i])? – JPC