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

时间:2017-06-08 13:11:42

标签: c gcc gdb stack-overflow

我正在学习堆栈粉碎,并找到一个对我来说不能按预期工作的例子。 我有以下代码:

#include <stdio.h>

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

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

在GDB中运行代码时,断点位于&#34; GetInput()&#34;和&#34;得到(缓冲)&#34;并在第一个和第二个断点处显示堆栈给出了以下内容:stack while running code with break points

查看堆栈有20个字节被推送到它。该20字节应该如下:缓冲区为8个字节,EBP的旧值为4个字节,返回地址为4个字节。还有另外4个字节,我不知道它来自哪里。 有人可以解释为什么有20个字节而不是16个字节。

1 个答案:

答案 0 :(得分:0)

填充

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

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