アイジア

CTF, 情報セキュリティの学んだことメモ

Reversing.kr easy unpack

Reversing.Krの「easy unpack」にチャレンジ。

「Easy_UnpackMe.zip」を解凍するとウイルスバスターに削除された。一時的にリアルタイムスキャンをOFF。

実行ファイルと一緒に入ってたReadMeには「Find the OEP」とある。

OEPはOriginal Entry Point の略でパッキングされる前のプログラムの実行開始地点のこと。

 

そもそもパッキングとは

パッキング(packing)とはプログラムのアンチデバックの手法の一つでファイルを実行可能な状態のまま圧縮すること。圧縮したファイルにそれを展開するコードを先頭に付加するというのが基本的なパッキングの形。

また圧縮のためのソフトをパッカーという。実行時に有名なパッカーとしてUPXやASPACKなどがある。圧縮されたプログラムはアセンブリを読み解くのが非常に難しくなり、文字列もバイナリエディタ上に表示されなくなる。

 

プログラムの実行

f:id:favoritte15:20180508084848p:plain

白い画面が表示されるだけで、何も起こらない。

 

 パック化されたプログラムのエントリーポイントを見つける

IDAでは左上タブのJump->Jump to entry pointでエントリポイントを見つけることができる。

f:id:favoritte15:20180508085744p:plain

パックされたプログラムのエントリーポイントは「0x0040A04B」。

 

OEPを見つける

f:id:favoritte15:20180508090702p:plain

ecxに409000,edxに4094EEを代入。してecx == edxになるまでループする。

 

f:id:favoritte15:20180508093107p:plain

アドレス0x409000が示す値の下2桁の部分を0x10, 0x20, 0x30, 0x40, 0x50でxorして、ecxに1を足す。その結果をまたedxと比較していく。

 

 

f:id:favoritte15:20180508095608p:plain

f:id:favoritte15:20180508095715p:plain

下に進むとまた同じようなループ処理が2つある。

おそらくこのあたりがプログラムの展開部分だと思われる。

ほとんどのパック化されたプログラムが展開処理の際このようなループを行うらしい。

最終的に3つめのループで00401150に飛ぶ。これがOEPだと思われる。

 

f:id:favoritte15:20180508100728p:plain

ちなみにここの箇所はIDAだと難読化されてよくわからなくなっていて、OllyDbgで開くとDB文が羅列される。[右クリック] - [分析(Analysis)] - [コードを分析(Analyse code)] でDBが取り除かれて普通のアセンブリになる。

f:id:favoritte15:20180508101242p:plain