リバースエンジニアリングのラボ:gdb、radare2、strace、ltrace でプログラムを読む
このラボは、ソースコードのないプログラムの読み方を教えます。生徒はそれぞれ、コンパイラー、デバッガーの gdb、逆アセンブラーの radare2、binutils、strace、ltrace を備えた Ubuntu VM と、このラボのために書かれた5つの小さなプログラムを受け取ります。プログラムはそれぞれ鍵を1つ隠しています。生徒は、守る側の人やコンパイラーを学ぶ人がするようにプログラムを調べて鍵を見つけ、ファイルに書きます。
行うのは読んで理解することだけで、対象はラボ自身がコンパイルしたプログラムです。生徒のパソコンには何もインストールされません。また、ここではマルウェア、本物のソフトウェアのライセンスを破ること、そのためのキー生成ツール、デバッガーからプログラムを隠すこと、エクスプロイト、ラボのものではないプログラムを調べることは、一切教えません。
生徒が学ぶこと
5つのプログラムによる段階で、それぞれ別のツールで読みます。1つ目はパスワードを隠さずに持っていて、strings と objdump か radare2 を使えば、実行しなくても見えます。2つ目は実行中にパスワードを組み立てるので、生徒は gdb で文字列比較のところで止め、答えをメモリから読み取ります。3つ目は数を求め、いくつかの計算の手順で確かめます。生徒は逆アセンブルの結果で手順を読み、逆にたどります。4つ目は鍵の2つの半分をつなぎ、ltrace がライブラリ呼び出しの中でそれを見せます。5つ目は名前に鍵を含むファイルを探し、strace がシステムコールの中でそれを見せます。
その裏にあるのは、守る側の人に必要な学びです。プログラムが動くために知っていなければならないことは、読む人にも見つけられます。だから、プログラムの中に置いた秘密は秘密ではありません。
コピーごとに違う鍵
ラボのリポジトリは公開されているので、鍵は一切入っていません。生徒の VM が初めて起動すると、セットアップが新しいランダムな鍵を作り、管理者だけが入れるフォルダーに保存し、それでプログラムをビルドして、ソースを削除します。セットアップが鍵を表示することはありません。生徒の答えは自分のコピーの鍵と照らし合わされるので、友達の答えも README もラボのファイルも、何も教えてくれません。自分のマシンで sudo を使う生徒なら保存された鍵を読めてしまいます。ラボは自分のマシンを持つ生徒を信頼する作りで、鍵は学ぶためのものであり、VM の持ち主に対して秘密を守るためのものではありません。
ブラウザーで動かす
VM ラボは、モジュールのラボ課題として設定します。サンプルはラボのページにあります。マシンは小さく、CPU 1つ、メモリ 1 GB、ディスク 10 GB です。ツールを合わせても、そのメモリの10分の1よりずっと少ない量しか使いません。
- ラボを追加する. 担当するモジュールで課題を追加し、Ubuntu VM ラボのカードを選びます。ページには、compose ファイルの代わりにマシンの短い説明が表示されます。
- サンプルから始める. ページには、そこから始められる用意済みのラボが並びます。リバースエンジニアリングを選びます。サンプルを使うとテキストが置き換わり、元に戻すで自分のものに戻せます。
- 公開して自分用のコピーを起動する. 公開してから、起動します。VM の初回起動時に、ラボのセットアップスクリプトが Ubuntu のアーカイブからコンパイラー、gdb、radare2、strace、ltrace をインストールし、新しいランダムな鍵を作り、それでプログラムをビルドして README を書きます。数分かかります。
- ターミナルを開く. ターミナルを開き、ホームフォルダーの README.md を読みます。何をするかが書かれていますが、答えは書かれていません。
このラボの基本レッスン
Reverse Engineering Basics は、Ubuntu VM であるこのラボの中で行う小さなレッスンです。つかみ、できるようになること、守るべきルール、キーワード、ウォームアップ、考えごとにチェック、よくある間違い、最後のチェックがあり、各手順には、そのコマンドをマシンのターミナルに入力する実行ボタンがあります。生徒は無害なプログラムを、file、strings、objdump、radare2、gdb、ltrace、strace で調べます。
レッスンはツールを一通り見て回るだけで、鍵のある5つのプログラム、つまりラボ本来の課題は生徒に任せます。答えは一切出てきません。
採点の仕組み
ラボにはチェックがあります。チェックは、保存されたマシンのコピーを新しく起動した後で実行され、生徒のホームフォルダーの answers.txt を読みます。5つの鍵はそれぞれ、その生徒のコピーのそのプログラムのために作られた鍵でなければなりません。当てずっぽう、空の行、別のコピーの鍵、違うプログラムの欄に書いた鍵は合格しません。チェックは各プログラムをそれ自身の鍵でも試すので、変更されたプログラムも分かります。チェックが表示した最初の行に、どのプログラムが違うかが書かれています。
- 配る. 期限を付けたければ付けて、ふつうの課題と同じようにラボを割り当てます。生徒はそれぞれ、セッションをまたいで残る自分の VM と、自分の鍵を持ちます。
- チェックを実行する. クラス一覧の生徒の行で「チェックを実行」を押します。保存されたマシンのコピーを、保存し直さない形で起動し、ラボのチェックスクリプトを root で実行して、合格したか、何を表示したか、いつ実行したかを示します。結果は生徒には知らされません。
- 採点する. チェックが表示した最初の行を読みます。鍵がない、またはそのコピーの鍵ではない最初のプログラムが書かれています。足りなければ、理由を付けて課題を差し戻します。
GitHub の定義ファイル
このファイルはラボの定義の全体で、プラットフォームが実行するのと同じテキストです。サイズ、セットアップスクリプト、5つのプログラムのソース、README、チェックが入っています。コピーして、プログラムや鍵を変えれば、もっと長いラボが作れます。
このラボを試す、そして費用
無料の個人アカウントで、このラボの基本レッスンに取り組めます。毎月、ほとんどのレッスンに足りる無料クレジットがあり、カードは要りません。クラスで使う場合、学校は最初の365日間、生徒50人まで無料で、その後は生徒1人あたりの年額です。すべてのラボが含まれ、教職員は無料です。
よくある質問
- このラボにはライセンスや特別なソフトウェアが必要ですか。
- いいえ。コンパイラー、gdb、radare2、binutils、strace、ltrace はオープンソースで、生徒の VM が起動するときに Ubuntu のアーカイブから入ります。私たちがそれらを配布することはありません。
- これは他人のソフトウェアに侵入する方法を教えるものですか。
- いいえ。プログラムはラボ自身の練習用で、どれもプログラムのしくみを理解するために読みます。守る側の人、ソースのない状態で作業する開発者、コンパイラーを学ぶ人に必要な力です。ラボは、マルウェア、本物のソフトウェアのライセンスを破ること、キー生成ツール、デバッガーからプログラムを隠すこと、エクスプロイト、ラボのものではないプログラムを調べることを教えませんし、生徒のコピーはインターネットに出られないので、そうしたものを取ってくることもできません。
- 生徒は何かを壊せますか。
- 壊せるのは自分のコピーだけです。プログラムは生徒の権限で動き、無料の枠では VM が届くのは Ubuntu のアーカイブだけです。プログラムを読むだけでは、それらは壊れません。
- このラボは本物の生徒用 VM でテストされましたか。
- セットアップ、レッスンのコマンド、チェック、そしてチェックを欺くあらゆる方法は、本物のUbuntu 26.04 のコンテナで実行し、5つの鍵はそれぞれ、管理者権限のないユーザーとして、想定したツールで見つけられることを確かめました。実際に起動した生徒用 VM(マシン本来のカーネルで動くもの)は、授業の前に一度試すのがおすすめです。