0

私はインターネット上でいくつかのCコードを次のように見つけました:

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 0x41424344)
        printf("you win!\n");
}

このコードを実行しようとしましたが、ランタイムエラーが発生します。コンパイラが2つの変数を作成し、Cookie値が等しいという1つの条件をチェックしているだけなので、なぜランタイムエラーがスローされるのかわかりません。

cookie変数が初期化されていないことを示すいくつかの回答によると、このエラーが発生するのはそのため、コードを次のように変更しました。

int main() {
    int cookie;
    char buf[80];

    printf("buf: %08x cookie: %08x\n", &buf, &cookie);
    gets(buf);

    if (cookie == 1)
        printf("you win!\n");
}

そして、今回はランタイムエラーが発生しないことを推測してください。

出典:http ://community.coresecurity.com/~gera/InsecureProgramming/stack1.html

前もって感謝します

4

4 に答える 4

2

コードは問題ありません。多くのコンパイラは、実行時エラーをスローすることにより、初期化されていない変数やバッファオーバーフローなどの使用からユーザーを「保護」します。多くの場合、コンパイラフラグを使用してこれをオフにすることができます。

于 2012-07-17T09:47:13.643 に答える
0

cookie初期化されていません

于 2012-07-17T09:46:19.980 に答える
0

コンパイラーは、xin printf(整数型を想定)を指定するために、このコードに対していくつかの警告を生成しますが、ポインターが与えられます。

入力として79文字を超える文字を入力する場合を除いて、このコードで実行時エラーが発生することはありません。重要なのはgets、バッファ(上記のコードでスタックに割り当てられている)は、スタックに流出してリターンアドレスを上書きする大きな入力を与えることによってオーバーランする可能性があるため、使用しないでください。これを利用して、攻撃者は悪意のある入力(リターンアドレスを自分のコードにポイントする)を与え、システム上で任意のコードを実行する可能性があります。

于 2012-07-17T09:48:52.090 に答える
0

「ランタイムエラー」は、コードが。returnの最後に明示的に指定されていないという理由だけで発生していますmain。最後に固執return 0;すると、ideone.comはエラーを報告しません。少なくとも、賢明な入力ではありません。もちろん、このことのポイントは、無意味な入力で何ができるかを確認することです。

于 2012-07-17T10:05:52.260 に答える