コース目次 / 第5章

まとめ — メモリという、共通の土台

アドレス・ポインタ演算・文字列の無境界性・バッファオーバーフローの観察を畳みます。この土台が、次のアセンブリ、そしてrev/pwnの入口になることを確認します。

第5章 / 全6章目安 約3分この章のゴール: Cのメモリモデルを畳み、次のアセンブリコースへの道筋を持つ

変数がメモリ上のバイト列であること、ポインタがそのアドレスを値として持つこと、C言語には文字列の境界チェックが無いこと、そしてバッファオーバーフローが実際に何を壊すのか。この4つを、自分の手を動かして見ました。

このコース・早見表

章 見たこと
変数とアドレス &(アドレスを取る)と *(中身を読む)は対の操作
配列とポインタ演算 nums[1] = *(nums+1)。演算は型のサイズ単位で進む
文字列とバッファ \0 までがC文字列。strcpy は箱の大きさを知らない
バッファオーバーフロー 箱を超えた書き込みは、隣接メモリを侵食する。多層防御がそれを安全な形に変える

すべての章が、同じ1つの見方に貫かれていました——「これはメモリ上の、どこから、何バイトのデータか」。この問いを持てるようになったことが、このコースの成果です。

次の道 — アセンブリへ

次は「コンピュータのしくみ — アセンブリで読む CPU とスタック」です。このコースで見た「メモリの動き」を、今度はCPUが実際に実行する命令のレベルで読みます。gdb で見た戻り先アドレスや、関数の呼び出しが、アセンブリではどういう命令の並びとして表現されているか——今日の観察の、もう一段下の層です。

このコースの実習は、すべて自分がその場でコンパイルした、自分だけのプログラムに対してでした(法と倫理)。メモリの仕組みを知った今、この知識はrev(リバースエンジニアリング)とpwn(バイナリ攻略)という、CTFの2つの大きなカテゴリの土台にもなります。

お疲れさまでした。あなたはもう、変数を「値」としてだけでなく、「メモリ上の、ある場所にある、あるバイト数のデータ」として見られます。

こうなっていればOK

この章で卒業です。

この章はまだ完了していません。