2026年6月に合格したOSCP+から2か月ほど勉強し、今回はOSEDに合格しました。
筆者の背景・受験の理由
サイバーセキュリティに携わっているとバッファオーバーフローは稀によく聞く脆弱性であるものの、実際にどのような原理で動作しているのか体系的には理解していませんでした。高専時代のZ80/H8マイコンを使った演習や、各種CTFへの参加、SANS SEC660への参加を経験してきたため、ある程度アセンブリは雰囲気で読み書きでき、シェルコードやROPはなんとなく手を動かすことができるものの、しっかりと体系的に理解したいという思いがありました。
OSEDとは
OSEDはWindowsのユーザーモードエクスプロイトの技術を問われる試験で、トレーニングとしてはEXP-301が対応します。他のトレーニングと比較すると、「Windows」の「x86」の「ユーザーモード」で「スタック中心でヒープはあまり扱わない」が特徴になるかと思います。上位のEXP-401ではセキュリティ機構のバイパスやヒープ操作、x64が扱われます。EXP-401はより高度な内容を扱い、受講するにはライブトレーニングに参加する必要があります。昔はBlackHat等海外まで遠征して受講する必要がありましたが、最近では国内のCODE BLUEでも受講できるようになりましたね。176万かかるので予算の調整も大変ですが、機会があれば受けてみたいところです。
似た内容としては以前にSANSのSEC660を受講しました。SEC660は5日間の受講期間のうち5日目がWindowsのエクスプロイトに充てられています。幅広いトピックを学ぶならSEC660の方が優れていますが、Windowsのエクスプロイトに焦点を絞るのであればOSEDの方がテキストやラボが豊富で体系的な知識が付きます。個人的には価格も踏まえてOffSecでTry Harderするのが好きですが、このあたりの好みは人によって大きく変わる気もします。
事前準備
私は高専時代からアセンブリを読み書きする機会があったためアセンブリやスタック・ヒープ周りで躓くことなく進めることができましたが、あまり親しみがない方は別途事前に学習を行うとよいと思います。各レジスタの機能概要や、x86でよく使う命令の概要、スタックの動き方あたりは概要を理解しておいた方が良いです。
公式サイトでは受講時の推奨スキルが記載されています。
- デバッガー(ImmunityDBG、OllyDBGなど)の使用経験。
- 32ビット環境における基本的なエクスプロイトの概念に精通していること。
- Python3コードの記述に精通していること。
- C言語のコードを基本的なレベルで読み理解できる能力。
- 基本的なレベルで32ビットアセンブリコードを読み理解する能力
このうち、デバッガの使い方は5章の「IDA Proの使い方」で説明され、pythonやcの使い方は構文的にも平易なものしか使わないため苦になりません。一方でx86のアセンブリ命令やスタックの動き方はコースではほぼ紹介されない部分であるため、予め主要なx86命令やスタック周りの動きを眺めてなんとなく言ってることが分かるレベルになっておくと理解が進みやすいと思います。
勉強方法
まずはテキストを2周しました。あまり時間が取れていないなかでの勉強であったため、移動時間も活用しつつの最初に1周テキストを読み、2周目でじっくり内容を理解できるように努めつつ読み込みました。その後、各章のExerciseやExtra Mileを実施し、3つあるラボを進めました。間にいくつか試験を挟んだため時間がかかったこともありますが、もともとROPをすいすい書ける程度の慣れがないと90日コースでは難しいと思います。
OSCPの場合は事前にTryHackMeやHackTheBoxで勉強するとよいとされていますが、OSEDに関しては他の教材を使用せず、EXP-301の教材に絞って学習することをお勧めします。これには2つ理由があり、1つは補助教材の使用によりツールや題材が変わり逆に混乱する可能性があるため、2つ目は「試験課題はコースで教えるツールとテクニックだけで完全に解決できる」ためです。
その他のコツで思いつくものを以下に列挙しておきます。
- 現時点でWinDbgのバージョンは更新されていないので、先人が警告を発するfnstenvが0になる問題が残っています。シェルコードの先頭に到達した時点でデバッガをはずすか、手動でEIPの値を入れてあげましょう。
- WinDbgのレイアウトは気に入ったものを探すと良いです。GitHubに落ちているテーマを入れるもよし、初期状態からすぐに作れる慣れたレイアウトを作るもよしです。私は2段で上段にDissassembly,Memory,Memory,Register、下段にCommand,Memory,CallStackという配置をよく使っていました。Memoryタブではespやebp、eax、固定の場所あたりを見ていました。
- 他の人の受験ブログは読み漁っておいた方が良いです。AIも併用して要点をまとめると、ぼんやりと試験の傾向が見えてきます。
- コース教材の意味が分からない場合はAIに聞きましょう。昔よりも圧倒的に学習効率を高めてくれます。
スケジュール
4月上旬から勉強自体は進めつつ、2か月程度テキストを読み、2か月でexerciseやextramile、1ヶ月でlabを行う程度のスケジュール感でした。その後夏季休暇が来たので1回試験を予約することにしました。ちなみに、OSEDの試験枠はOSCP+よりも少なく見えたので、ある程度余裕を持って予約することをおすすめします。
試験の準備
まずはテキストを読み込み、excerciseとextramile、Labを一通り行うことが大事です。あとは試験前のメモを見返してみると、以下のことを行っていました。
- 演習用VMから演習の解答ファイルを確認する。信頼性の高いコードは大事。
- osed-scriptsなどのリポジトリを事前に確認しておく。自分は結局使わなかったが、使えたら時間が短縮できたとは思う。
- AIに聞きたくなりそうなことは事前にチートシートをまとめてもらう。主要なアセンブリ命令、badchars対策の置換手法、WinDbgのコマンドリスト、など。
- OSED-Exam-GuideやFAQの確認
- レポートフォーマットの確認
- 画面解像度を1920×1080に落とす。4k画質だと監督用ソフトウェアが重くなる気がする。
- 部屋を片付け、監督の要件に従いディスプレイを4枚に減らす。
- 48時間の試験に備え、弁当やお菓子、飲み物を買い込む。ただし賞味期限が短い刺身や寿司の類は早めに食べる分だけにする。甘いものと塩気のあるものはバランスよく。エナドリは1本だけ。
- 念のためホストマシンからOpenVPNの削除
- ホストOSのWindows Update
当日の内容
試験当日は朝4時から開始しました。これは予約可能でちょうど良い枠がそこしかなかったためです。余裕を持って予約し、もう少し健康的な時間から始めることをおすすめします。個人的には朝8:00頃から始めると調子が良くなる気がします。
課題は3つ提示されますが、部分点がないことを踏まえて課題3は後回しにする作戦としていました。あまり十分な学習時間を確保できなかったこともあり、課題1・2に時間がかかり、さらにレポートにも思ったより時間が取られたので、課題2つを目標達成しレポートにまとめるだけでほぼすべての時間を使いました。ちなみに、1日目はとにかく「動けばよかろう」と雑なコードを書いたため、翌日起床後にコードの整形作業に多くの時間を取られています。他人に見せて説明するコードなので、理想的には最初からきれいに書いてコメントもつけておくとよいです。
・8/13 4:00:試験開始
・8/13 17:00:課題1目標達成
・8/14 3:00:課題2目標達成。就寝。
・8/14 10:00:起床。課題1と課題2のコードのリファクタリング。コメント付け作業。
・8/14 16:00:証跡確保。レポート作成。
・8/15 4:00:試験終了。レポート作成を継続。
・8/15 7:00:レポート提出。
合格通知
8/15(土) 7:13にレポートを提出し、8/17(月) 23:16に合格通知が来ました。手動採点が面倒な内容なので時間がかかるかと思いましたが、それほど時間はかからなかったですね。
感想
OSEDは難しいと評判ですが、「試験課題はコースで教えるツールとテクニックだけで完全に解決できる」とあるように型に従い作業を行うという点でエスパー要素が少なく、納得感がある試験だったと思います。
また、歳を重ねるにつれて48時間+24時間の試験が体力的に厳しくなりそうな雰囲気を感じています。体力と若さが一番大事なのかもしれません。あるいは1日9時間程度の作業で終わらせる技能と計画性。
今後の予定
OSEP