バイナリ解析とスタックエクスプロイト
『はじめて学ぶバイナリ解析』で学んだ、低レイヤのメモリ破壊脆弱性とその悪用。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