刷题时偶然发现的64位程序的堆栈平衡问题
题目:
ciscn_2019_en_2
运行exp时发现报错:
这里是栈没有对齐,
64位程序相对于32位多了堆栈需要平衡的问题
- 如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
- 如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。
含义:
- 当函数在一步步执行的时候 一直到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。
- 函数执行前一直到函数执行结束,函数里面的堆栈是要保持不变的。
- 如果堆栈变化了,那么,要在ret执行前将堆栈恢复成原来的样子。
修改exp:
在第二个payload溢出返回点加入‘ret’,使其栈对齐
再次运行:
发现没有出错~
成功拿到flag!