2010-11-02 44 views
0

我正在做這個項目,這個特別的部分讓我感到困惑。我們得到這個機器級別的代表,它會讀取六個數字,我必須弄清楚。到目前爲止,我知道這是一個循環,它會迭代直到達到停止子句。我們不希望它在0x08048d3a處調用爆炸:調用0x80492f3。有誰知道六個數字將會產生。任何幫助是極大的讚賞。機器水平代表

0x08048d0b <phase_2+0>:   push %ebp 
0x08048d0c <phase_2+1>:   mov %esp,%ebp 
0x08048d0e <phase_2+3>:   push %esi 
0x08048d0f <phase_2+4>:   push %ebx 
0x08048d10 <phase_2+5>:   sub $0x30,%esp 
0x08048d13 <phase_2+8>:   lea -0x20(%ebp),%eax 
0x08048d16 <phase_2+11>:  mov %eax,0x4(%esp) 
0x08048d1a <phase_2+15>:  mov 0x8(%ebp),%eax 
0x08048d1d <phase_2+18>:  mov %eax,(%esp) 
0x08048d20 <phase_2+21>:  call 0x8049335 <read_six_numbers> 
0x08048d25 <phase_2+26>:  mov $0x2,%ebx 
0x08048d2a <phase_2+31>:  lea -0x20(%ebp),%esi 
0x08048d2d <phase_2+34>:  mov -0x8(%esi,%ebx,4),%eax 
0x08048d31 <phase_2+38>:  add $0x5,%eax 
0x08048d34 <phase_2+41>:  cmp %eax,-0x4(%esi,%ebx,4) 
0x08048d38 <phase_2+45>:  je  0x8048d3f <phase_2+52> 
0x08048d3a <phase_2+47>:  call 0x80492f3 <explode_bomb> 
0x08048d3f <phase_2+52>:  add $0x1,%ebx 
0x08048d42 <phase_2+55>:  cmp $0x7,%ebx 
0x08048d45 <phase_2+58>:  jne 0x8048d2d <phase_2+34> 
0x08048d47 <phase_2+60>:  add $0x30,%esp 
0x08048d4a <phase_2+63>:  pop %ebx 
0x08048d4b <phase_2+64>:  pop %esi 
0x08048d4c <phase_2+65>:  pop %ebp 
0x08048d4d <phase_2+66>:  ret 

具體你可以解釋發生了什麼,在這些線路

0x08048d10 <phase_2+5>:   sub $0x30,%esp 
0x08048d13 <phase_2+8>:   lea -0x20(%ebp),%eax 
0x08048d16 <phase_2+11>:  mov %eax,0x4(%esp) 
0x08048d1a <phase_2+15>:  mov 0x8(%ebp),%eax 
0x08048d1d <phase_2+18>:  mov %eax,(%esp) 

謝謝!!

+3

爲什麼放下功課和x86的標籤? – Flexo 2010-11-02 17:39:07

+0

你應該考慮解決http://crackmes.de/上的一些問題。 – ruslik 2010-11-02 17:40:58

+1

我們很樂意幫助您完成作業,但您正在尋求答案。我們不這樣做。你能問一個更具體的問題嗎? (如何解釋'jne 0x8048d2d 'etc? – 2010-11-02 17:47:53

回答

2

這AT & T語法混淆了我,但是這部分很簡單:

0x08048d10 <phase_2+5>:   sub $0x30,%esp //reserve additional 0x30bytes 12 ints) on the stack 
0x08048d13 <phase_2+8>:   lea -0x20(%ebp),%eax // int vals[6]; eax = vals; 
0x08048d16 <phase_2+11>:  mov %eax,0x4(%esp) // int some_local_var = vals; 
0x08048d1a <phase_2+15>:  mov 0x8(%ebp),%eax // first param we received 
0x08048d1d <phase_2+18>:  mov %eax,(%esp) // pass it as param to function 
0x08048d20 <phase_2+21>:  call 0x8049335 <read_six_numbers> 
1
char answer[6]; 
answer[0] = any_char 
for n > 0 
answer[n] = answer[n-1] + 5;