コース目次 / 第4章
まとめ — 読む力を、CTFの入口に
レジスタ・呼出規約・スタックフレーム・分岐とループの読み方を畳みます。sec-cとつながる形で理解を固め、revとpwnという2つのCTFカテゴリへの土台を確認します。
レジスタ、呼出規約、スタックフレーム、条件分岐とループ。x86-64 アセンブリを、実際にコンパイルしたコードで読みました。
アセンブリ読解・早見表
| 見るもの | 読み方 |
|---|---|
| 引数 | rdi, rsi, rdx, rcx, r8, r9 の順に渡る(System V AMD64) |
| 関数の入り口 | push rbp / mov rbp,rsp(スタックフレームを作る) |
| 関数の出口 | pop rbp / ret(畳んで、戻り先アドレスへジャンプ) |
| ローカル変数 | [rbp-オフセット] で読み書き |
| 条件分岐・ループ | cmp で比較 → jxx 系がフラグを見て飛ぶ |
| 読む手順 | ジャンプ先に印を付け、ブロックに分けて意味を言語化する |
これは、初めて出会うどんなアセンブリにも通用する共通の骨格です。関数がどれだけ複雑でも、「引数はどこから来て」「フレームはどう作られ」「どこで比較して、どこへ飛ぶか」という同じ問いを、繰り返し当てはめれば読み解けます。
sec-c と、つながって
sec-c で見た「戻り先アドレスの上書きでクラッシュする」現象は、いま「ret がスタック上の戻り先アドレスを信じてジャンプする」という、具体的な命令の話として理解できるようになりました。上のレイヤー(C言語)で見た現象が、下のレイヤー(アセンブリ)でどう実現されているかをつなげる——これが、低レイヤーを学ぶ意味です。
次の道 — rev と pwn へ
このコースの読み方は、CTF の2つのカテゴリでそのまま主力になります。rev(リバースエンジニアリング)——バイナリを読んで、隠された条件やロジックを解き明かす。pwn(バイナリ攻略)——sec-cで見たようなメモリの穴を、実際のプログラムの制御に応用する。どちらも、この「読む力」が土台です。
このコースの実習も、すべて自分がその場でコンパイルしたプログラムに対してでした(法と倫理)。他人のバイナリを無断で解析する行為は、この先も対象外です。
お疲れさまでした。あなたはもう、0と1の羅列に見えていた命令の並びから、意味を読み取れます。
こうなっていればOK
この章で卒業です。
この章はまだ完了していません。
保存できませんでした(プライベートブラウズ中かもしれません)。この端末に進捗は残りませんが、先へは進めます。