コラムColumn

導入事例Case Study

サイバーニュースCyber News

海外のサイバーセキュリティ関連のニュースを日本語でご紹介しています。

お知らせNews

【Hack The Box入門】Reg:バイナリエクスプロイトの基礎理解

バイナリエクスプロイト(Binary Exploitation)について、私自身が理解している範囲を整理してみました。まだ専門家ではありませんが、学習の過程としてまとめています。もし誤りがあれば、ぜひご指摘ください。

ここでは、レジスタ構造やスタックフレームなどの基礎知識の詳細な解説には踏み込みません。基本的な理論を知りたい方は Azeria Labs の Functions and the Stack 解説 を参照してください。

免責事項
本記事はHack The Box「Reg」チャレンジを題材に、学習目的で作成したものです。
実際の脆弱性攻撃を助長・推奨する意図はありません。
問題の内容やフラグは一切記載していません。

1. 解析対象のバイナリを準備する

今回は Hack The Box のチャレンジ「Reg」を使用します。
バイナリファイルは以下からダウンロードできます。
Hack The Box – Reg Challenge
また、Megaリンクからも取得可能です。ダウンロード後に MD5 チェックで整合性を確認します。

ZIPファイルは unzip で展開します(パスワード: hackthebox)。
※配布元は必ず公式(HTB)のページを利用してください。非公式配布物はセキュリティ・法的リスクがあります。

2. 静的解析(Static Analysis)

まずは file コマンドでファイルの種類を確認します。

結果から、このファイルは ELF 64-bit 実行ファイルで、stripped されていない(デバッグ情報が残っている) ことがわかります。
「not stripped」とは、コンパイル時のデバッグ情報が削除されていない状態を意味します。

続いて、checksec コマンドでセキュリティ保護機能の有無を確認します。

それぞれのフラグの意味については、以下のブログが参考になります。
High-level Explanation on Binary Executable Security

さらに詳細を確認するために、逆アセンブルツール Radare2 も活用します。

ここまでで静的解析が完了しました。
次は動的解析へ進みます。

3. 動的解析(Dynamic Analysis)

ファイルに実行権限を付与し、実際に動かしてみましょう。

chmod +x reg
./reg

名前の入力を求められるため、任意の文字列を入力します。
特に反応はありませんが、ここからバッファオーバーフローを調べます。

4. バッファオーバーフローの確認

大量の「A」を入力してプログラムの挙動を確認します。

python3 -c "print('A'*200)" > input

このファイルを入力として実行すると、セグメンテーションフォールトが発生しました。

これはメモリ保護違反(セグフォルト)であり、
バッファオーバーフローの兆候です。

“Segmentation fault”とは、プログラムが許可されていないメモリアドレスにアクセスした際にOSが検出するエラーです。

5. Radare2で関数構造を調査

次に、Radare2を使ってバイナリ内部の関数構造を調べます。

radare2 ./reg
aaa
afl

この結果から、main のほかに sys.winner という関数が存在することが確認できます。
また、プログラム内には Congratulations!flag.txt という文字列も含まれています。

これらの文字列から、winner 関数がフラグ出力に関係していることが推測できます。

6. Visualモードで構造を追う

Radare2のビジュアルモード(V)で命令構造を確認します。

解析の結果、次の2点が判明しました。

  • 入力受付に gets() 関数が使用されている
  • sys.winner 関数内に “Congratulations!” が存在する

gets() はバッファオーバーフローを誘発しやすい脆弱な関数として知られています。
公式マニュアルでも「使用すべきではない」とされています。

CWE-242「危険な関数の使用(Use of Inherently Dangerous Function)」に該当します。
詳細はこちら

7. winner 関数の動作を確認

winner 関数を逆アセンブルしてみましょう。

s sys.winner
pdf

この関数は flag.txt を開く処理を持っており、
gets() のバッファオーバーフローを利用してこの関数を呼び出せば、フラグが取得できる構造です。

8. GDB + pwndbgでオフセットを特定

次は、GDBを pwndbg プラグイン付きで起動し、
オーバーフロー位置(RIP上書き位置)を調べます。

gdb-pwndbg reg
run

関数一覧を表示します。

パターン生成には cyclic コマンドを使用します。

cyclic 150

このパターンを入力し、クラッシュした位置の値を確認して
オフセットを cyclic -l コマンドで特定します。

結果、RIPのオフセットは56バイトと判明しました。

9. ペイロードの作成と実行

まず、同一ディレクトリにダミーの flag.txt を作成します。

次に、winner 関数のアドレスを調べます。

Pythonのpwntoolsを使って、
56バイトのパディング+関数アドレスをリトルエンディアン形式で出力するスクリプトを作成します。

この出力を入力として実行します。

ダミーフラグが出力されれば成功です。
最後に、nc(netcat)でリモートサーバーに同じ攻撃を試みます。

結果、攻撃成功
バッファオーバーフローから関数呼び出しまでの流れを確認できました。

10. まとめ

この演習を通じて、バイナリ解析における基本的な流れを理解できました。

  • ELF構造の確認
  • checksecによる保護機構の確認
  • Radare2とGDBによる静的・動的解析
  • バッファオーバーフローを利用した関数リダイレクト

これで「Reg」の解説は以上です。
本演習で扱った基礎(ELF の確認、checksec、Radare2/GDB による解析、バッファオーバーフローと RIP 上書きの流れ)は、バイナリ脆弱性理解の重要な土台になります。

次回は pwntools を使ったエクスプロイト自動化の実践を予定しています。
引き続き学習を頑張りましょう。

注意・免責:

  • 本記事の手順は Hack The Box の学習環境における教育目的での説明です。記載されているコマンド、ユーザー名、パスワード、IP アドレス等は演習用のものであり、実在するシステムでの同様の操作は法律に抵触する可能性があります。
  • 本記事で紹介する手法は防御力向上のための知見提供を目的としています。第三者のシステムに対する不正アクセスやデータ取得を助長する意図はありません。
  • 記事の内容を実運用環境で試す場合は、必ず対象システムの所有者から書面による許可を得てください。疑問点や報告がある場合は、当社までご連絡ください。

投稿者プロフィール

ハリス ディルシャン
ハリス ディルシャン
Offensive Security Engineer | Red Team Specialist
レッドチーム演習やペネトレーションテスト、脅威モデリングを専門とするオフェンシブセキュリティエンジニアです。エンタープライズ環境やWeb・モバイルアプリ、API、クラウドサービスにおけるセキュリティ評価を多数実施し、CTFやマルウェア解析、アンチウイルス回避などにも精通しています。2020年にはCEH Master世界ランキングでトップ10入りを果たし、国際的に高い評価を得ています。
主な保有資格:
● OSCP(Offensive Security Certified Professional)
● CPENT(Certified Penetration Testing Professional)
● eCPPT(Certified Professional Penetration Tester)
● eMAPT(Mobile Application Penetration Tester)
● CRTS(Certified Red Team Specialist)
● CEH Master(認定エシカルハッカー)
● SOC-100(Security Operations Essentials)
● PEN-100(Network Penetration Testing Essentials)
● SLIIT – 情報技術学士(サイバーセキュリティ専攻)


Page Top