c ++ - 成功打印超出范围的字符串索引

问题描述 投票:0回答:2

我是C ++的新手,我正在玩string课程。我意识到当我使用GNU编译器在CodeBlocks中运行以下代码时:

#include <iostream>

using namespace std;

int main()
{
    string test = "hi";
    cout<<"char is : "<<test[100];
    return 0;
}

我实际上得到了一个价值。我玩索引(我尝试从100到10000)我可能会得到其他字符或我可能会得到null。这是否意味着你能够读取你不应该读取的部分内存?你可以用它来剥削吗?或者只是我的想法是幻想?

c++ string segmentation-fault exploit
2个回答
0
投票

这是未定义的行为,因此任何事情都可能发生。编译器可以优化掉行,插入abort()或执行任何其他操作。

如果编译器没有对代码进行大的更改,并且std::string实现了短字符串优化,那么test[100]将访问调用main()的函数之一的堆栈帧。

这些函数负责加载共享库,安排环境变量,构建std::cout等全局对象,以及创建和传递argc,argv到main()。这段代码窥视了这些函数的堆栈。在具有内存保护的系统(例如Linux或Windows)上,具有足够的越界访问权限,应用程序将崩溃。

不要依赖它,因为编译器可以用它做一些完全出乎意料的事情。

是的,它可能导致剥削。如果越界取决于用户输入,那么该用户可能能够读取或写入他们不应该的数据。这是蠕虫或病毒可能传播的方式之一:它们读取密码,或编写将在函数返回时执行的代码。


2
投票

答案很简单 - 未定义的行为。不,你不能相信这个信息,强烈不推荐。不要这样做..

© www.soinside.com 2019 - 2024. All rights reserved.