サイト内の現在位置

RE for Beginners: Playground Exercises - Write-up

NECセキュリティブログ

2020年10月9日

NECサイバーセキュリティ戦略本部セキュリティ技術センターの大家です。
本記事では、ソフトウェアのリバースエンジニアリング初学者向けに、リバースエンジニアリングの入門サイトである"Reverse Engineering for Beginners" (new windowhttps://www.begin.re/) の練習問題から、Playgroud Exerciseの2問(Password, Good_Luck)のWrite-upを紹介します。

Reverse Engineering for Beginnersとは

Reverse Engineering for Beginnersは、Ophir Harpaz氏が公開しているリバースエンジニアリングの入門サイトです。本サイトの前半では、リバースエンジニアリングとは何かというところから始まり、x86アセンブリ言語の基礎やプログラム(Windows 32bit)実行時のメモリ上のスタック領域の動き、OllyDbgnew window[1]やIDAnew window[2]の基本的な使い方について、わかりやすく解説されています。後半は実戦形式の練習となっており、4問の練習問題が用意されています。練習問題はどれも基礎的な内容なので、リバースエンジニアリングの初学者が実際に手を動かしながらリバースエンジニアリングを学んでいくのにちょうど良いかと思います。

Playgroud Exerceise

4問の練習問題の前半2問はPlayground Exercisesnew window[3]という名称で、"Password"という問題と、"Good_Luck"という問題からなります。それぞれプログラムの実行ファイルが提供されるので、IDAを用いてそのプログラムの挙動を把握し、プログラムの正しい入力値を求めるという問題です。Playground Exercisesについては、2020年10月5日現在、ウェブページ上に"complete solutions to the exercises will be published soon."と記載されており、公式の解説はありません。なお、残りの2つの練習問題については公式の解説が用意されています。

Password

与えられるファイルは"Exer0_Password.exe"です。まずはfileコマンドでこのファイルの種類を確認します。本サイトの解説の流れから推測はできますが、案の定32bitのPEファイルでした。

fileコマンドの実行結果

次に、このファイルを実行してみます(※)。ファイルを実行すると、パスワードの入力が求められました。適当なパスワードを入力すると「Wrong password」と表示されます。正しいパスワードが、本問題の答えだと推測できます。

  • 信頼できないファイルの解析・実行は、一般的に仮想環境上で行います。またこのとき、ネットワーク接続や、ホストとゲスト間のファイル共有、及び、クリップボード共有機能は基本的に無効化しておくべきです。これらの機能は必要な場合のみ有効化すると良いでしょう。
プログラムの実行結果

次に、IDAでプログラムの解析を行います。IDAを開き、本プログラムを読み込みます。なお、今回は無償版のIDA Freeware v7.0new window[4]を使用しています。

IDAでファイルを読み込んだ後の画面

まずはプログラム上の可読文字列を確認します。プログラムを解析する際に、まず文字列を確認するのは一般的な方法です。また、プログラム実行時に"Enter password: "と表示される処理の周辺には、パスワードチェックの処理があるものと推測できます。

プログラムの可読文字列を表示する

"Enter password: "や、"Correct!\n"、"Wrong password\n"という文字列が見つかります。"cr4ckm3"という明らかに正解と思われる文字列も表示されていますが、本問題の趣旨はプログラムの処理を把握することにあるため、これは一旦無視します。

文字列一覧

"Enter password: "という文字列が使われる処理を確認してみます。"Enter password: "の行をダブルクリックした後、この文字列が参照されている箇所を表示するため、"sub_401090"をダブルクリックします。

"Enter password: "の行をダブルクリックした後の画面
"Enter password: "周辺の処理

内容を詳しく確認していきます。まず、"Enter password: "がスタックにプッシュされたあと、関数"sub_401020"が呼び出されています(青枠の部分)。これは"Enter password: "の文字列を標準出力に出力する関数と考えられます。その後、ローカル変数"Dst"と"%s"がスタックにプッシュされ、関数"sub_401050"が実行されています(緑枠の部分)。この処理は、ローカル変数"Dst"に標準入力からの入力値を格納する処理と考えられます。

次に、標準入力から受け取った文字列と、文字列"cr4ckm3"などを引数に、strcmp関数が実行されています(オレンジ枠の部分)。その後、strcmpの返り値の結果に応じて処理が分岐します(紫枠の部分)。標準入力から受け取った文字列の値が"cr4ckm3"と一致する場合は"Correct!\n"、一致しない場合は"Wrong password\n" と表示する処理に分岐しています。

なお、この一連の処理を実行する関数の呼び出し元を確認すると、直前でargvやargcの値を取得するものと思われる関数が実行されています。したがって今まで見てきた部分はこのプログラムのmain関数であると考えられます。

呼び出し元の処理

プログラムを実行し"cr4ckm3"を入力すると、"Correct!"の文字列が表示されました。解析したとおりの処理となっています。

プログラムの実行結果

Good_Luck

この問題で与えられるファイルは"Exer1_GoodLuck.exe"です。まずは、fileコマンドでこのファイルの種類を確認します。32bitのPEファイルであることがわかります。

fileコマンドの実行結果

次に、このファイルを実行してみます。引数なしで実行したところ、何も出力されずに処理が終了しました。引数に文字列を入力しても特に反応はありません。数字を入力すると、"Hmm nope."と表示されました。

プログラムの実行結果

IDAで本プログラムを読み込みます。更にプログラム上の可読文字列を確認してみます。"Very correct!"や"Hmm nope"という文字列が確認できます。

文字列一覧

"Very correct!"の文字列が使われる処理の周辺を確認します。

"Very correct!" 周辺の処理

この処理を詳しく見ていきます。最初に、第1引数の値が2であるか確認しています(青枠の部分)。ここで、第1引数の値が何であるかは、この関数の呼び出し元を確認する必要があります。呼び出し元を確認すると、第一引数の値は argc (プログラムの引数の個数) であることがわかります。次に、atoi関数を実行しています(緑枠の部分)。Atoi関数の引数の値は、関数の呼び出し元を確認すると、argvの値(プログラムの引数)であることがわかります。なおatoi関数は、文字列を引数にとりその文字列を数値に変換する関数です。

呼び出し元の処理

次に、atoi関数の戻り値(プログラムの引数を数値に変換した値; eax)を5倍(eax=eax+eax*4)し、その値を0x181Aと比較しています(オレンジ枠の部分)。その後、比較対象の数値が一致した場合"Very correct!"を、不一致の場合、"Hmm nope."を表示する処理に分岐します。ここで、5倍して0x181Aとなる値を求めると、0x181A / 5 = 6170 / 5 = 1234 となります。したがって正しい入力は "1234" です。

プログラムの引数に "1234" を与えて実行すると、想定どおり "Very correct!" と表示されました。

プログラムの実行結果

なお、Ghidranew window[5]を用いると、デコンパイラ機能が使える(有償版のIDA Proにはデコンパイラ機能があるが無償版のIDA Freewareにはない)ため、プログラムの処理がイメージしやすいです。

Ghidraのデコンパイル画面

おわりに

本記事では、Reverse Engineering for Beginnersの練習問題から公式解説のない2問を選択し、Write-upを書きました。Reverse Engineering for Beginnersでは、リバースエンジニアリングの基礎的内容がわかりやすく解説されており、また、用意されている練習問題も非常に基礎的です。これからリバースエンジニアリングを学んでいきたいと考えている方は、ぜひ挑戦してみてください。

参考資料

執筆者プロフィール

大家 政胤(おおや まさつぐ)
セキュリティ技術センター リスクハンティングチーム

お客様へ納品するサービス・製品の脆弱性診断、リスクアセスメント業務を通して、NECグループのセキュア開発・運用を推進。
RISS、GPEN、CISSP Associate、CCSP Associate、AWS Security Specialtyを保持。
最近は作曲に挑戦中。