2011-08-16 11 views
2

私はセキュリティユニットを勉強していますが、私はフォーマットストリング攻撃を理解しようとしています。誰かが私にこれを説明しようとしてもらえますか?フォーマットストリングCでの攻撃

次のコードをから取得され: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はどこから来たのか?

+1

シェルコードです。 –

答えて

3

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

この脆弱性はそのドキュメントで非常に慎重に説明されています。スタックフレームの典型的なレイアウトを理解していることが期待されています(表でも説明しています)。スタックアドレスは通常、下向きに大きくなります。つまり、実際に渡された引数よりも多くの引数を "ポップ"する関数呼び出しは、それ自身の下のスタックフレームからローカル変数を読み始めます。これはこのシェルコードが利用するものです。

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