2015-04-07 46 views
1

好的,所以我一直試圖遵循這個彙編代碼很長一段時間,我似乎無法確定它產生的模式。以下是代碼及其縮寫值。用GDB解碼彙編語言

0x08048c74 <+0>: push %esi 
    0x08048c75 <+1>: push %ebx 
=> 0x08048c76 <+2>: sub $0x34,%esp 
    0x08048c79 <+5>: lea 0x18(%esp),%eax 
    0x08048c7d <+9>: mov %eax,0x4(%esp) 
    0x08048c81 <+13>: mov 0x40(%esp),%eax 
    0x08048c85 <+17>: mov %eax,(%esp) 
    0x08048c88 <+20>: call 0x80494d4 <read_six_numbers> 
    0x08048c8d <+25>: cmpl $0x0,0x18(%esp) 
    0x08048c92 <+30>: jne 0x8048c9b <phase_2+39> 
    0x08048c94 <+32>: cmpl $0x1,0x1c(%esp) 
    0x08048c99 <+37>: je  0x8048cba <phase_2+70> 
    0x08048c9b <+39>: call 0x8049495 <explode_bomb> 
    0x08048ca0 <+44>: jmp 0x8048cba <phase_2+70> 
    0x08048ca2 <+46>: mov -0x8(%ebx),%eax 
    0x08048ca5 <+49>: add -0x4(%ebx),%eax 
    0x08048ca8 <+52>: cmp %eax,(%ebx) 
    0x08048caa <+54>: je  0x8048cb1 <phase_2+61> 
    0x08048cac <+56>: call 0x8049495 <explode_bomb> 
    0x08048cb1 <+61>: add $0x4,%ebx 
    0x08048cb4 <+64>: cmp %esi,%ebx 
    0x08048cb6 <+66>: jne 0x8048ca2 <phase_2+46> 
---Type <return> to continue, or q <return> to quit--- 
    0x08048cb8 <+68>: jmp 0x8048cc4 <phase_2+80> 
    0x08048cba <+70>: lea 0x20(%esp),%ebx 
    0x08048cbe <+74>: lea 0x30(%esp),%esi 
    0x08048cc2 <+78>: jmp 0x8048ca2 <phase_2+46> 
    0x08048cc4 <+80>: add $0x34,%esp 
    0x08048cc7 <+83>: pop %ebx 
    0x08048cc8 <+84>: pop %esi 
    0x08048cc9 <+85>: ret  
End of assembler dump. 
(gdb) i r 
eax   0x804c870 134531184 
ecx   0xc 12 
edx   0x2 2 
ebx   0x2 2 
esp   0xffffd054 0xffffd054 
ebp   0xffffd078 0xffffd078 
esi   0xffffd114 -12012 
edi   0x0 0 
eip   0x8048c76 0x8048c76 <phase_2+2> 
eflags   0x286 [ PF SF IF ] 
cs    0x23 35 
ss    0x2b 43 
ds    0x2b 43 
es    0x2b 43 
fs    0x0 0 
gs    0x63 99 
(gdb) x/d $esp 
0xffffd054: 2 
(gdb) 

我插入原始值分別爲:1個2 3 4 5 6

read_six_numbers僅僅是檢查的功能,如果你有6個數字但是有一些線,我要仔細檢查,如果我理解他們是對的。例如:

cmpl $0x0,0x18(%esp) 

從我所知道的檢查,看看esp寄存器是否等於零。如果不是,那麼炸彈就會爆炸。由於這是第一次比較,這是否意味着第一個數字應該是零?

其它線路,如:

add -0x4(%ebx),%eax 

add $0x4,%ebx 

我覺得我需要注意,因爲他們改變了寄存器內的數字的值。我知道有假設是一個模式的數字,如* 3或+3等,但我認爲該模式必須做4,因爲無論是增加或更改值4.我設法得到官方發展援助上的代碼可以幫助我們看到這裏跳轉的鏈接: http://www2.onlinedisassembler.com/odaweb/J0tDzn/0

只需點擊symbols部分中的phase_2即可。我只需要知道如何得到前兩個數字,從那裏第三個數字應該是直接的,模式應該清楚。我很抱歉,如果這是一篇很長的文章,但我一直試圖理解這段相當長的一段時間,並且試圖找到放棄模式的線索。任何幫助將不勝感激!提前致謝!

回答

1
cmpl $0x0,0x18(%esp) 

據我所知檢查是否ESP寄存器等於零。

不,它比較內存中的地址值%esp+0x18

這是否意味着第一個數字應該是零?

但這種情況是真實的:)

但是我認爲模式有4做到,因爲無論是添加或 由4

號更改值請注意,4適用於內存地址,而不是值。那是因爲整數是4個字節。 add -0x4(%ebx),%eax會將地址%ebx-4的內存中的編號添加到%eax

我只需要知道如何去獲得第2號

嗯,你已經知道第一個必須是零。由於數字在地址%esp+0x18的內存中,每個數字都是4個字節,因此指令cmpl $0x1,0x1c(%esp)檢查第二個數字。

你應該重新回顧一下你必須得到的一些基本的東西。否則,你將很難在隨後的階段。

+0

由於某種原因,第一個數字不是0。當我一步一步輸入0作爲第一個數字時,它只是執行cmpl $ 0x0,0x18(%esp)並且說它不等於吹起炸彈,我怎麼能得到0x18(%esp)的值? – Smreks

+0

'read_six_numbers'獲取地址'0x18(%esp)'作爲參數,所以您輸入的第一個數字應該在那裏。你做錯了什麼。無論如何,你可以使用'x $ esp + 0x18'來檢查。 – Jester

+0

你是對的,它是0然後1,然後它增加了數字後,我只是拿了另一個炸彈,並解決了它的模式,並轉移到其他階段,謝謝你的迴應! :) – Smreks