書式指定文字列 脆弱性 サイバー攻撃 

ポイントは、%2$n が二つ目の引数で指定した、アドレスに書き込むというところ。

 int secert = 'secert';
printf(%100c$2$n,'a',&secert);

これは ポインタ変数 secret のアドレスに100を書き込んでいる。

それでは攻撃の場合はどうなっているかというと、

./overwrite2 $(python -c 'print "\xb4\xec\xff\xbf" + "%96C%6$n")


6番目の引数のあるはずのメモリの場所にある値を、アドレスとして解釈して書き込む。

まず、アドレスの文字列がメモリのどこかに書き込まれる。
そのアドレスは、調査の結果6番目の引数の場所である。
なので、

1: /xb4\xec\xff\xbf がメモリのどこかに書き込まれる。そのアドレスは、調査の結果6番目の引数の場所である。
2: %96Cで 出力した文字数は合計100になる。
3: %6$nで六番目の引数のメモリの値をアドレスとして解釈し、そこに100が書き込まれる。(1:のアドレスに100が書き込まれる)