バイナリ解析とスタックエクスプロイト

『はじめて学ぶバイナリ解析』で学んだ、低レイヤのメモリ破壊脆弱性とその悪用。CTF の pwn 系問題の基礎をなす。

環境とツール

  • gdb + gdb-peda(レジスタ/スタック/コードを一画面で表示)、nasm、pwntools。脆弱性タイプは CWE(例: CWE-119 バッファエラー)で分類。
  • 汎用レジスタ EAX/EBX/ECX/EDX、特殊レジスタ ESP(スタックポインタ)/EBP(ベースポインタ)/EIP(次に実行する命令)。スタックはメモリ番地の大きい方へ伸びる。

関数呼び出しとスタックフレーム

  • call は EIP を push(リターンアドレス)してジャンプ、ret は pop して戻る。プロローグ push ebp; mov ebp,esp; sub esp,N、エピローグ mov esp,ebp; pop ebp; ret
  • 引数はスタック経由(32bit)で [ebp+0x8] から参照。AT&T 記法

攻撃手法

  • バッファオーバーフロー: scanf 等で配列境界を越えて書き込み、隣接変数やリターンアドレスを上書きする。pattc/patto でオフセットを特定し、pwn 関数のアドレスへ書き換える。
  • ASLR 無効化: kernel.randomize_va_space=0
  • Return to libc: 標準ライブラリの system を呼んでシェルを取る。ただし 64bit では引数6個までがレジスタ渡しになるため単純な BOF では困難。

ELFフォーマット / glibc malloc / cpu-side-channel-attacks と同じ低レイヤセキュリティ圏。関連: _moc-book-notes