1

整数オーバーフローの脆弱性を示すために、このコードを変更する必要があります。今までやったことがないので、有利なスタートが必要です。

#include <stdio.h>

int myprintf(char* argv){
    printf("%s\n", argv);
    return 0;
}

int myprintf2(char* argv){
    printf("hello world\n");
    return 0;
}

int main(int argc, char** argv){
    struct foodata{
        int (*fptr)(char*);
        int buf[4];
    } foo;
    foo.buf[0] = 0xdeadbeef;
    foo.fptr = myprintf;
    foo.buf[0xffffffff] = myprintf2;
    foo.fptr(argv[1]);
    return 0;
}
4

1 に答える 1

1

Ok。したがって、少なくとも一部の32ビットプラットフォームでは、コードは出力さhello world\nれ、ユーザーからの引数は出力されません。他の配列を操作して関数ポインタを変更しました。今度は悪意のある目的で使用したいと思います。

まず、次myprintf2のように、チェックせずに呼び出された場合、危険なものに置き換えます。

void set_authorized(void) {
    authorized = 1;
}

ここで、ユーザーからいくつかの入力を取得する必要があります。たとえばbuf、入力が有効であると思われる場合は、4つの数値を読み取り、それらの合計をのインデックスとして使用します。

int a, b, c, d;
do {
    scanf("%d%d%d%d", &a, &b, &c, &d);
} while (a < 0 || b < 0 || c < 0 || a + b + c > 4);
buf[a+b+c] = d;

配列の外に書き込むことはできなかったようですよね?いいえ、攻撃者はデータを使用できます

a = INT_MAX;
b = 1;
c = INT_MAX;
d = (int)set_authorized

INT_MAX + 1 + INT_MAX = INT_MIN + INT_MAX = -1(0xffffffff)。したがって、基本的にはあなたの例のような動作をしますが、今回は非特権ユーザーにいくつかの権限を付与します。

注:この例を64ビットプラットフォームで動作させるには、0xffffffffを0xffffffffffffffffに置き換えint buf[4];ますlong buf[4]

于 2012-12-08T18:32:46.260 に答える