1

いくつかのテキストを読んで、Cの配列のサイズを超えて書き込もうとして遊んでいました。つまり、バッファオーバーフローです。このテキストは、配列の長さが5のときに書き込もうとするとarray[5]、セグメンテーション違反が発生することを示していますが、以下のコードを使用すると、セグメンテーション違反が発生しないようです。コードは実際に実行されます。

#include <stdio.h>
#include <string.h>

int main ()
{
    int i;
    int array[5] = {1, 2, 3, 4, 5};
    for (i = 0; i <= 255; i++)
    {
        array[i] = 10;
    }
    int len = sizeof(array) / sizeof(int);
    printf("%d\n", len);
    printf("%d\n", array[254]);
}

最後のステートメントを実行すると、a10が出力されます。これが脆弱性なのか、それとも私が見逃しているものがあるのか​​疑問に思っています。MacBookProでiterm2のコードを実行しています。

4

3 に答える 3

4

終わりを超えて書くことは未定義動作です-何かが起こる可能性があります。

于 2012-06-15T21:10:31.120 に答える
1

配列の終わりを超えてデータを書き込んでいます。これは未定義の動作です。未定義の動作は、金曜日には機能する可能性がありますが、土曜日にはクラッシュすることを意味します。

これは、未定義の動作であると言うC段落です。

(C99、6.5.3.2p4)ポインターに無効な値が割り当てられている場合、単項*演算子の動作は定義されていません。

于 2012-06-16T01:16:30.073 に答える
0

現在のプロセスが所有するメモリを調べることができます。そのメモリブロックの最後に到達すると、EXC_BAD_ACCESSエラーが発生します。OSがコードを強制終了するまでループするこの修正バージョンのコードを試してください。

#include <stdio.h>
#include <string.h>

int main(int argc, const char * argv[])
{
    int i = 0;
    int array[5] = {1, 2, 3, 4, 5};
    while (1)
    {
        printf("%llu - %d\n", i, array[i]);
            // if (&i == &array[i]) printf("Overwriting i\n");
            // array[i] = 2;
        ++i;
    }
}

コメントアウトされた行のコメントを外すと、iの値が3と6の間の無限ループに陥っていることがわかりますi。整数のアドレスにあるメモリを上書きしています。

于 2012-06-15T21:33:24.817 に答える