
バイナリエクスプロイトとリバースエンジニアリング(アセンブリからCへの変換)
10個の小さなチャレンジを通じて、逆アセンブル、バイナリエクスプロイト、リバースエンジニアリングを探求します。
各レベルのフォルダには以下が含まれています:
flag - 次のレベルのパスワード
README.md - パスワードを見つける方法
source.c - リバースエンジニアリングされたバイナリ
dissasembly_notes.md - アセンブリに関するメモ
詳細は subject を参照してください。
gdb とエクスプロイトのさらなる楽しみについては、以前のプロジェクト RainFall をチェックしてください。
まず、42 から OverRide.iso をダウンロードします。
Mac OSX では、VirtualBox をインストールします。
VirtualBox で新しい VM を作成します(「新規」をクリック)。
次のすべてのステップではデフォルト設定のまま続行します:
次に「設定」>「ネットワーク」>「アダプター1」>「割り当て」: ブリッジアダプター をクリックします。
同じく設定内で「ストレージ」>「コントローラー: IDE」の右側にある CD アイコンと + 記号(光学ドライブを追加)をクリックします。 「ディスクイメージを追加」をクリックし、OverRide.iso を選択します。
「起動」をクリックして VM を起動します。実行中になると、VM の IP アドレスが表示され、ログインを促すプロンプトが表示されます。
別のシェルからユーザー level00 としてログインします(パスワード: level00)。
ssh level00@{VM_IP} -p 4242
ユーザー level00 として、level01 ユーザーのパスワードを /home/users/level01/.pass から読み取ることが目標です。ただし、ユーザー level00 にはこのファイルを読み取る権限がありません。
ユーザー level00 のホームフォルダには、SUID が設定され、所有者が level01 であるバイナリ level00 があります。
これは、バイナリ level00 を実行すると、level01 ユーザーの権限で実行されることを意味します。
gdb を使用してバイナリ level00 の脆弱性を見つけなければなりません。その後、脆弱性を悪用して system("/bin/sh") を実行し、level01 ユーザーとしてシェルを開き、パスワードを読み取る権限を得ます。
cat /home/users/level01/.pass
その後、ユーザー level01 としてログインします。
su level01
各レベルでこれを繰り返します。
各レベルについて、バイナリの gdb 逆アセンブルを調べて、元の source.c をリバースエンジニアリングしました。
0 - ハードコードされたパスワード
1 - Ret2Libc 攻撃
2 - printf() フォーマット文字列攻撃
3 - ブルートフォースパスワード
4 - gets() スタックオーバーフロー + Return-to-libc 攻撃
5 - 環境変数内のシェルコード + printf() フォーマット文字列攻撃
6 - gdb で発見可能なハッシュ値
7 - 保護されていないデータテーブルへの Ret2Libc 攻撃
8 - シンボリックリンクによるパスワードのバックアップ
9 - Off-by-one エラー
このプロジェクトは、非常に才能のある @dfinnis とのチームで執筆しました。