2021-09-09 · 2분
バッファオーバーフロー(BOF)
バッファオーバーフロー脆弱性の入門:それが何か、HackCTF #1 の fgets(s, 45, ...) がサイズ 40 のバッファへの入力で s[40] を超えて v5 を制御する仕組み、そして境界のない scanf("%s") で SFP と戻りアドレスを上書きできること。
2021-09-09 · 2분
この記事は公開から2年以上経過しています。
FSB(Format String Bug)
FSB(Format String Bug)とは、バッファオーバーフローのハッキング技法の一つであり、ユーザーの入力を通じてプログラムの流れを変えられる脆弱性である。

printf("%d", 変数); と printf("%d")
右の状況では FSB 脆弱性が発生し、main 関数スタックの内容をすべて露出させられます。

2 番目に AAAA が入った様子である
上のように入力すると次のスタックのメモリを漏洩できます。上では 2 番目の %p に私たちが入力した AAAA が入った様子が確認できます。このとき offset は 2 です。
<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>
実際の fsb コードでは非常に複雑になりますが、これを Python の pwntools で簡単に解決できます。
fmtstr_payload(offset, writes) を使うと、とても簡単に fsb ができます。
fmtstr_payload(6, {e.got['printf']:e.symbols['win']})
上のように書くと、offset が 6 のとき printf を win 関数にすることができます。
参考
もっと見る
原文(韓国語): tistory — 2021-09-09 公開、当ブログへ移行。この翻訳は AI の協力で作成されました。
…