'push ebp''pop ebp'没有被使用,但是当被移除时仍然会破坏代码。

问题描述:

我编译:'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

如果您要在启用优化的情况下编译代码,则会更简单,更易于理解。 –

如果没有使用它,则不需要推送。

在您的优化代码中,您正在使用原始偏移量0c08,其中 在推送ebp时正确。

当你还没有按任何东西时,你必须分别使用0804,并且esp仍然有其原始的功能输入值。