0

我正在尝试运行缓冲区溢出示例来运行一些代码,但问题是当我尝试运行代码只是为了获得缓冲区溢出时,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");
}
4

4 回答 4

2

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

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

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

于 2010-12-01T00:10:38.780 回答
1

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

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

于 2010-12-01T00:13:53.340 回答
0
#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;最后去。否则程序执行会停在那里。

于 2010-12-01T00:04:08.140 回答
0

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

于 2011-12-28T11:47:10.160 回答