【しょしきもじれつこうげき】
書式文字列攻撃 とは?
💡 "%x" と叫んだだけで、金庫の中身が全部読み上げられた
📌 このページのポイント
- printf(user_input) という書き方が根本原因
- %x や %s でスタックのメモリを読み出せる
- %n で任意のアドレスに値を書き込むことができる
- 修正は printf("%s", user_input) と書くだけ
書式文字列攻撃って何をする攻撃なの?
printf(user_input) という書き方をしていると、攻撃者が「%x%x%x」のような書式文字を入力したとき、printfがスタックの値を勝手に読み出して表示してしまうんだよ。
%x って何をするの?
%n というのも聞いたことがあるけど、それはどう使われるの?
%n は「これまでに出力した文字数を変数に書き込む」という特殊な書式文字だよ。スタック上のアドレスを指す位置に %n を来させると、攻撃者が指定したアドレスに任意の値を書き込む手段として使われていたんだ。
修正するのは難しいの?
古い攻撃手法だけど、まだ現役なの?
まとめ:ざっくりこれだけ覚えればOK!
「書式文字列攻撃」って出てきたら「%x を使ってメモリを読み書きする古典的バグ」と思えればだいたいOK!
📖 おまけ:英語の意味
「Format String Attack」 = 書式文字列攻撃
💬 C言語のprintf()などが「書式文字列(format string)」を解釈する仕組みを悪用するため、この名前がついているんだよ。