スタックバッファオーバーフロー
スタックレイアウト、EIP/RIPの上書きを理解し、脆弱なCバイナリ用の実用的なexploitを作成します。
「スタックバッファオーバーフロー」はCoddyKit上の無料Cyber Security Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCyber Security Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cyber Security Academyコースには全4レッスンが含まれています。
バッファオーバーフローとは
バッファオーバーフローは、バッファが保持できる量を超えるデータが書き込まれたときに発生します。余分なデータが隣接するメモリを上書きし、制御構造を破壊したり、プログラムの実行先を変更したりする可能性があります。
スタックメモリのレイアウト
コールスタックには、ローカル変数(バッファ)、保存されたフレームポインタ(SFP)、リターンアドレス(RIP/EIP)が保持されます。リターンアドレスは、関数が戻った後に実行を再開する場所です。ローカルバッファをオーバーフローさせると、リターンアドレスを上書きできる場合があります。
古典的なスタック・スマッシング
プログラムが長さを検査せずにgets()やstrcpy()を呼び出す場合、攻撃者はバッファを埋め尽くすのに十分なバイト数を入力し、リターンアドレスをシェルコードのアドレスや有用なガジェットのアドレスで上書きできます。
// Vulnerable C code:
void vuln() {
char buf[64];
gets(buf); // No bounds checking!
}オフセットを特定する
パターン生成を使って、リターンアドレスに到達するまでのバイト数を特定します。
# Generate a cyclic pattern:
python3 -c "from pwn import *; print(cyclic(200))" | ./vuln
# After crash, find offset:
python3 -c "from pwn import *; print(cyclic_find(0x61616166))"防御策:スタックカナリア
スタックカナリアは、ローカル変数と保存されたリターンアドレスの間に配置されるランダムな値です。戻る前にカナリアが検査され、上書きされていた場合はプログラムが終了します。古典的なオーバーフロー攻撃を悪用するには、この防御を回避する必要があります。
防御策: ASLR
アドレス空間配置のランダム化(ASLR)は、実行ごとにスタック、ヒープ、ライブラリのベースアドレスをランダム化します。現在のアドレスがリークされていなければ、64ビットシステムでジャンプ先を推測するのは事実上不可能です。
防御策: NX/DEP
NX(No-Execute)/ DEP(Data Execution Prevention)は、スタックを実行不可としてマークします。バッファに注入されたシェルコードを直接実行することはできません。そのため、攻撃者はリターン指向プログラミング(ROP)を使う必要があります。
アドレスのリーク
ASLRを突破するには、攻撃者は情報リークを必要とします。情報リークには、フォーマット文字列の脆弱性、ヒープの過剰読み取り(Heartbleedなど)、悪用対象の関数内にある読み取り可能なポインターなどがあります。1つのアドレスがリークされるだけでオフセットが判明し、他のアドレスを計算できるようになります。
基本的なエクスプロイトの作成
防御機構のない基本的な32ビットスタックオーバーフロー:
# Python exploit skeleton (pwntools):
from pwn import *
p = process("./vuln")
offset = 76
shellcode = asm(shellcraft.sh())
payload = shellcode + b"A" * (offset - len(shellcode)) + p32(stack_addr)
p.sendline(payload)
p.interactive()ret2libcの手法
ret2libcは、シェルコードではなくlibcの関数(system()など)へリターンすることでNXを回避します。攻撃者はリターンアドレスをsystemのアドレスで上書きし、引数として"/bin/sh"を渡します。
エクスプロイト開発のためのツール
必須ツール:
- pwntools — Python用エクスプロイトライブラリ
- GDB + pwndbg/peda — エクスプロイト支援機能付きデバッガー
- checksec — バイナリの防御機構を表示
- ROPgadget / ropper — ROPチェーンを検索
checksec --file=./vulnクイックチェック: スタックオーバーフロー
ローカル変数と保存されたリターンアドレスの間にランダムな値を配置し、その値が上書きされるとプログラムを終了させる緩和策はどれですか?
レッスンのまとめ
スタックバッファオーバーフローでは、バッファの範囲を超えてデータを埋めることでリターンアドレスを上書きします。防御機構には、上書きを検出するスタックカナリア、アドレスをランダム化するASLR、実行不可スタックを実現するNX/DEPがあります。ret2libcはNXを回避します。情報リークによってASLRを無効化できます。pwntoolsはエクスプロイト開発を効率化します。
よくある質問
「スタックバッファオーバーフロー」レッスンは無料ですか?
はい。「スタックバッファオーバーフロー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cyber Security Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cyber Security Academyコースには全4レッスンが含まれています。
「スタックバッファオーバーフロー」で何を学びますか?
スタックレイアウト、EIP/RIPの上書きを理解し、脆弱なCバイナリ用の実用的なexploitを作成します。 ブラウザで直接実行するハンズオンコードでCyber Security Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cyber Security Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCyber Security Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「スタックバッファオーバーフロー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCyber Security Academyレッスンでコードを書いて実行できますか?
はい。すべてのCyber Security Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。