セキュリティ · 低レイヤー・システム

C言語 — ポインタとメモリ

自分の環境の gcc と gdb で、変数がメモリ上のバイト列であることを見ます。最終章で BOF を観察のみ行い、武器化はしません。

実習
localhost で実習
環境構築
重さ 1 / 3
前提
mini-cpp / mini-linux(gcc が使えること)
倫理
第0章の法と倫理ゲートへの同意が必須です。

読み込み中…

教育目的・自作物限定のコースです。自分の環境の gcc と gdb を使い、変数がメモリ上のバイト列であることを見ます。最終章のバッファオーバーフローは「なぜ壊れるか」の観察までで、武器化(シェルコードや ROP の自動化)は扱いません。

章の一覧

  1. 未完了第0章はじめに — メモリという、1本の連続した空間変数がメモリ上のアドレスとバイト列であるという見方を導入します。このコースが自分のgcc/gdbで進むことを確認し、法と倫理ゲートに同意します。約6分次はここ
  2. 未完了第1章変数はメモリのバイト列 — アドレスとポインタprintf %pで変数のアドレスを実際に表示し、sizeofでバイト数を確認します。ポインタが「アドレスを値として持つ変数」であることを、&と*の対応で理解します。約10分次はここ
  3. 未完了第2章配列とポインタ演算配列の添字アクセスnums[1]が、実はポインタ演算*(nums+1)と同じであることを、アドレスの差を測って確認します。ポインタ演算が型のサイズ単位で進むことを理解します。約9分次はここ
  4. 未完了第3章文字列とバッファ — C に境界チェックは無いC文字列がヌル終端されたバイト列にすぎないこと、strcpyが渡された箱の大きさを一切知らないことを確認します。バッファのサイズと、書き込む長さの不一致が、この先の穴の芯だと理解します。約10分次はここ
  5. 未完了第4章バッファオーバーフローを観察する(最終章)gdbで、8バイトの箱に書き込まれたAAAA...がその境界を越えて隣接メモリに広がる様子を、生バイトで見ます。保護なし/ありでのクラッシュの違いから、スタックカナリアという多層防御を観察します。武器化はしません。約14分次はここ
  6. 未完了第5章まとめ — メモリという、共通の土台アドレス・ポインタ演算・文字列の無境界性・バッファオーバーフローの観察を畳みます。この土台が、次のアセンブリ、そしてrev/pwnの入口になることを確認します。約3分次はここ

詰まったときはお助けページへ。章ごとのファイル一式をダウンロードして、途中から再開できます。