Ghidraのコード再解析機能と真のルート発見の例 | reverse-eg-mal-memoのブログ

reverse-eg-mal-memoのブログ

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

例に挙げていたUrsnifは、実際は色々な解析回避技法を用いています。

そのうちの一つとして、静的解析を妨害する意図がありそうな部分と、その妨害を回避する例を挙げておきます。

(本人が、細かい操作方法をいちいち忘れるんだよなー・・・(--; )

 

下図は、初期化処理が終わり、いわゆる「WinMain」に入ってちょっと進んだところです。

 

 

HLT命令があり、その後が??となって未解析になっています。

HLT命令って、あんまり使ったことも見たこともないな・・・。調べてみると、「CPUを停止状態にする」という特権命令。カーネルモード(リング0)じゃないとちゃんと動かないのでは・・・。仮に動いたとしても、これでこのプログラム終了になりそうな感じですね。恐らく、自動的に静的解析するツールや静的解析者には、特に悪さをせずにHLTで終わっちゃう、よく分からないプログラム?で終了でしょう。

しかし!人を信じることができない、心が汚れきった私には見える!!

ヘンなんですよ。0x004965670x00496570の条件付ジャンプ命令のジャンプ先のアドレスが。

LAB_00496574+2」となっていますが、これは「0x00496576へジャンプしろ」という意味です。

でも、今の解析状況では、0x00496576から命令が始まるようにはなっていない?

 

こういった場合、コードを再解析させることで、真のコードが見えるようになるので、その方法をメモしておきます。

まず、0x00496574~0x00496578を選択状態にします。

ここで、右クリックしてポップアップメニューを表示し、「Clear Flow and Repair」を選択します。

「Clear Flow」のダイアログが表示されます。今回のケースでは、「Repair Flow」をチェックすればOK。

ダイアログ内のOKをクリックします。

 

 

 

すると、指定された位置より後のコードが再解析され、??だった部分に新たにコードが現れました。

 

 

これはどういうことかというと、0x004965670x00496570の条件付ジャンプ命令にヒットする前提でこのコードをみると、0x00496574~0x00496575の不要となる2バイトのスペースに、上から解析していくと0x00496576を巻き込むような命令になるよう、細工されたデータを入れておいた、ということです。つまり、この2バイトのデータはシーケンシャルにコードを解析していく逆アセンブラを騙すためのギミックだったということです。汚いなさすが忍者きたない(出展:ブロントさん名言集)

 

こうして現れた続きのコードを追うことで、このコードの真意にたどり着こうというわけです。

これが見切れれば、「私にも敵が見える!」とドヤ顔できるでしょう。

 

・・・と思ったら、続きのコードは暗号に関連する処理。

こうなると、この処理を実行して、復号化した結果を見る必要があります。

デバッグ機能の実装が待ち遠しいですね・・・。

 

(暗号化されたデータの復号化処理っぽいところの開始部分)

 

2019/6/15追記:

検体のハッシュ値

MD5:5A80F4F7307ED946DB450DD42EEA2F77
SHA1:5398F2F77C5DCEC3A98041E8D61B67D06B452FDF