c - 缓冲区溢出 - 局部变量在堆栈上的顺序

标签 c stack buffer-overflow local-variables

<分区>

我对局部变量在堆栈上的排序方式感到很困惑。我知道,(在 Intel x86 上)局部变量在代码中从高地址存储到低地址。很明显,这段代码:

int i = 0;
char buffer[4];
strcpy(buffer, "aaaaaaaaaaaaaaa");
printf("%d", i);

产生这样的东西:

1633771873

i 变量被溢出的缓冲区覆盖。

但是,如果我交换前两行:

char buffer[4];
int i = 0;
strcpy(buffer, "aaaaaaaaaaaaaaa");
printf("%d", i);

输出完全相同。

这怎么可能? i 的地址低于 buffer 的地址,因此缓冲区溢出应该会覆盖其他数据,但不会覆盖 i。还是我遗漏了什么?

最佳答案

局部变量的顺序没有规定,所以编译器通常可以随意分配它们。但另一方面,编译器会使用许多策略来减少您自愿尝试做的事情发生的可能性。

这些安全增强措施之一是分配一个始终远离其他标量变量的缓冲区,因为数组可以越界寻址并且更倾向于膨胀相邻变量。另一个技巧是在数组后添加一些陷阱空白空间,为边界问题创建一种隔离。

无论如何,您可以使用调试器查看程序集以确认变量定位。

关于c - 缓冲区溢出 - 局部变量在堆栈上的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32276814/

相关文章:

c - main 函数和之后的变量

c - 'write' 函数的正确缓冲区大小是多少?

c++ - 为什么这个程序有效?

android - 缓冲区溢出 - Android 中没有可用空间崩溃

c - 赋值操作真的会返回一些东西吗?

c++ - 在程序中打印有效,但 gdb 显示 "Cannot access memory at address ..."

c++ - 从堆栈对象中提取信息

圆形缓冲区比。锁定空闲堆栈以实现一个空闲列表

security - 漏洞与利用案例研究

c++ - 不应该发生的缓冲区溢出(?)