読者です 読者をやめる 読者になる 読者になる

Twitterに書ききれないこと

イベントや技術的なことを記したい・・・

Practical Malware Analysis Chapter 1

マルウェア解析についての有名な書籍にPractical Malware Analysisがある。

その書籍を勉強のために翻訳・要約した記事。

全訳ではないので、詳細は原書を読んでください。

Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software

Practical Malware Analysis: The Hands-On Guide to Dissecting Malicious Software

1章 基本的な静的解析テクニック

静的解析は、プログラムの機能を決定するコード、または構造を解析する。 プログラムは実行せすに解析する。

この章では、実行ファイルから有用な情報を抽出するための複数の方法について説明する。この章では、次の方法を説明する

それぞれの技術は、異なる情報を提供することができる。 使用するものは、目標によって異なる。 一般的には、できるだけ多くの情報を収集するために、いくつかの技術を使用する。

アンチウイルススキャニング:便利なファーストステップ

複数アンチウイルスソフトを介して実行する。 アンチウイルスソフトすでにマルウェアを識別している可能性がある。 しかし、アンチウイルスソフトは完璧ではない。 アンチウイルスソフトは、データベースに登録されている情報に依存している。 識別可能な場合は、登録されている不審なコード(ファイルシグネチャ)、疑わしいファイルを特定するための行動、パターンマッチング解析(ヒューリスティック)に一致する場合である。

マルウェア作成者が、これらの情報を変更することで、アンチウイルスソフトを簡単に回避することができるという問題がある。 高度なマルウェアは、多くの場合アンチウイルスソフトによって検出されない。 ヒューリスティックは、未知の悪意のあるコードを検出することに成功しているが、新しい独自のマルウェアによってバイバスが可能である。

さまざまなアンチウイルスソフトが異なるシグネチャヒューリスティックを使用するため、複数の異なるアンチウイルスソフトを実行すると有効である。 VirusTotalhttp://www.virustotal.com/)などのウェブサイトでは、複数アンチウイルスソフトでスキャンするファイルをアップロードすることができる。 VirusTotalは、マルウェアの検知結果の合計数をレポートとして提供する。

ハッシュ:マルウェアの指紋

ハッシュはマルウェアを一意に識別するために使用される一般的な方法である。 セキュアハッシュアルゴリズム1(SHA-1)も普及しているが、メッセージダイジェストアルゴリズム5(MD5ハッシュ関数が、一般的にマルウェアの解析で使用される。

マルウェアハッシュ値は以下のように使える。 * ラベルとして使用する * マルウェアの識別をするために、他の解析者とハッシュ値を共有する * マルウェアの特定のため、オンラインでハッシュ値を検索する

文字列の検索

特定の場所にファイルをコピー場合、メッセージを出力した場合、URLに接続した場合、プログラムには文字列が含まれる。 文字列を検索することで、プログラムの機能についてのヒントを得ることができる。

通常、文字列はASCIIまたはUnicodeである。 終端文字がNULLであると、文字列が完全であることがわかる。ASCII文字列は、文字あたり1バイトを使用し、Unicodeは文字ごとに2バイトを使用する。ASCIIでは、0×41は文字'A'を表し、0x00がNULLを表す。 f:id:pinksawtooth:20150829195304p:plain

Stringsによって検出された文字列は、実際の文字列ではない。0x41というバイトを解釈して表示しているだけである。 これらのバイトは、実際にその文字列を表していない可能性がある。これらはプログラムで使用されるメモリアドレス、CPU命令、またはデータである可能性もある。

表示される内容の例を示す。

パックとマルウェアの難読化

マルウェア作成者は、マルウェアの検出や解析を困難にするために、パッキングや難読化を使用する。 難読化プログラムとは、マルウェア作者が解析者から隠そうとした実行ファイルのことを言う。 その中でも、悪意あるプログラムが圧縮され、分析することができない状態のものをパックプログラムと言う。 両方の技術とも、マルウェアの静的解析を制限する。

正規のプログラムは、多くの文字列が含まれている。 パックや難読化されたマルウェアは含まれている文字列が極めて少ない。 Strngsで文字列がほとんど表示されない場合、そのプログラムはパックか難読化されている可能性が高い。 パック、難読化されているコードには、LoadLibraryとGetProcAddressなどがしばしば含まれる。

パッキングされたファイル

パックされたプログラムが実行されたとき、小さなラッパプログラムは、圧縮ファイルを解凍して、解凍されたファイルを実行するために実行される。 静的解析では、小さなラッパプログラムの部分のみ解析できる。 圧縮されたファイルの文字列、インポート関数、およびその他の情報は圧縮されていて、ほとんどの静的解析ツールには見えない。 f:id:pinksawtooth:20150829204500p:plain

PEiDによるパッカー検知

PEiDを使ってパッカーを検出することができる。 開発とサポートは2011年4月に終了しているが、パッカーおよびコンパイラの検出のために利用できるツールである。

多くのPEIDプラグインは警告なしに、マルウェア実行ファイルを実行する。マルウェア解析は安全な環境行わなければならない。

シグネチャを追加でダウンロードすると検知率が向上する。

Portable Executableファイル形式

ファイルの形式は、プログラムの機能について、多くのことを明らかにすることが可能である。 Portable Executable (PE)ファイル形式は、Windowsの実行ファイル、オブジェクトコード、およびDLLで使用されている。 Windowsを対象とするマルウェアのほとんどがPE形式である。 PEファイルは、アプリケーションの種類、必要なライブラリ関数、容量の要件などコードの詳細を含むヘッダで始まる。

これらの情報は、マルウェアの解析時に有用である。

リンクされたライブラリと関数

マルウェアのインポート関数リストは解析時に有用となる。 ライブラリコードがリンクされる方法を知ることは、マルウェアの情報を理解するに重要である。 PEファイルのヘッダの中に、ライブラリをリンクするセクションがある。

静的リンク、ランタイムリンク、動的リンク

静的リンクは、ライブラリをリンクする最も一般的に使用される方法である。 UNIXおよびLinuxのプログラムでは一般的に使用されている。 ライブラリを、実行可能ファイルに静的にリンクすると、ライブラリがコードにコピーされ実行ファイルのサイズが大きくなる。 コードの解析時に、PEファイルのヘッダにリンク情報が含まれないため、静的にリンクされたコードと実行可能ファイルの独自のコードを区別することは困難である。

ランタイムリンクは、マルウェアがパックや難読化されている場合に使用される。 プログラム開始時にはリンクされず、関数が必要とされる場合にのみリンクされる。 WindowsAPIを使ってプログラムのファイルヘッダに記載されていないリンク関数をインポートすることができる。 最も一般的に使用されるの、LoadLibraryとGetProcAddressである。 他にも、LdrGetProcAddressとLdrLoadDllも使用される。 これらの関数を呼び出すことで、システム上の任意のライブラリ内の関数にアクセスすることが可能となる。

動的リンクでは、プログラムがロードされたとき、ホストOSが必要なライブラリを検索する。 プログラムが、リンクされたライブラリ関数を呼び出すと、その関数はライブラリ内で実行される。

マルウェアが呼び出すライブラリ関数は、マルウェアの挙動を推測するのに重要である。 例えば、URLDownloadToFileをインポートしている場合、インターネットに接続してファイルをダウンロードすることが推測できる。

Dependency Walkerによる動的にリンクされた関数の調査

Dependency Walkerを使って動的にリンクされた関数を調査することができる。 Dependency Walker (depends.exe) Home Page

DLLの一般的な機能を示す。

DLL 説明
Kernel32.dll メモリ、ファイル、ハードウェアのアクセスと操作などコア機能。
Advapi32.dll サービスマネージャやレジストリなどの高度なWindowsのコアコンポーネントへのアクセス。
User32.dll ユーザーのアクションの制御・応答のためのボタン、スクロールバーなど、すべてのユーザー・インタフェース・コンポーネント
Gdi32.dll 表示やグラフィックスを操作するための関数。
Ntdll.dll Windowsカーネルへのインターフェイス。Kernel32.dllによって間接的にインポートされる。
WSock32.dll Ws2_32.dll ネットワークに接続、またはネットワーク関連のタスクを実行する。
Wininet.dll 上位レイヤーのネットワーク機能。FTP、HTTP、NTPなどのプロトコル

WindowsAPI命名規則

Exというサフィックスを持つ関数は、古いAPIを拡張したもの。
末尾のAまたはWは、ASCII文字列用とワイド文字用を示す。

インポート関数

PEファイルのヘッダには、実行可能ファイルによって使用される関数についての情報が含まれる。 Windows関数の名前は、解析時のヒントになる。 Windows APIについては、MSDNでドキュメントを確認することができる。

エクスポート関数

通常、DLLは1つ以上の関数を実装し、提供する。 PEファイルには、エクスポート関数に情報が含まれている。 DLLは関数を提供するために使われるが、EXEファイルの場合、関数をエクスポートすることはほとんどない。 EXEファイルでエクスポート関数がある場合、解析時の有力な情報になる。

インポート関数と同様に、エクスポート関数名は解析時のヒントとなる。 しかし、任意の名前をつけることができるため、注意が必要である。

PEファイルのヘッダとセクション

PEファイルのヘッダには、インポート関数よりも多くの情報がある。 PEファイル形式はヘッダと複数のセクションに分かれている。 ヘッダにはファイルに関するメタデータが含まれている。

各セクションには以下の情報が含まれている。

  • .text

    .textセクションは、CPUが実行する命令が含まれている。他のすべてのセクションは、データおよび補助情報を格納している。通常、このセクションのコードのみが、実行されるコードである。

  • .rdata

    .rdataセクションには、インポート・エクスポートの情報が含まれる。また、プログラムで使用される、読み取り専用データが格納されている。.idataセクションと.edataセクションに分かれる。

  • .data

    .dataセクションは、プログラムのどこからでもアクセス可能な、グローバルデータが含まれている。ローカルデータは、このセクションに保存されているか、PEファイル中にないかどちらかである。

  • .rsrc

    .rsrcセクションは、アイコン、画像、メニュー、文字列など、実行ファイルで使用するリソースが含まれる。文字列は.rsrcセクションの中か、メインプログラムで保存することができるが、多言語サポートのための.rsrcセクションに格納されることが多い。

実行ファイル 説明
.text 実行可能なコードが含まれる。
.rdata プログラム内でグローバルにアクセス可能な、読み取り専用のデータを保持する。
.data プログラム全体からアクセス可能なグローバルデータを格納する。
.idata インポート関数の情報を格納している。このセクションが存在しない場合、インポート関数の情報は、.rdataセクションに格納されている。
.edata エクスポート関数の情報を格納している。このセクションが存在しない場合、エクスポート関数の情報は、.rdataセクションに格納されている。
.pdata 4ビットの実行ファイルの例外処理情報を格納している。
.rsrc 実行ファイルが必要とするリソースを格納している。
.reloc ライブラリファイルの再配置のための情報が含まれる。

PEviewとPEファイルの検査

PEviewを使うとPEファイルの情報を見ることができる。 WJR Software - PEview (PE/COFF file viewer),...

PEフォーマットについては、以下のサイトで公開されているPDFがわかりやすい。 http://www.openrce.org/reference_library/files/reference/PE%20Format.pdf

IMAGE_DOS_HEADERは、互換性のためのヘッダで、とくに有用な情報はない。

IMAGE_FILE_HEADERは、ファイルに関する基本的な情報が含まれている。 コンパイル日時は、マルウェア分析やインシデント対応に非常に有用である。 しかし、コンパイル日時は偽装可能であるため、注意が必要である。

IMAGE_OPTIONAL_HEADERにも重要な情報が含まれている。 Subsystemは、コンソールかGUIプログラムかを示す。

IMAGE_SECTION_HEADERは、セクションに割り当てられているサイズやディスク上のサイズを示す。通常、この2つの値は等しくなければならない。小さな値の違いは、アライメントによるもので、正常である。 しかし、パックされている場合、この値が一致せず、メモリ上のサイズの方が大きくなる。

Resource Hackerによるリソースセクションの表示

リソースセッションは、知識がなくても調べることができる。 Resource Hackerは、文字列、アイコン、メニューなど実際のプログラムで表示されるものと同じものを確認できる。

Resource Hacker

 マルウェア解析のための有益なセクションを以下に示す。

  • アイコンセクション

    実行ファイルのアイコン画

  • メニューセクション

    ウィンドウに表示されるすべてのメニューの名前や表示されるテキスト

  • ダイアログセクション

    プログラムのダイアログメニュー

  • 文字テーブルセクション

    プログラムが格納している文字列

  • バージョン情報セクション

    バージョン番号、会社名、著作権などのステートメント

マルウェアが、実行前にリソースセッションに組み込まれた、実行ファイルやドライバを取り出す場合がある。Resource Hackerではこれらのファイルを抽出することもできる。

PEヘッダのまとめ

PEヘッダは、マルウェア解析に有用な情報が含まれている。 PEヘッダから得られる情報を以下に示す。

フィールド 情報
インポート マルウェアによって使用される他のライブラリの関数
エクスポート 他のプログラムやライブラリに呼び出されるマルウェアの関数
タイムスタンプ プログラムがコンパイルされた日時
セクション ファイル内のセクションの名前とディスク上、メモリ内のサイズ
サブシステム コマンドラインGUIアプリケーションかどうか
リソース 文字列、アイコン、メニュー、および他の情報