【发布时间】:2013-09-16 21:02:39
【问题描述】:
我正在用 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(代码块)上测试它时(逻辑上)
输入超过 5 个字符会溢出并重写 admin 变量的字节
现在我的第一个 linux 系统也可以工作,但只有当我输入 13 个字符时,这是否与不同的编译器以及它们如何为程序分配内存有关?
我的第二台 linux 机器根本无法溢出。只有在第 13 个字符之后才会出现转储错误。
为什么它们差别这么大?
【问题讨论】:
-
我从没想过 Windows 和 Linux 机器之间会有任何相似的行为。 Linux 系统之间的差异可以通过架构差异(内存映射)或组成程序或操作系统版本的元素的版本控制来解释......
标签: c++ compiler-construction buffer-overflow