質問: よくCTFなどで書式化文字列攻撃をするときに`%4$x`というような文字列をprintfで渡したりしますが、この書式化文字列でのドルマークの意味はどういったものでしょうか? 書式文字列攻撃について解説したこのページでも出てきています 書式指定文字列攻撃 > > "%n$x"という表記によって、n+1番目の引数があるべき位置の値を表示することもできる。これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。 > > >
回答: POSIX仕様です。`%4$x`は可変引数の4番目の引数を参照することを指示します。 > > これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。 > > > は脆弱な環境での話で、POSIX仕様上は > > When numbered argument specifications are used, specifying the Nth argument requires that all the leading arguments, from the first to the (N-1)th, are specified in the format string. > > > と指摘されています。そもそもC言語の可変引数では各引数が何バイトになるか不明なため、`(N-1)th`までの引数が使われていないことには`Nth`の正確なアドレスは決定できません。(K&R C仕様から不明な引数は`int`と見なすべき...という考え方もできなくはない?) ちなみにVisual C++ですが、`$`形式はPOSIX仕様でありC言語仕様ではないため、`printf`系関数はこの機能をサポートしていません。ただし、全く使えないわけではなく、全ての`printf`系関数に対応する`printf_p`関数が用意されていて、こちらのバージョンを使用することで`$`形式を使用できます。