IDAの操作メモ - デバッガの使用例 ー | reverse-eg-mal-memoのブログ

reverse-eg-mal-memoのブログ

サイバーセキュリティに関して、あれこれとメモするという、チラシの裏的存在。
medium(英語):https://sachiel-archangel.medium.com/

IDAにはデバッガ機能があり、これを用いて解析ができることが大きな利点の一つです。

検体を読み込み、最初の解析を実施して、デバッガの選択を行ったら、デバッガでの実行をすることができます。「Debugger」メニューの「Start process」でプログラムが実行されます(「Debugger」で「Start process」が出ない場合は、「IDAの操作メモ - メニュー編(その3) -」を参照していただければと思います)。

 

このときの注意として、「Start process」を実行すると、プロセスが実際に動き出してしまいます。つまり、マルウェアが本当に実行されることになります。

そのため、ブレークポイントを設定して、その位置にEIPが来たら処理を一時停止するようにしておきます。ブレークポイントは、設定したい場所にカーソルを合わせ、「Debugger」→「Breakpoints」→「Add breakpoint」か、右クリックからのポップアップメニューにある「Add Breakpoint」、「F2」キーを押す、のいずれかで設定できます。ブレークポイントを消す場合は、同様の操作で「Delete breakpoint」か「F2」キーを押す、のいずれかで消すことができます。ブレークポイントの設定、解除は頻繁に行うことになるので、ショートカットの「F2」キーは憶えたほうが良いでしょう。

ブレークポイントの設定は、Entry Pointや静的解析で気になったところに設定しておくことになります。下図は、Entry Pointにブレークポイントを設定し、「Start process」して最初のブレークポイントで止まった例です。

 

 

 

 

プロセス開始時の解析の注意点として、TLSコールバックがないかを確認しておくべきというものがあります。

TLSコールバックは、エントリポイントへ到達するまえにシステムに実行させることが可能な仕組みです。実装の経緯は知らないのですが、コンストラクタ処理をさせる目的でしょうか。

もし、マルウェアがTLSコールバックを使っている場合、悪意ある処理はここで行っている可能性があります。その場合、Entry Pointにブレークポイントを設置していても、TLSコールバック処理内で既にマルウェアが動いてしまう可能性があります。

TLSコールバックは、「Jump」メニューの「Jump to entry point」またはCtrl + Eのショートカットで開く「Choose an entry point」ウィンドウの一覧の中に表示されます。このリスト内に、Entry Point以外が含まれる場合は、それぞれチェックしましょう。それぞれの開始位置にブレークポイントを設定しておくのも一つの手です。

 

 

別の注意点として、この方法で使っているブレークポイントはソフトウェアブレークポイントであることに留意してください。

ソフトウェアブレークポイントとは、ブレークポイントの設置位置のコードを「INT」割り込みコマンドに置き換えて実装しているブレークポイントのことです。特に、デバッガではデフォルトでは「INT 3」を用いていることが多いです。デバッガは、ここで割り込みを受けつけて制御しています。置き換えられた元のコードは、もちろんデバッガが管理しており、次のステップを実行するときには、元のコードに戻して実行しています。

 

この仕組みで発生しうる問題は、「ブレークポイントを設置した領域をコピーした場合、ブレークポイントの位置は「INT 3」のままになっている」ということです。

例として、マルウェアのコードを調査するためにブレークポイントをいくつか設置していたとします。その後、マルウェアが関数をコピーするために、その領域をコピーしたとします。このとき、コピーされた関数内にあったブレークポイントは、「INT 3」のままコピーされてしまいます。そして、このコピーされたコードが実行されて「INT 3」にヒットした場合、デバッガはこの位置の「INT 3」の元のコードが分からず、エラーになってしまいます。

こういったケースの場合、コピー処理の直前で、コピーされる領域内にあるブレークポイントを全て削除することで、この問題を回避できます。また、私はまだ遭遇したことがないですが、解析されているかどうかを判定するために、INT 3にトラップを仕込んでいるマルウェアもあるそうです。こういった場合、ソフトウェアブレークポイントを別のINTに割り当てるなどの工夫が必要となるでしょう。

ソフトウェアブレークポイントの仕組みを知らないと、こういったケースでは原因が分からず、解析が詰まってしまいます。ブレークポイントの仕組みは覚えておくとよいでしょう。