41465
よくCTFなどで書式化文字列攻撃をするときに`%4$x`というような文字列をprintfで渡したりしますが、この書式化文字列でのドルマークの意味はどういったものでしょうか?

書式文字列攻撃について解説したこのページでも出てきています

[書式指定文字列攻撃](http://d.hatena.ne.jp/kusano_k/20140302/1393781714)

>
> "%n$x"という表記によって、n+1番目の引数があるべき位置の値を表示することもできる。これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。
CC BY-SA 4.0
2018-02-04T14:09:13.270
41464
2021-03-29T00:41:07.437
2021-03-29T00:41:07.437
3060
5246
question
c security
Cのprintfでの$(ドルマーク)の意味
[POSIX仕様](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fprintf.html)です。`%4$x`は可変引数の４番目の引数を参照することを指示します。

> これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。

は脆弱な環境での話で、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`関数](https://docs.microsoft.com/ja-
jp/cpp/c-runtime-library/printf-p-positional-
parameters?view=msvc-160)が用意されていて、こちらのバージョンを使用することで`$`形式を使用できます。
CC BY-SA 4.0
2018-02-04T14:33:43.427
41465
2021-03-28T21:29:46.840
2021-03-28T21:29:46.840
4236
4236
41464
answer
適切な回答がついていますので蛇足です。長くなったのでコメントでなく回答としておきます。

`$` は posix による拡張なので [c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示")
(ISO/IEC 9899:1999) では定義されていません。そのため非 posix な環境、たとえば Visual C とか組み込み系コンパイラ（の
stdio ライブラリ）では `$` をサポートしていません。

提示リンク先にある `%n` のほうは標準です（ [c99](/questions/tagged/c99 "'c99' のタグが付いた質問を表示")
に記載あり）。  
ですが安全性確保のため Visual C ではデフォルト状態では使えないようになっています。  
<https://msdn.microsoft.com/ja-jp/library/hf4y5e3w.aspx>  
同様 [c11](/questions/tagged/c11 "'c11' のタグが付いた質問を表示") では `%n` を削除した `printf_s`
が追加されています。互換性確保のため `printf` から `%n` を削除することはできなかったらしい。  
<https://www.buildinsider.net/language/clang/02>
CC BY-SA 3.0
2018-02-04T23:34:47.137
41467
2018-02-04T23:34:47.137
8589
41464
answer