【问题标题】:Eclipse C string does not overflowEclipse C 字符串不会溢出
【发布时间】:2021-01-10 05:56:22
【问题描述】:

我正在为 C/C++ 开发人员使用 Eclipse IDE,同时我也在学习 C。理论上,当我输入大于我分配的字符串大小时,应该会以某种方式发生溢出。但这一切都很好,我看不到想要的麻烦。

int main()
{
    char nameArr[15];
    printf("Type name: ");
    scanf("%s",nameArr);
    printf("You are %s.\n",nameArr);

    return(0);
}

我想故意看看溢出的情况,但我做不到。例如,在运行时,如果我键入 Wolfeschlegelsteinhausenbergerdorff,它会正确输出,而 Eclipse 中不会出现任何与溢出相关的消息。我不知道它是 C 的特性还是 Eclipse 的特性。有谁知道为什么尺寸过大也没关系?

【问题讨论】:

  • C 不提供边界检查,这取决于你。当您溢出缓冲区时,这是未定义的行为,其结果之一是它看起来可以正常工作。

标签: c eclipse c-strings buffer-overflow


【解决方案1】:

这个例子很好地说明了为什么使用您可以使用的工具来捕获常见的编程错误很重要。像这样的数组溢出可能多年未被发现,直到有人将其用作漏洞利用的基础。这种错误很容易犯——它们通常不像 OP 中的那样明显——而且它们在测试时不一定会导致失败。

现代 C 编译器提供了防止数组从堆栈末尾写入的情况。他们无法使代码工作,但他们可以发出失败信号,以便对错误进行跟进。例如,如果我使用-fstack-protector 使用gcc 构建OP 的代码,那么即使是很小的溢出也会导致立即失败:

Type name: 12345678987654321
You are 12345678987654321.
*** stack smashing detected ***: <unknown> terminated

与调试器结合使用,可以很快检测到问题代码。

如果您的编译器不提供这些类型的检查,请使用更好的编译器;)

【讨论】:

    【解决方案2】:

    正如@retiredninja 在评论中提到的那样,缓冲区溢出会导致未定义的行为,因此您不能期望任何事情发生或不发生。

    也就是说,要观察一些简单的缓冲区溢出,你可以试试这个:

    #include <stdio.h>
    
    int main()
    {
        char overflow[16];
        char nameArr[16];
        overflow[15] = '\0';
        nameArr[15] = '\0';
        printf("Type name: ");
        scanf("%s" ,nameArr);
        printf("You are %s.\n", nameArr);
        printf("overflow: %s\n", overflow);
    
        return(0);
    }
    

    当我编译这个时

    gcc -Wall -W main.c -o main -fno-stack-protector -O0
    

    运行它,我明白了

    $ ./main
    Type name: 123456789abcdefghijklmnopqrstuvwxyz
    You are 123456789abcdefghijklmnopqrstuvwxyz.
    overflow: hijklmnopqrstuvwxyz
    

    这表明额外的文本被写入与预期变量相邻的内存中。这里的顺序很重要:这些变量存在于堆栈中,堆栈通过内存向下增长,因此变量“之后”的内存属于在它之前声明的变量。

    请注意,我的回答中的所有内容都依赖于实现,因此不能期望所有编译器、操作系统等都会发生这种情况。尤其如此,因为我们谈论的是未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2021-12-10
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      相关资源
      最近更新 更多