質問: よくCTFなどで書式化文字列攻撃をするときに`%4$x`というような文字列をprintfで渡したりしますが、この書式化文字列でのドルマークの意味はどういったものでしょうか? 書式文字列攻撃について解説したこのページでも出てきています > > "%n$x"という表記によって、n+1番目の引数があるべき位置の値を表示することもできる。これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。 > > >
回答: 適切な回答がついていますので蛇足です。長くなったのでコメントでなく回答としておきます。 `$` は posix による拡張なので [c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示") (ISO/IEC 9899:1999) では定義されていません。そのため非 posix な環境、たとえば Visual C とか組み込み系コンパイラ(の stdio ライブラリ)では `$` をサポートしていません。 提示リンク先にある `%n` のほうは標準です( [c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示") に記載あり)。 ですが安全性確保のため Visual C ではデフォルト状態では使えないようになっています。 同様 [c11](/questions/tagged/c11 "'c11' のタグが付いた質問を表示") では `%n` を削除した `printf_s` が追加されています。互換性確保のため `printf` から `%n` を削除することはできなかったらしい。