gpt4 book ai didi

c - 在 C 中尝试堆栈粉碎时堆栈上有额外的字节

转载 作者:行者123 更新时间:2023-11-30 16:44:33 25 4
gpt4 key购买 nike

我正在学习堆栈粉碎,并发现了一个对我来说无法按预期工作的示例。我有以下代码:

#include <stdio.h>

GetInput() {
char buffer[8];
gets(buffer);
puts(buffer);
}

main() {
GetInput();
return 0;
}

当在 GDB 中使用“GetInput()”和“gets(buffer)”处的断点运行代码并在第一个和第二个断点处显示堆栈时,会显示以下内容:stack while running code with break points

查看堆栈,有 20 个字节被压​​入其中。这 20 个字节应该如下:8 个字节用于缓冲区,4 个字节用于 EBP 的旧值,另外 4 个字节用于返回地址。还有另外 4 个字节,我不确定它来自哪里。有人可以解释一下为什么是 20 个字节而不是 16 个字节吗?

最佳答案

填充

根据所使用的编译器和该编译器的版本,甚至优化标志,由于不同的原因,不同数量的填充可能会被推送到堆栈上的不同位置。您的编译器可能会插入堆栈金丝雀来检测缓冲区溢出。它可能正在尝试改进对齐或缓存行为。它可能只是效率低下并且浪费空间。

没有办法确定,因为每个编译器都是不同的,并且任何规范或 ABI 都没有强制要求局部变量的精确布局。

关于c - 在 C 中尝试堆栈粉碎时堆栈上有额外的字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44436727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com