'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?
答
如果没有使用它,则不需要推送。
在您的优化代码中,您正在使用原始偏移量0c
和08
,其中 在推送ebp
时正确。
当你还没有按任何东西时,你必须分别使用08
和04
,并且esp
仍然有其原始的功能输入值。
所以..没有这个推/流行,你没有注意到ESP的价值(因此这些偏移用于寻址)是不同于推/流行,对吧?你*做了*,交互调试,对吧?短版本:'push ebp'修改'esp',所以如果你删除推/弹出,你必须调整你的偏移量。 – WhozCraig
是一个新的调试器。当我指向它时,IDA很糟糕,代码块跳过了代码。我使用的是Cheat引擎,并没有考虑检查堆栈指针。 – CatOfBlades
如果您要在启用优化的情况下编译代码,则会更简单,更易于理解。 –