【问题标题】:Extra bytes on stack when trying stack smashing in C在 C 中尝试堆栈粉碎时堆栈上的额外字节
【发布时间】:2017-06-08 13:11:41
【问题描述】:

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

#include <stdio.h>

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

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

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

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

【问题讨论】:

  • GetInput 返回类型是什么? EBP 是什么意思?一般来说,最好的办法是检查汇编代码。 en.wikipedia.org/wiki/Call_stack
  • @tilz0R EBP 是堆栈数据指针寄存器。
  • 您在构建时是否禁用了堆栈粉碎保护/检测?
  • @Someprogrammerdude 我用过:gcc -ggdb -fno-stack-protector -mpreferred-stack-boundary=2 -o
  • 18 年前发布了一个新的 C 标准......也许专注于学习正确的 C 编程而不是“堆栈粉碎”。

标签: c gcc gdb stack-overflow


【解决方案1】:

填充

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多