Cのprintfでの$(ドルマーク)の意味


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

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

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

>
> "%n$x"という表記によって、n+1番目の引数があるべき位置の値を表示することもできる。これでスタックの先の方も覗けるし、何番目の書式指定文字か気にする必要が無くなる。




[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)が用意されていて、こちらのバージョンを使用することで`$`形式を使用できます。




[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)が用意されていて、こちらのバージョンを使用することで`$`形式を使用できます。

