我正在学习堆栈粉碎,并找到一个对我来说不能按预期工作的例子。 我有以下代码:
#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个字节。
答案 0 :(得分:0)
填充
根据所使用的编译器和该编译器的版本以及甚至优化标志,由于不同的原因,可以在不同位置将不同数量的填充推送到堆栈上。您的编译器可能正在插入堆栈canaries来检测缓冲区溢出。它可能正在尝试改进对齐或缓存行为。它可能效率低下,浪费空间。
没有办法确定,因为每个编译器都不同,并且任何规范或ABI都没有规定局部变量的精确布局。