2

私はセキュリティユニットを研究していて、フォーマット文字列攻撃を理解しようとしています。誰かが私にこれを説明しようと試みてもらえますか?

次のコードは次のコードから取得されます: http: //julianor.tripod.com/bc/tn-usfs.pdf

/*
 * fmtme.c
 *       Format a value into a fixed-size buffer
 */
#include <stdio.h>
int
main(int argc, char **argv)
{
    char buf[100];
    int x;
    if(argc != 2)
        exit(1);
    x = 1;
    snprintf(buf, sizeof buf, argv[1]);
    buf[sizeof buf - 1] = 0;
    printf("buffer (%d): %s\n", strlen(buf), buf);
    printf("x is %d/%#x (@ %p)\n", x, x, &x);
    return 0;
}

私が理解しているように、%nフォーマット指定子は指定されたアドレスをメモリに読み戻すために使用されprintf、スタックから値をポップすると、アドレスを読み取る必要があります。私はこれをやってのけることができないようです。

このドキュメントでは、次の例が提供されています。

perl -e 'system "./fmtme", "\x58\x74\x04\x08%d%n"'

どこ\x58\x74\x04\x08%d%nから来たの?

4

1 に答える 1

3

「\x58\x74\x04\x08%d%n」は「シェルコード」です。

このエクスプロイトは、そのドキュメントで非常に注意深く説明されています。スタック フレームの一般的なレイアウトをある程度理解していることを前提としていると思います。これについては、表でも説明されています。通常、スタック アドレスは下に向かって成長することに注意してください。つまり、実際に渡されたよりも多くの引数を「ポップ」する関数呼び出しは、それ自体の下のスタック フレームからローカル変数の読み取りを開始します。これが、このシェル コードが利用するものです。

の最初の 4 バイトにアドレスを入れbuf(snprintf がそこに出力するため)、x変数を (その下のフレームから) スキップし、最後に の最初の部分からアドレスを読み取りbuf(ただしポインターとして解釈されます)、書き込みます。 %n 形式のコードを介して値を指定します。

于 2011-08-16T03:10:37.557 に答える