ポイントは、%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が書き込まれる)