バッファオーバーフローしてみる
- この章では、C言語で書かれたプログラムの脆弱性を通して、1章で見たメモリの構造のうち、スタックについての理解を深めます。
用語説明
- Pwn
- セキュリティのコンテスト、CTFの分野のひとつ。バイナリに関わる脆弱性の問題が出題される。
- checksec
- pwntools
- Pwnを行うときに使う便利なツール(Pythonライブラリ)
各セキュリティ機構
主なセキュリティ機構の説明
- RELRO
- RELocation Read Only
- GOT領域を読み込みOnlyにする
- GOT領域を書き換えると嬉しい
- GOT領域とは?
- 共有ライブラリ関数のアドレス一覧表。
- ここを書き換えると任意関数へのアドレスに変更して任意関数を実行できる
- STACK CANARY
- NX
- RIPが変なところに飛ばないようにする(text領域だけのはず)
- PIE
- RPATH, RUNPATHはなにか?
- Symbols
- FORTIFY
- Fortified
- Fortifiable
- FILE
- ASLR
- OSの持つセキュリティ機構
- スタックやヒープのアドレスをランダムにする
# ASLRをOFFにする
$ sudo sysctl -w kernel.randomize_va_space=0
# ASLRをONにする(演習が終わったら必ずONに戻してください)
$ sudo sysctl -w kernel.randomize_va_space=2
セキュリティ機構 goとの違い
- goはコンパイラオプションをデフォルトにすると以下のようになる
$ checksec --file=main
RELRO STACK CANARY NX PIE RPATH RUNPATH Symbols FORTIFY Fortified Fortifiable FILE
No RELRO No canary found NX enabled No PIE No RPATH No RUNPATH 2695 Symbols No 0 0 main
- RELRO, STACK CANARY, PIEがオフ
- これは、言語の方でメモリ周りの脆弱性が起こらないようにしているのでバイナリに保護機能はつけなくてよい、というgoの戦略に基づいたもの(goは脆弱!というわけではないことに注意)
- しかし、cgo(C言語を使えるgolang), unsafe(rawポインタ操作を許す構文)を使った上でコンパイラオプションをそのままにしていると...?
- おそらくPython3で
import pwn
が使えるようになっていると思います。
- pwntoolsは様々な機能がありますが、今回使うのは以下です。
- 使う機能
- context 最初の設定
- process プロセスを生成。実行ファイルを実行する
- p64 アドレスをpayload向けに変換してくれる
- sendline バイト列を送り込む
- interactive 対話環境に入る。シェルをとったあとに使う。
- documentは https://pwntools.readthedocs.io/en/latest/index.html です。
簡単なバッファオーバーフローをやってみよう
ASLRオフ
gdbの使い方
RSPの書き換え
skip rbp https://qiita.com/ssssssssok1/items/b8ffca6b68149812c335
ret2esp http://www.intellilink.co.jp/article/column/ctf01.html
16byte align https://uchan.hateblo.jp/entry/2018/02/16/232029