【发布时间】: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