什么是堆栈平衡
这里有两种情况:
- 如果要返回父程序,则当我们在堆栈中进行堆栈操作的时候,一定要保证在RET这条指令之前,ESP指向的是压入的我们压入的地址
这句话我是这么理解的,就是当你调用函数的时候,比如使用CALL指令,当使用堆栈的时候,使用前ESP指向那个地址,使用后RET返回前就必须是那个地址,如果不是那个地址,那么堆栈就是不平衡的,程序就崩溃了。
直接上图分析一下:
这个程序运行起来以后一定是会崩溃的,在函数执行结束前,它使用了堆栈,向栈顶push了eax的值,使栈顶指针ESP的值-4,这样ret程序就飞了,因为push把它带到了另一个世界。
运行结果:
可以看到,反汇编窗口直接没了,原因就是他没有00000003这个地址,程序就这样飞走了,这是第一种情况。
- 如果通过堆栈传递参数了。那么在程序执行完毕后,要平衡因参数导致的堆栈变化