株式会社Ninjastars 技術研究部

「もっと楽しく安全なゲームの世界を創る」

Ghidra Tutorial + CTF・脆弱性診断 超入門 Reversing①

株式会社Ninjastars
セキュリティエンジニア:一瀬健二郎

今回の記事では弊社で行っているリバースエンジニアリング技術の教育資料を公開しています。
Reversing編ではCTFや脆弱性診断においてのリバーシング技術の基本をお教えできればと思います。
またGhidraのチュートリアルとしても利用できるようにしております。

Ghidraについてはこちらをご参照ください。
NSA 米国国家安全保障局 リバースエンジニアリングツール Ghidraを使う - 株式会社Ninjastars 技術研究部

参考問題集

今回はeagle0wl氏のcrackmeシリーズのcrkme01という問題を使用します。
リンク先からeagle0wl's crackme VOL.01 ver1.02をクリックしてダウンロードしてください。
このシリーズは順を追ってReversingについて学ぶことができ、非常に参考になる問題集です。

どーもeagle0wlです(再)

アセンブリについて

初心者向けの説明
アセンブリに触れてみよう - Qiita

参考サイト
アセンブリ言語の基本知識が掲載されている。
アセンブラ入門

使用ツール

Ghidra

NSA(米国国家安全保障局)が公開した高機能なバイナリ解析ツール。
今までCTFの入門用などではFree版のIDA Proが多く利用されていました。
Ghidraは高機能かつ無料なため、今後はこちらが主流になると予想されます。

crkme01

起動すると以下の画像のようなウィンドウが立ち上がります。
f:id:Ninjastars:20190307113830p:plain

テキストボックスに何か適当に入力して登録を押すと「不正解です。」のメッセージが出現します。
プログラムの解析を行い、パスワードに何を入力すれば良いか求めてみましょう。
ここでは静的解析というのを行ってみます。

Tips:
静的解析:プログラムを実行せずに、実行ファイルのバイナリの構造などを調べて解析すること。

Ghidraを用いてcrkme01.exeを解析してみましょう。
1)CodeBrowserの起動。
File->New Project->Next->Project Nameを入力->ドラゴンのアイコンをクリックでCodeBrowserが起動します。
2)ファイルの解析。
crkme01.exeのファイルをCodeBrowser画面にドラッグ&ドロップで解析できます。

以下のような画面になると思います。

f:id:Ninjastars:20190307114828p:plain
Ghidraで解析開始!

アプローチ

ただ闇雲にアセンブリを眺めていても何も分かりません。
ヒントになりえるような情報を考えてみましょう。

1)正解か不正解かを判定する処理がプログラム上に存在する。
2)不正解になったときにメッセージボックスで「不正解です。」と呼び出す処理がプログラム上に存在する。

Symbol Tree->Importsタブで実行可能ファイル内にインポートされた関数一覧が表示されています。
(※動的にライブラリをロードし、関数を呼び出す場合ここには表示されない。)
上記1)、2)に利用されていそうな関数を見てみましょう。

KERNEL32.DLL->lstrcmpA
USER32.DLL->MessageBoxA

lstrcmpAは文字列を比較し、一致しているか否かを判定する関数です(一致していたら0を返す)。
MessageBoxAはその名の通りメッセージボックスを表示する関数です。

次はこの関数を呼び出している処理を探しそこからヒントを探ります。

Symbol Tree上の関数の名前をクリック->逆アセンブラ画面上でその関数の名前の部分で右クリック->一番下のReferences->Show Call Treesを選択

f:id:Ninjastars:20190307122249p:plain
Show Call Treesの画面

画像のFunc_00401049をクリックすると逆アセンブラ画面が変更され以下の画面となります。

f:id:Ninjastars:20190307123009p:plain
MessageBoxAの呼び出し元

GetWindowTextAはテキストボックスから文字列を取得する関数です。

流れ:
1)GetWindowTextAで入力文字列を取得
2)lstrcmpAで"doomo"と入力文字列を比較
3)一致していれば0x00401226にジャンプ

この画面を見れば凡そ答えが"doomo"であることは分るでしょう。

test eax,eax
jz XXX

testは2つのオペランド論理積をとり、そのフラグだけ 反映する命令です。
同じ数値でandをとって0になるのは0以外ないため、eaxが0の場合ZF = 1となり、eaxが0以外の場合ZF = 0となります。
よって上記命令はeaxが0の場合該当処理にジャンプし、0以外の場合ジャンプせずに次の命令が実行されるということが分かります。

プログラムを実行し"doomo"と入力すると見事「正解です!」と表示されます。

注意事項

本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。

本レポートについて
お問い合せ
E-mail:ichise@ninjastars-net.com

株式会社Ninjastars セキュリティエンジニア
一瀬健二郎