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

时间:2018-09-02 18:33:34

标签: c++ string segmentation-fault exploit

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

#include <iostream>

using namespace std;

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

我实际上得到了一个价值。我使用索引(我尝试从100到10000),并且我可能会得到其他字符,或者我可能会得到null。这是否意味着您可以读取您不应该读取的部分内存?你可以利用它进行剥削吗?还是我的脑子虚幻?

2 个答案:

答案 0 :(得分:2)

答案很简单-未定义行为。不,您不能信任此信息,因此强烈建议您不要使用此信息。别做..

答案 1 :(得分:0)

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

如果编译器未对代码进行较大更改,并且std::string实现了短字符串优化,则test[100]将访问调用{{1}的函数之一的堆栈帧}。

这些函数负责加载共享库,安排环境变量,构造诸如main()之类的全局对象,以及创建并将argc,argv传递给std::cout。这段代码探查了这些函数的堆栈。在具有内存保护功能的系统(例如Linux或Windows)上具有足够的出站访问权限时,应用程序将崩溃。

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

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