コース目次 / 第0章
はじめに — メモリという、1本の連続した空間
変数がメモリ上のアドレスとバイト列であるという見方を導入します。このコースが自分のgcc/gdbで進むことを確認し、法と倫理ゲートに同意します。
これまでのコースで、あなたはたくさんの「壊れ方」を見てきました。でも、それらはすべて JavaScript という、比較的守られた言語の上で起きていました。このコースからは、もっと下の層——メモリそのものを見ます。
コンピュータの中身は、1本の巨大なバイト列
プログラムが動くとき、変数も、コードも、すべてはメモリという1本の連続したバイト列の、どこかに置かれています。「変数」とは、“このアドレスから、このバイト数ぶん”という約束にすぎません。
int x = 42; と書けば、メモリのどこかにアドレスが割り当てられ、そこに4バイトで 42 という値が並びます。この「アドレス+バイト数」という見方が、C言語を読むための、そしてこの先の pwn・rev・監査を読むための、最も基本の道具です。
このコースの進め方
法と倫理ゲート
手を動かす前に
このコースは攻撃の技術に触れます。実習してよい相手は、次の3つだけです。
- (a) 自分で作った練習用のやられ環境(このサイトが配る自作ターゲット)
- (b) あなた自身の許可された環境(自分の Thousand SKY・secret-notes-ctf など)
- (c) CTF 競技の中(規約の範囲で)
実在する第三者のシステムを許可なく触ることは、不正アクセス禁止法に触れます。 このゲートは、その線引きを毎回の入口で確かめるためのものです。詳しくは「セキュリティの法と倫理」へ。
このコースは、あなた自身の環境の gcc(コンパイラ)と gdb(デバッガ)を使います。mini-cpp や mini-linux を通っていれば、すでに使える状態のはずです(gcc –version で確認)。ブラウザだけで完結する特別な仮想環境は使いません——ここから先は、あなたの手元の、本物のコンパイラとデバッガで進みます。
Windows の人へ。WSL(Windows Subsystem for Linux)の中で gcc/gdb を使うのが、いちばん確実です。mini-linux で WSL に触れていれば、その環境がそのまま使えます。
このコースの地図
| 章 | 学ぶこと |
|---|---|
| 第1章 | 変数はメモリのバイト列 — アドレスとポインタ |
| 第2章 | 配列とポインタ演算 |
| 第3章 | 文字列とバッファ — C に境界チェックは無い |
| 第4章 | バッファオーバーフローを観察する(最終章) |
最終章では、自分で書いた小さなプログラムが、自分の手元で、なぜ・どう壊れるかを見ます。壊す相手は常に、自分がその場でコンパイルしたプログラムだけです(法と倫理)。シェルコードを仕込んだり、任意コード実行を成立させたりする武器化は、このコースの範囲外です。
準備ができたら、次の章へ。まずは、変数のアドレスを実際に覗いてみます。
こうなっていればOK
卒業まであと5章です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。