web-dev-qa-db-ja.com

C-%xフォーマット指定子

ちょっとした質問があります。 %xフォーマット指定子を使用して、フォーマット文字列攻撃でスタックから値を読み取ることができることを知っています。

私は次のコードを見つけました:

%08x%08x%08x%08x

08はどういう意味ですか?それは正確に何をしていますか?ありがとう:)

56
Matthew

壊す:

  • 8は、8桁を表示することを示しています
  • 0を空白スペースの代わりに0でプレフィックスしたい
  • x小文字の16進数で印刷したい。

簡単な例(Grijesh Chauhanに感謝):

#include <stdio.h>
int main() {
    int data = 29;
    printf("%x\n", data);    // just print data
    printf("%0x\n", data);   // just print data ('0' on its own has no effect)
    printf("%8x\n", data);   // print in 8 width and pad with blank spaces
    printf("%08x\n", data);  // print in 8 width and pad with 0's

    return 0;
}

出力:

1d
1d
      1d
0000001d

また、 http://www.cplusplus.com/reference/cstdio/printf/ も参照してください。

112
sonicwave

これは、表示する桁数を指定します。

整数値または最小フィールド幅を指定する*。結果には、必要に応じて、右揃えの場合は左側に、左揃えの場合は右側にスペース文字(デフォルト)が埋め込まれます。 *を使用する場合、幅はint型の追加の引数で指定されます。引数の値が負の場合、-フラグが指定され、正のフィールド幅になります。

2
Tony The Lion

%08xは、すべての数字を少なくとも8文字幅で印刷する必要があることを意味します。 「1」の出力は00000001になります

2
Vladimir

あなたが言及したprintfに対するフォーマット文字列攻撃は、「%x」フォーマットに固有のものではありません。printfが渡された変数よりも多くのフォーマットパラメータを持っている場合は、それに属さないスタックから値を読み取ります。たとえば、%dでも同じ問題が発生します。 %xは、これらの値を16進数として表示する場合に役立ちます。

前の回答で説明したように、%08xは8桁の16進数を生成し、先頭にゼロが埋め込まれます。

追加のパラメーターなしで、printfのコード例でフォーマットを使用します。

printf ("%08x %08x %08x %08x");

スタックから4つのパラメーターを取得し、8桁の埋め込み16進数として表示します。

1
IamTheWalrus

から http://en.wikipedia.org/wiki/Printf_format_string

widthオプションが指定されている場合、スペースの代わりに0を使用してフィールドを埋めます。たとえば、printf("%2d", 3)は "3"になり、printf("%02d", 3)は "03"になります。

1
David Ranieri