You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x86缓冲区溢出练习中GDB打印变量地址与实际栈地址不符问题

关于Protostar stack0缓冲区溢出中地址计算与GDB显示不一致的问题解答
  • 混淆运行时相对偏移与绝对虚拟地址:你通过汇编分析得出的esp+0x5c是函数执行过程中,变量相对于当前栈指针ESP的运行时相对偏移,而GDB中p &modified输出的是变量加载到进程后的绝对虚拟内存地址。ESP会随着push、pop、sub/add esp等栈操作动态变化,变量的绝对地址在进程启动后则固定不变,二者属于完全不同的地址维度,无法直接等价。

  • 未考虑栈帧初始化流程:分析汇编时大概率忽略了函数栈帧的初始化步骤。比如main函数执行时通常会先执行push ebp; mov ebp, esp建立栈帧,此时ESP已发生变化。如果你的偏移计算基于函数刚进入时的ESP,而非栈帧建立后的基准EBP,就会导致偏移计算错误,指向的内存位置自然不是modified的真实地址。

  • 编译器栈布局的细微差异:Protostar使用的旧版GCC可能会对栈变量做内存对齐处理,即便stack0未开启栈保护或ASLR,编译器也可能为了内存访问效率在栈变量间插入填充字节。这种情况下,手动通过汇编指令计算的偏移会和实际栈布局不符,导致你计算的地址并非modified的真实位置。

  • volatile关键字不影响地址:别被volatile int modified中的volatile误导,它仅用于禁止编译器对变量的读写优化,不会改变变量在内存中的实际地址,也不会影响栈布局。你修改的内存地址本身就不是modified的真实地址,所以GDB中显示的modified值自然不会变化。

正确的做法是:在GDB中先通过p &modified获取变量的绝对地址,再通过查看栈帧(比如info frame或x/20x $ebp)反推该地址相对于EBP/ESP的偏移,以此确定需要溢出的字节数。

内容的提问来源于stack exchange,提问作者MissSergeivna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 21:30:56