はじめに
Elastic Security Labsは、脅威ハンティングパイプラインとテレメトリキューを通じて侵入する多様なマルウェアを分析します。最近、DOUBLELOADERと呼ばれる新しいマルウェアファミリーに遭遇し、RHADAMANTHYSインフォスティーラーと一緒に見られました。DOUBLELOADERの興味深い属性の1つは、2023年に最初にリリースされたオープンソースの難読化ツールである ALCATRAZ で保護されていることです。このプロジェクトは、ゲームのハッキングコミュニティに端を発していますが、電子犯罪の分野でも観察されており、標的型 侵入に使用されています。
この投稿の目的は、ALCATRAZで採用されているさまざまな難読化技術について説明し、マルウェアアナリストとしてこれらの手法に対抗する方法に焦点を当てることです。これらの手法には、 制御フローのフラット化、 命令の突然変異、コンスタントアンフォールディング、LEAコンスタントハイディング、アンチディスアセンブル トリック 、エントリーポイントの難読化などがあります。
重要なポイント
- オープンソースの難読化ツールであるALCATRAZは、RHADAMANTHYS感染とともに展開された新しいマルウェアに確認されています
- 制御フローのフラット化などの難読化手法は、アナリストにとって引き続き障害となっています
- 難読化の手法とその対策方法を理解することで、組織は保護されたバイナリを効果的にトリアージして分析する能力を向上させることができます。
- Elasticセキュリティラボは、アルカトラズで保護されたバイナリの難読化を解除するツールをこちらの記事で公開しています
ダブルローダー
昨年12月から、私たちのチームは、 RHADAMANTHYS スティーラー感染と組み合わされた一般的なバックドアマルウェアを観察しました。PDBパスに基づいて、このマルウェアはDOUBLELOADERと自称しています。
このマルウェアは、NtOpenProcess
、NtWriteVirtualMemory
などのシステムコールを利用して、Windows デスクトップ/ファイル マネージャー (explorer.exe
) 内でバックアップされていないコードを起動するNtCreateThreadEx
。このマルウェアは、ホスト情報を収集し、自身の更新バージョンを要求し、バイナリ内に保存されているハードコードされたIP(185.147.125.81
)へのビーコン送信を開始します。
DOUBLELOADERサンプルには、実行可能な権限を持つ非標準セクション(.0Dev
)が含まれており、これはバイナリ難読化ツールの作者のハンドルに基づいて残されたツールマークです ALCATRAZ
。
ALCATRAZのような難読化ツールは、マルウェアのトリアージを複雑にすることになります。その主な目標は、バイナリ解析ツールを妨げ、さまざまな手法を通じてリバースエンジニアリングプロセスの時間を増やすことです。制御フローを隠したり、逆コンパイルをたどりにくくしたりするなど。以下は、DOUBLELOADER内の1つの関数の難読化された制御フローの例です。
この記事の残りの部分では、アルカトラズ島で使用されているさまざまな難読化技術に焦点を当てます。DOUBLELOADERの第1段階と基本的なコード例を使用して、アルカトラズ島の特徴を強調します。
アルカトラズ
アルカトラズ島の概要
アルカトラズ島は、2023年1月に最初にリリースされたオープンソースの難読化ツールです。このプロジェクトは、ゲームハッキングコミュニティ内で難読化技術を学ぶための基本的なツールとして認識されていますが、電子犯罪や APTグループによって悪用されていることも確認されています。
アルカトラズ島のコードベースには 5 標準的なコード難読化技術を中心とした主要な機能と、エントリポイントの難読化のための機能強化が含まれています。そのワークフローは標準の bin2bin
形式に従っており、これはユーザーがコンパイルされたバイナリを提供し、変換後に新しいコンパイルされたバイナリを受け取ることを意味します。このアプローチは、使いやすさ、最小限の労力で、ソースコードレベルでの変更が不要であるため、ゲームハッカー/マルウェア開発者にとって特に魅力的です。
開発者は、すべての関数または特定の関数を難読化することを選択したり、各関数に適用する難読化手法を選択したりできます。コンパイル後、ファイル名の末尾に文字列 (obf
) が付加されたファイルが生成されます。
アルカトラズ島の難読化技術
次のセクションでは、アルカトラズ島が実装するさまざまな難読化技術について説明します。
エントリポイントの難読化
難読化されたエントリポイントに対処することは、家族でのロードトリップの開始時にパンクするようなものです。この考え方は、アナリストを混乱させることと、プログラムの開始位置が直接明確でないため、分析プロセスの最初の段階で混乱を引き起こすバイナリツールに焦点を当てています。
次に、IDA Pro内の難読化されていないプログラムからのクリーンなエントリポイント(0x140001368
)のビューを示します。
エントリポイントの難読化を有効にすることで、アルカトラズ島はエントリポイントを移動し、プログラムの新しいエントリポイントを計算するアルゴリズムを含む追加のコードを含めます。以下は、難読化されたエントリポイントの逆コンパイルされたビューのスニペットです。
アルカトラズ島はオープンソースの難読化ツールであるため、カスタムエントリポイント コード を見つけて計算がどのように実行されるかを確認したり、独自の難読化された例を逆にしたりできます。逆コンパイルでは、アルゴリズムが PE ヘッダーのいくつかのフィールド ( Size of the Stack Commit
、 Time Date Stamp
、 .0dev
セクションの最初の 4 バイトなどを使用していることがわかります。これらのフィールドは解析され、右回転 (ROR) や排他的論理和 (XOR) などのビットごとの演算で使用され、エントリポイントが計算されます。
以下は、PE を解析して真のエントリポイントを見つけ、難読化されていないサンプルで元の開始ポイント(0x140001368
)を確認する IDA Python スクリプト(付録 A)の出力例です。
分解防止
マルウェアの開発者や難読化ツールは、逆アセンブル対策のトリックを使用して逆アセンブラを混乱させたり壊したりして、静的解析を困難にします。これらの手法は、線形スイープと再帰的逆アセンブルの弱点を悪用し、アナリストが基になる命令を手動または自動で修正することを余儀なくされるクリーンなコードの再構築を防ぎます。
アルカトラズ島では、この手法の1つの形式として、 0xFF
バイトから始まる命令を先頭にショートジャンプ命令( 0xEB
)を追加することで変更しています。0xFF
バイトは、スタック上の呼び出し、間接ジャンプ、プッシュを処理する複数の有効な命令の開始を表すことができます。前方にショート ジャンプ 0xEB
を追加することで、これは効果的に次のバイト 0xFF
にジャンプします。複雑ではありませんが、損傷は分解を壊し、何らかの介入を必要とします。
この特定の手法を修正するために、 0xEB
バイトの各出現箇所をNOPに置き換えることにより、ファイルにパッチを適用できます。パッチ適用後、コードはクリーンな状態に復元され、次の call
命令を正しく逆アセンブルできます。
命令の突然変異
難読化ツールが使用する一般的な手法の1つは、命令の変更であり、命令は元の動作を保持する方法で変換されますが、コードを理解するのが難しくなります。Tigress や Perses などのフレームワークは、命令の突然変異に関する難読化研究の好例です。
以下は、アルカトラズ島が実装したこの手法の一例で、2つのレジスタ間の加算は変更されますが、その意味的な等価性は損なわれません。単純な add
命令は、 5 つの異なる命令 (push
、 not
、 sub
、 pop
、 sub
) に変換されます。
これを修正するには、パターンマッチングを使用してこれらの 5 命令を一緒に見つけ、バイトを逆アセンブルして関係するレジスタを見つけ、Keystoneなどのアセンブラを使用して正しい対応するバイトを生成できます。
コンスタント・アンフォールディング
この難読化手法は、DOUBLELOADERサンプル全体に広く普及しており、さまざまな形式のマルウェアで広く使用されている方法です。ここでの概念は、コンパイル プロセスを逆にすることに焦点を当てています。ここで、コンパイル時に既知の計算を最適化する代わりに、難読化ツールはこれらの定数を「展開」し、逆アセンブルと逆コンパイルを複雑で混乱させます。以下は、既知の定数 (46
) が 2 つの数学演算に分割されるこの手法の簡単な例です。
DOUBLELOADERでは、即時値がレジスタに移動されるときにいつでもこの手法が使用されていることに遭遇します。これらの即時値は、これらの定数値をマスクする複数のビット演算に置き換えられるため、コンテキストやアナリストのフローが中断されます。たとえば、下の左側の逆アセンブルには、アドレス(0x18016CD93
)でのEAX値の比較指示があります。前の手順を確認すると、複数のあいまいなビットごとの計算により、EAX値が何であるべきかが明確ではありません。プログラムをデバッグすると、EAX値がに設定されていることがわかります 0
。
この難読化手法をクリーンアップするために、次のソースコードを使用して変換がどのように適用されるかを確認できる独自の例でその動作を確認できます。
#include <iostream>
int add(int a, int b)
{
return a + b;
}
int main()
{
int c;
c = add(1, 2);
printf("Meow %d",c);
return 0;
}
コンパイル後、左側のクリーンバージョンで main
関数の逆アセンブルを表示し、これら2つの定数(2,1
)がEDXレジスタとECXレジスタに移動されたことを確認できます。右側は変換されたバージョンで、新しく追加された命令の中に2つの定数が隠されています。
パターンマッチング手法を使用すると、これらの命令シーケンスを検索し、命令をエミュレートしてさまざまな計算を実行して元の値を取り戻し、残りのバイトにNOPをパッチしてプログラムがまだ実行されることを確認できます。
LEAの難読化
前述の手法と同様に、LEA(Load Effective Address)の難読化は、LEA命令に関連付けられた即時値を隠すことに重点を置いています。減算による算術計算は、LEA命令のすぐ後ろに続いて、元の意図した値を計算します。これは小さな変更のように思えるかもしれませんが、効果的なバイナリ分析に不可欠な文字列とデータへの相互参照を中断する大きな影響を与える可能性があります。
以下は、DOUBLELOADER 内でのこの手法の例で、RAX レジスタ値が初期値 (0x1F4DFCF4F
) をロードし、次に減算 (0x74D983C7
) して新しい計算値 (0x180064B88
) を求めるパターンによって偽装されています。
サンプル内のそのアドレスに移動すると、読み取り専用のデータ セクションに移動し、参照される文字列 bad array new length
を見つけることができます。
この手法を修正するために、パターンマッチングを使用してこれらの特定の命令を見つけ、計算を実行してから、新しいLEA命令を再構築します。64 ビット モードでは、LEA は RIP 相対アドレス指定を使用するため、アドレスは現在の命令ポインタ (RIP) に基づいて計算されます。最終的に、次のような新しい命令が得られます。 lea rax, [rip - 0xFF827]
.
この最終的な指示を作成する手順は次のとおりです。
この情報を使用して、IDA Pythonを使用してこれらすべてのパターンにパッチを適用できます(以下は固定LEA命令の例です)。
制御フローの難読化
制御フローのフラット化 は、条件分岐やループなどの従来の構造を排除することで、プログラムの制御フローの従来の構造を破壊する強力な難読化手法です。代わりに、状態変数に基づいて次に実行する基本ブロックを決定する中央ディスパッチャーを使用して実行を再構築するため、分析と逆コンパイルが大幅に困難になります。以下は、フラット化されていない制御フローとフラット化された制御フローの違いを表す簡単な図です。
私たちのチームは 、DOORME などのさまざまなマルウェアでこの手法を観察しており、この場合、フラット化された制御フローがALCATRAZ難読化ツールの主な 機能の 1つであることは驚くことではありません。フラット化解除に取り組むために、セキュリティ研究者のBoris Batteuxによって書かれたIDAプラグイン D810 を使用して、確立されたツールに焦点を当てました。
まず、バッファオーバーフローの検出に使用される一般的な _security_init_cookie
関数を使用した前のサンプルプログラムから始めます。以下は、難読化されていない形式のCookie初期化関数の制御フロー図です。グラフに基づいて、6つの基本ブロックと2つの条件分岐があり、実行フローを簡単にたどることができることがわかります。
同じ機能を取り、アルカトラズ島の制御フローフラット化機能を適用すると、 22 基本ブロック、 8 条件分岐、新しいディスパッチャーなど、プログラムの制御フローは大きく異なります。次の図では、色で塗りつぶされたブロックは難読化されていないバージョンの以前の基本ブロックを表し、残りのブロックは白で、実行のディスパッチと制御に使用される追加の難読化コードを表しています。
逆コンパイルを見ると、関数が while
ループ内のさまざまな部分に分割されており、新しい state
変数を使用してプログラムをガイドし、 popf/pushf
命令などの難読化の残骸をガイドしていることがわかります。
この関数をクリーニングするために、D810 は 2 つの異なるルール (UnflattenerFakeJump
、 FixPredecessorOfConditionalJumpBlock
) を適用し、マイクロコード変換を適用して逆コンパイルを改善します。
2025-04-03 15:44:50,182 - D810 - INFO - Starting decompilation of function at 0x140025098
2025-04-03 15:44:50,334 - D810 - INFO - glbopt finished for function at 0x140025098
2025-04-03 15:44:50,334 - D810 - INFO - BlkRule 'UnflattenerFakeJump' has been used 1 times for a total of 3 patches
2025-04-03 15:44:50,334 - D810 - INFO - BlkRule 'FixPredecessorOfConditionalJumpBlock' has been used 1 times for a total of 2 patches
逆コンパイラを更新すると、制御フローのフラット化が削除され、擬似コードがクリーンアップされます。
これは良い例ですが、制御フローの難読化の修正は、多くの場合、機能に依存する手動のタイムリーなプロセスになる可能性があります。次のセクションでは、学習したテクニックの一部をまとめ、それをDOUBLELOADERに適用します。
DOUBLELOADER 機能のクリーニング
マルウェアの難読化に対処する際の課題の1つは、個々の難読化手法ではなく、手法が階層化されている場合です。さらに、DOUBLELOADERの場合、コードの大部分が境界があいまいな関数チャンクに配置されるため、分析が困難になります。このセクションでは、アルカトラズ島で保護されたDOUBLELOADER機能のクリーニングプロセスを示す実例をご紹介します。
Start
エクスポートで起動すると、最初の呼び出しの 1 つが loc_18016C6D9
になります。これはより大きな関数へのエントリのように見えますが、IDAは 0x18016C8C1
で未定義の命令のために関数を適切に作成できません。
このアドレスまでスクロールすると、最初の混乱は、ブログ投稿(EB FF
)で以前に見たショートジャンプの逆アセンブル技術によるものであることがわかります。
これと同じ手法の近くの発生 6 修正した後、開始アドレス(0x18016C6D9
)に戻り、MakeFunction機能を使用できます。関数は逆コンパイルされますが、依然として難読化が進んでいるため、どの分析にも適していません。
逆アセンブルに戻ると、この関数で使用されているLEA難読化手法が、前のソリューションを使用して文字列定数 ”Error”
が回復されていることがわかります。
以下の別の例は、lpIconName
パラメーターが 0x7f00
(IDI_APPLICATION
) にクリーンアップされる LoadIcon
呼び出しの難読化されたパラメーターの変換を示しています。
逆コンパイルが改善されたので、D810 プラグインを使用して制御フローの難読化を削除してクリーンアップを完了できます。以下は、エフェクトのビフォーアフターを示すデモです。
このセクションでは、アルカトラズによって保護されている悪意のある難読化機能のクリーニングに取り組む実際のシナリオについて説明しました。マルウェア分析レポートには最終的な結果が表示されることがよくありますが、多くの場合、難読化の除去とバイナリの修正に前もって作業に費やされ、適切に分析できるようになります。
IDA Pythonスクリプト
私たちのチームは、アルカトラズの難読化ツールによって課せられるデフォルトの難読化技術を処理するために使用される一連の概念実証 IDA Pythonスクリプト をリリースしています。これらは、これらの手法を扱う際の基本的な例として役立つことを意図しており、研究目的で使用する必要があります。残念ながら、難読化に対処する際に特効薬はありませんが、いくつかの例と一般的な戦略があることは、将来同様の課題に取り組むために価値があります。
ヤラ
Elasticセキュリティは、このアクティビティを識別するためのYARAルールを作成しました。
観測
この研究では、次の観測量について議論しました。
すぐれた監視性 | タイプ | 名前 | 参考 |
---|---|---|---|
3050c464360ba7004d60f3ea7ebdf85d9a778d931fbf1041fa5867b930e1f7fd | SHA256 | DoubleLo.dll | ダブルローダー |
参照資料
上記の研究を通じて、以下のことが参照されました。