【问题标题】:Why am I not getting a Buffer Overflow?为什么我没有收到缓冲区溢出?
【发布时间】:2017-06-02 04:21:44
【问题描述】:

我读到的所有内容都让我相信这应该会导致stack buffer overflow,但事实并非如此:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char password[8];
    int correctPassword = 0;

    printf("Password \n");
    gets(password);

    if(strcmp(password, "password"))
    {
        printf ("Wrong password entered, root privileges not granted... \n");
    }
    else
    {
        correctPassword = 1;
    }

    if(correctPassword)
    {
        printf ("Root privileges given to the user \n");
    }

    return 0;
}

但这是我的输出:

在这种情况下,testtesttesttesttest 显然大于 8 个字符,并且根据source,它应该会导致stack buffer overflow,但事实并非如此。这是为什么呢?

【问题讨论】:

  • 因为它是未定义的行为,所以任何事情都可能发生。 stackoverflow.com/documentation/c/364/….
  • 您希望堆栈溢出如何体现?当我运行它时,我得到以下输出:Wrong password entered, root privileges not granted... *** stack smashing detected ***: ./Overflow terminated
  • p &amp;password[8]p &amp;correctPassword 显示什么?
  • @merlin2011:如果你在没有堆栈保护的情况下编译它,它就有更好的工作机会。
  • 没有“堆栈缓冲区溢出”之类的东西。有“堆栈溢出”和“缓冲区溢出”。不清楚你在问什么。

标签: c stack-overflow


【解决方案1】:

读取更多字节然后缓冲区可以包含不会总是导致运行时错误,但这是一个非常糟糕且常见的错误(阅读这篇文章about smashing the stack)。正如我从 cmets 中看到的,您添加了 -fno-stack-protector 以使程序不打印 * 检测到堆栈粉碎 * 但这不是一个好主意。你应该使用scanf(" %8s",password) 或类似的东西来限制你阅读的内容。

【讨论】:

  • A Stack Buffer Overflow 确实是与 heap buffer overflow 相对的东西
  • @bradgonesurfing 我不明白我在谈论堆。你能说得更具体点吗?
  • 您批评术语“堆栈缓冲区溢出”是一个错误的术语,声称它不同于“缓冲区溢出”。术语“堆栈缓冲区溢出”没有错。确切地说,它意味着存在于堆栈上的缓冲区,该缓冲区已被写入但超出其边界。
  • @bradgonesurfing 很抱歉,你是对的。我只是误读了它。
【解决方案2】:

您的代码确实会导致堆栈上的缓冲区溢出,因为您已经覆盖了为password 缓冲区分配的内存。看看你提供输入后被覆盖的内存。

gcc -o Overflow Overflow.c -fno-stack-protector -g

gdb Overflow
(gdb) b 8
Breakpoint 1 at 0x4005cc: file Overflow.c, line 8.
(gdb) b 11
Breakpoint 2 at 0x4005e2: file Overflow.c, line 11.
(gdb) r
Starting program: /home/hq6/Code/SO/C/Overflow

Breakpoint 1, main (argc=1, argv=0x7fffffffde08) at Overflow.c:8
8       printf("Password \n");
(gdb) x/20x password
# Memory before overflow
0x7fffffffdd10: 0xffffde00  0x00007fff  0x00000000  0x00000000
0x7fffffffdd20: 0x00400630  0x00000000  0xf7a2e830  0x00007fff
0x7fffffffdd30: 0x00000000  0x00000000  0xffffde08  0x00007fff
0x7fffffffdd40: 0xf7ffcca0  0x00000001  0x004005b6  0x00000000
0x7fffffffdd50: 0x00000000  0x00000000  0x67fbace7  0x593e0a93
(gdb) c
Continuing.
Password
correctPassword

Breakpoint 2, main (argc=1, argv=0x7fffffffde08) at Overflow.c:11
11      if(strcmp(password, "password"))
(gdb) x/20x password
# Memory after overflow
0x7fffffffdd10: 0x72726f63  0x50746365  0x77737361  0x0064726f
0x7fffffffdd20: 0x00400630  0x00000000  0xf7a2e830  0x00007fff
0x7fffffffdd30: 0x00000000  0x00000000  0xffffde08  0x00007fff
0x7fffffffdd40: 0xf7ffcca0  0x00000001  0x004005b6  0x00000000
0x7fffffffdd50: 0x00000000  0x00000000  0x67fbace7  0x593e0a93

缓冲区溢出是否具有不良副作用是未定义的行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 2014-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多