gpt4 book ai didi

C - 缓冲区溢出问题

转载 作者:行者123 更新时间:2023-11-30 15:27:06 25 4
gpt4 key购买 nike

这是程序的源代码

#include <stdio.h>
% filename: test.c
int main(){
int local = 0;
char buff[7];
printf("Password: ");
gets(buff);

if (local)
printf("Buff: %s, local:%d\n", buff, local);
return 0;
}

我使用“gcc test.c -fno-stack-protector -o test”来编译这个文件,当我运行该文件时,为了使gets溢出,我需要输入至少13个字符。我的想法是因为我只向buff声明了7个字节,这意味着当用户输入至少8个字符时,就会发生溢出。但似乎不是这种情况,为什么?

最佳答案

堆栈布局取决于实现。

无法保证 local 对象位于 buff 对象之后或之前,或者两者都是连续的。

在您的情况下,可能是在 buff 对象之后插入了 5 个字节 (1 + 4) 的填充。这种填充非常常见,通常由编译器出于性能原因插入。填充的大小可能因编译器、编译器版本、编译器选项甚至不同源代码而异。

要更好地了解布局,只需打印 bufflocal 对象的地址即可:

printf("%p %p\n", (void *) buff, (void *) local);

关于C - 缓冲区溢出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27181841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com