gpt4 book ai didi

C++ 缓冲区溢出在 3 台机器上不同

转载 作者:行者123 更新时间:2023-11-30 04:14:33 25 4
gpt4 key购买 nike

我正在用 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 个字符后给出转储错误。

为什么它们相差那么大?

最佳答案

你应该检查反汇编。从那里你会看到到底发生了什么。

一般来说,有两件事需要考虑:

  1. 由编译器完成填充以对齐堆栈变量。

  2. 编译器对堆栈变量的相对放置。

第一点:您的数组 char buffer[5]; 将被填充,因此 int admin; 将在堆栈上正确对齐。我希望它通常在 x86x64 上被填充到 8 个字节,因此要覆盖 9 个符号。但是编译器可能会根据它认为合适的方式做不同的事情。尽管如此,Windows 和 Linux 计算机似乎x86(32 位)。

第二点:编译器不需要按照声明的顺序将栈变量入栈。在 Windows 和第一个 Linux 机器上,编译器确实将 char buffer[5]; 放在 int admin; 下,所以你可以溢出到它里面。在第二台 Linux 机器上,编译器选择以相反的顺序放置它,因此您不会溢出到 int admin;,而是在之后破坏 main() 调用者的堆栈框架写入超出分配给 char buffer[5]; 的空间。

这是我自己对类似问题的回答的无耻链接 - an example of examining of such overflow .

关于C++ 缓冲区溢出在 3 台机器上不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18837268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com