2015-12-16 91 views
0

我想解決這個crackme。我不想檢查解決方案,直到我沒有試圖自己解決它。不幸的是我不知道這裏發生了什麼:解釋一些彙編指令

0x080496e0: movl $0xc324148b, 0x804974b 
0x080496ea: call 0x804974b 
... 
0x0804974b: jmp 0x080496e0 
+0

親愛的downvoter,我很好奇我怎麼能改善這個問題,以便爲你確定。 – robert

回答

2

第一條指令(movl $0xc324148b, 0x804974b)在地址0x804974B處寫入4個字節。
這些字節的順序是:0x8B,0x14,0x24,0xC3。

前3形式的指令:mov edx, [esp]
最後還形成指令:ret

由於第二指令(call 0x804974b)`調用此地址,在飛行中創建的對指令得到執行。

+0

如果我解釋得很好,跳轉指令是5個字節,最後一個字節(0x80)會導致中斷? – robert

+0

超出新創建的'ret'的任何字節都不會被執行。 0x80不會導致中斷。 – Fifoernik

2

這裏沒有什麼複雜的事情發生。如果你不明白這一點,你可能會推翻它。試着像機器執行這個一樣愚蠢。或者,也許你與指令鬥爭?如果是這樣,請參考一些x86引用。

0x080496e0: movl $0xc324148b, 0x804974b 

該指令只是在地址0x804974b寫在存儲器中的值0xc324148b。在英特爾語法中,我發現它更直觀,它將寫入mov dword ptr 0x804974b, 0xc324148b

0x080496ea: call 0x804974b 

該指令調用地址爲0x804974b的函數。它將推送一個返回地址,跳轉到0x804974b並在那裏執行代碼。您可以在此注意到,這也是寫入前一個值的地址。這意味着DWORD實際上是一些代碼,而不是一些數據。這在Von Neumann體系結構(如x86)中完全有效(可能存在內存讀/寫/執行屬性的一些問題,但您可以假設它已在此處正確設置)。