2017-09-26 47 views
1

我編譯:'push ebp''pop ebp'沒有被使用,但是當被移除時仍然會破壞代碼。

" 
int x_add(int a, int b) 
{ 
    return a+b; 
} 
" 

,並得到

" 
push ebp 
mov ebp,esp 
mov edx,[ebp+08] 
mov eax,[ebp+0c] 
pop ebp 
ret 
" 

我簡化了組裝到

" 
mov eax,[esp+0c] 
add eax,[esp+08] 
ret 
" 

當我運行"x_add(1, 1);"返回-1 所以我代替代碼試圖找到破了什麼。

" 
push ebp 
mov eax,[esp+0c] 
add eax,[esp+08] 
pop ebp 
ret 
" 

按預期工作,返回1 + 1 = 2。 那麼爲什麼ebp必須在開始時被推送,然後如果從未在代碼中使用,最終會彈出ebp?

+2

所以..沒有這個推/流行,你沒有注意到ESP的價值(因此這些偏移用於尋址)是不同於推/流行,對吧?你*做了*,交互調試,對吧?短版本:'push ebp'修改'esp',所以如果你刪除推/彈出,你必須調整你的偏移量。 – WhozCraig

+0

是一個新的調試器。當我指向它時,IDA很糟糕,代碼塊跳過了代碼。我使用的是Cheat引擎,並沒有考慮檢查堆棧指針。 – CatOfBlades

+0

如果您要在啓用優化的情況下編譯代碼,則會更簡單,更易於理解。 –

回答

7

如果沒有使用它,則不需要推送。

在您的優化代碼中,您正在使用原始偏移量0c08,其中 在推送ebp時正確。

當你還沒有按任何東西時,你必須分別使用0804,並且esp仍然有其原始的功能輸入值。

相關問題