4

コード:

void doit()
{       
      system("/bin/sh");
      exit(0); 
}       

int main(int argc, char **argv)
{       
    static int the_var;
    char buf[512];

    the_var = 20;

    strncpy (buf, argv[1], sizeof(buf) - 1);

    printf (buf);

    if (the_var != 20)
    {
            doit();
    } else {
            printf ("\nthe_var @ 0x%08x = %d 0x%08x\n", &the_var, the_var, the_var);
    }
}

プログラムはスティッキー ビット (所有者の uid 0) で実行されています。私がしなければならないことは、それをクラックし/bin/shてルートとして実行することだけです。

でプログラムをクラックする方法を知っていfeます。バッファオーバーフローとstrcpy(シェルコード)ですが、これに対して「フォーマット文字列攻撃」を使用する方法はありません。

ご覧のとおり、 があり、var the_varそれが 50 に等しくない場合は、シェルが実行されています (何らかの方法で変更しようとするかもしれませんが、いくつかの汚い魔法ですか?)。とにかく、あるprintf (buf)

4

1 に答える 1

5

あなたがコントロールしbufます。フォーマット文字列を渡し%xてスタックをダンプし、スタック内%nのオブジェクトを上書きしthe_varます。the_varオブジェクトが上書きされた場合、プログラムからdoit関数が呼び出されて/bin/sh実行されます。

于 2012-06-17T09:06:14.877 に答える