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

C语言中不同声明顺序的变量栈上顺序不变?是否与类型相关?

你遇到的现象是GCC 4.9及更高版本默认开启的栈变量重排序安全缓解机制导致的,该机制独立于栈金丝雀保护(-fstack-protector),所以即使你添加了-fno-stack-protector关闭栈保护,重排逻辑仍然生效。

该优化的核心设计目的是降低基础栈溢出漏洞的利用风险:

  • x86架构下栈从高地址向低地址增长,C语言数组越界写入默认向高地址方向延伸
  • 新版GCC会自动对函数内的栈变量做分类排序:将数组、缓冲区等聚合类型变量统一排列在标量类型变量(整型、指针等单值变量)的更高内存地址处,与变量声明顺序无关
  • 调整布局后,缓冲区向上溢出时无法直接覆盖到放在低地址的敏感标量变量(比如你代码里的auth_flag),从而减少简单栈溢出的可利用性

你给出的两次运行结果完全符合该机制的表现:不管你把auth_flag声明在数组前还是数组后,它的地址始终比password_buffer低4字节,编译器自动把它放到了数组的低地址侧,避免被数组溢出覆盖。

《Hacking: The Art Of Exploitation, 2nd Edition》出版时GCC还没有引入该机制,所以书中描述的是按声明顺序分配栈变量的旧行为。如果需要复现书中的栈布局效果,只需要在编译参数中额外添加-fno-stack-reorder关闭栈变量重排即可,完整编译参数参考:

gcc auth_overflow.c -o auth_overflow -m32 -g -fno-stack-protector -fno-stack-reorder -O0

添加该参数后,栈变量会严格按照代码中的声明顺序分配地址,和书中描述的行为一致。

内容的提问来源于stack exchange,提问作者W.Yaxu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:39:03