2

C++ で単純なバッファ オーバーフローをテストしています。この例は、チェックが実施されていない場合、悪意のあるユーザーがバッファ オーバーフローを使用して変数を上書きできるテストです。

この例では、バッファを定義してから変数を定義しています。これは、バッファにスペースを割り当ててから、変数にスペースを割り当てる必要があることを意味します。この例では、長さ 5 のバッファーを読み取りcin、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 文字を入力したときだけです。これは、さまざまなコンパイラとプログラムへのメモリの割り当て方法に関係していますか?

私の 2 番目の Linux マシンはまったくオーバーフローしません。13 番目の文字の後でのみ、ダンプ エラーが発生します。

なぜそんなに違うのですか?

4

2 に答える 2

1

あなたが発見したように、未定義の動作は未定義です。それを説明しようとしても、一般的にあまり生産的ではありません。

この場合、コンパイラ/システム間で異なるローカル変数によって/間に挿入されたスタックとパディングバイトの配置が原因であることがほぼ確実です。

于 2013-09-16T21:19:38.790 に答える