我正在用 C++ 测试一个简单的缓冲区溢出。该示例是一个测试,如果没有进行检查,恶意用户可以使用缓冲区溢出覆盖变量。
该示例定义了一个缓冲区,然后是一个变量,这意味着应该为缓冲区分配空间,然后为变量分配空间。该示例读取cin
长度为 5 的缓冲区,然后检查 admin 变量是否设置为 0 以外的值,如果是,则用户在概念上获得了管理员访问权限。
#include <iostream>
using namespace std;
int main()
{
char buffer[5];
int admin = 0;
cin>>buffer;
if(strcmp(buffer,"in") == 0)
{
admin = 1;
cout<<"Correct"<<endl;
}
if(admin != 0)
cout << "Access" << endl;
return 0;
}
我有 3 台机器,1 台 Windows 和 2 台 Linux 系统。
当我在 Windows(CodeBlocks)上测试它时(逻辑上)输入超过 5 个字符溢出并重写admin
变量的字节
现在我的第一个 linux 系统也可以工作,但只有当我输入 13 个字符时,这是否与不同的编译器以及它们如何为程序分配内存有关?
我的第二台 linux 机器根本无法溢出。只有在第 13 个字符之后才会出现转储错误。
为什么他们差别这么大?