【问题标题】:Buffer Overflow Problem缓冲区溢出问题
【发布时间】:2010-12-01 00:02:45
【问题描述】:

我正在尝试运行缓冲区溢出示例来运行一些代码,但问题是当我尝试运行代码只是为了获得缓冲区溢出时,Windows 会提示“程序已停止工作,Windows 正在检查程序的解决方案。因此,当我尝试确保它仅溢出一个字节时。程序只是运行,但不会暂停命令窗口以让我看到分段错误错误地址。哪个据我了解,我需要更改它并让它作为传递的参数运行我想要的窗口。这是简单的程序。

#define BUF_LEN 5

int main(int argc, char **argv)
{

char buf[BUF_LEN];

if (argc > 1)
{
 strcpy(buf, argv[1]);
}
 return 0;
 printf(buf);
 system("pause");
}

【问题讨论】:

  • argv[1] 的长度是多少?
  • 我把它设为至少大于buff,例如buff现在在这个程序中是5,所以我把它设为“AAAAAAAAA”

标签: c windows-7 buffer-overflow


【解决方案1】:

分段错误只是未定义行为的一种表现。确实没有什么可以保证操作系统会为您提供有关此处出现问题的任何信息。

无论如何,您都不需要该地址来诊断段错误。这里只有一件事会导致缓冲区溢出,您确切地知道它是什么:strcpy() 调用。

假设您必须使用 C,解决方法是改用 strncpy()。

【讨论】:

  • 我可能记错了,但是如果我读了OP的权利,他是故意要造成缓冲区溢出以进行锻炼。
  • 我知道 strncpy() 会防止缓冲区溢出。但我正在尝试创建一个示例来展示我可以通过使用一些 shellcode 来实现什么,但我认为我需要 seg 错误地址来做到这一点
  • 这根本没有回答我的问题,但它有两票?
  • @Eric:“未定义行为”的哪一部分你不明白?
【解决方案2】:

问题在于缓冲区溢出行为未标准化 - 您的示例可能指的是旧版本的 Windows,它仍然打印错误地址,或者指的是完全不同的操作系统。

此外,并非所有缓冲区溢出都会导致程序崩溃——这取决于将哪些数据写入何处。对于小的缓冲区溢出,您可能只覆盖了一些其他局部变量或填充空间,而不是程序执行所必需的任何内容(如函数返回地址)。

【讨论】:

  • 这实际上回答了问题
【解决方案3】:
#define BUF_LEN 5

int main(int argc, char **argv)
{

char buf[BUF_LEN];

if (argc > 1)
{
 strcpy(buf, argv[1]);
}

 printf(buf);
 system("pause");
 return 0;
}

return 0; 走到最后。否则程序执行会停在那里。

【讨论】:

  • 谢谢,现在它打印了buf,但由于不输出错误地址,它仍然遇到同样的问题。这不是我应该得到的
  • 我认为它不应该打印错误地址。更像是一个“SegFault”的东西。
  • 它不打印任何东西.. 它像没有错误一样打印 buf,但是当我按任意键继续时,它运行我上面提到的 Windows 提示加载问题错误,然后关闭跨度>
  • 我把它设为至少大于buff,例如buff现在在这个程序中是5,所以我把它设为“AAAAAAAAA”
  • 好吧,你最终只是在你不应该写的内存上写,仅此而已,而且它不好。除非你覆盖一些有用的东西,否则不会发生真正糟糕的事情。
【解决方案4】:

在编译时使用“gcc -fno-stack-protector -o out filename.c”, 因为 gcc 包含内置的堆栈保护器,你必须删除它。 -fno-stack-protector 将从 gcc 中删除保护函数

【讨论】:

    猜你喜欢
    • 2019-06-20
    • 2015-12-16
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 2014-06-14
    • 2021-09-19
    • 2013-02-01
    • 2019-08-15
    相关资源
    最近更新 更多