2021-09-09 · 2

FSB(Format String Bug)

securitypwnable

この記事は公開から2年以上経過しています。

FSB(Format String Bug)


FSB(Format String Bug)とは、バッファオーバーフローのハッキング技法の一つであり、ユーザーの入力を通じてプログラムの流れを変えられる脆弱性である。

FSB(Format String Bug)

  1. printf の引数の個数はフォーマット文字の個数で決まります。
  2. buf の値を私たちが自由に入力できるなら、望むフォーマット文字を入れて操作が可能になります。
  3. BOF が発生しなくても望む値を得られます。

printf("%d", 変数); と printf("%d")

右の状況では FSB 脆弱性が発生し、main 関数スタックの内容をすべて露出させられます。

%p 出力

  1. %p を通じて次のアドレスを漏洩でき、%[数字]$p を通じて数字分だけ離れたメモリを出力できる。

2 番目に AAAA が入った様子である

上のように入力すると次のスタックのメモリを漏洩できます。上では 2 番目の %p に私たちが入力した AAAA が入った様子が確認できます。このとき offset は 2 です。

%n 入力

  1. 今度は漏洩させるだけでなく、スタックの値を改ざんするものです。
  2. %n は指定された変数に、%n の前まで出力された文字の個数を 10 進数形式で書き込みます。
  3. %n : 4byte、%hn : 2byte、%hhn : 1byte

printf のフォーマット文字

<table style="border-collapse: collapse; width: 100%; height: 180px;" border="1" data-ke-align="alignLeft"><tbody><tr style="height: 20px;"><td style="width: 50%; text-align: left; height: 20px;">%s</td><td style="width: 50%; text-align: left; height: 20px;">文字列を '\0' に出会うまで出力</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%c</td><td style="width: 50%; height: 20px;">文字 1 個</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%d</td><td style="width: 50%; height: 20px;">+/- 符号あり整数型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%x</td><td style="width: 50%; height: 20px;">整数を 16 進数小文字で</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%p</td><td style="width: 50%; height: 20px;">0x~ 形式のポインタ値を出力、%lx と同じ</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%lx</td><td style="width: 50%; height: 20px;">8byte 16 進数を出力</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%ld</td><td style="width: 50%; height: 20px;">long 整数型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%f</td><td style="width: 50%; height: 20px;">実数型</td></tr><tr style="height: 20px;"><td style="width: 50%; height: 20px;">%u</td><td style="width: 50%; height: 20px;">符号なし整数 </td></tr></tbody></table>

python では

実際の fsb コードでは非常に複雑になりますが、これを Python の pwntools で簡単に解決できます。

fmtstr_payload(offset, writes) を使うと、とても簡単に fsb ができます。

fmtstr_payload(6, {e.got['printf']:e.symbols['win']})

上のように書くと、offset が 6 のとき printf を win 関数にすることができます。

参考

もっと見る

https://snwo.tistory.com/147

https://jiravvit.tistory.com/entry/64bit%EC%97%90%EC%84%9C-FSB-Format-String-Bug-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1


原文(韓国語): tistory — 2021-09-09 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。

コメント

コメントを削除しますか?

関連記事

FSB(Format String Bug) · 나봄하랑