我正在尝试运行一个缓冲区溢出示例来运行一些代码,但问题是,当我尝试运行代码只是为了获得缓冲区溢出时,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");
}
答案 0 :(得分:2)
分段错误只是未定义行为的一种表现形式。实际上并没有什么可以保证操作系统会为您提供有关此处出现问题的任何信息。
无论如何,您都不需要该地址来诊断段错误。有一件事可以导致缓冲区溢出,你确切知道它是什么:strcpy()调用。
假设您必须使用C,则修复方法是使用strncpy()代替。
答案 1 :(得分:1)
问题在于缓冲区溢出行为未标准化 - 您的示例可能是指仍旧打印错误地址的旧版Windows,或者是指完全不同的操作系统。
此外,并非所有缓冲区溢出都会导致程序崩溃 - 这取决于在哪里写入数据。对于小缓冲区溢出,您可能只覆盖其他一些局部变量或填充空间,而不是程序执行所必需的任何东西(如函数返回地址)。
答案 2 :(得分: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;
最终结束。否则程序执行就会停止。
答案 3 :(得分:0)
编译时使用“gcc -fno-stack-protector -o out filename.c”, 因为gcc包含内置堆栈保护程序,你必须删除它。 -fno-stack-protector将从gcc中删除保护函数