Cisco Japan Blog
Share

Talos から素晴らしいツールをプレゼント


2020年12月28日


年末の休暇期間中に何か夢中になれるものをお探しなら、Cisco Talos が提供するオープンソースツールはいかがですか。

Talos は先日、最新版の IDA で動作する GhIDA の新バージョンをリリースしました。また、受賞歴のある Dynamic Data Resolverpopup_icon(DDR)の新機能も近日中にリリースする予定です。

GhIDA

GhIDA は、IDA Pro に Ghidra デコンパイラを統合するプラグインです。このプラグインは、ヘッドレスアナライザを呼び出すことで Ghidra と直接通信するか、Docker コンテナ「Ghidraaas」経由(REST API を使用)で Ghidra と通信します。GhIDA を使用すると、Ghidra で逆コンパイルされたコードを IDA Pro 内で簡単かつ手軽に確認でき、関数名の変更、コードの強調表示、コメントの追加といった基本的操作を行えます。

GhIDA と Ghidraaas の主な機能の概要を以下に示します。詳細については、元のブログ記事と GitHub ページをご覧ください。

逆コンパイルには GhIDA が便利

基本ブロックが多く、複雑な CFG がある場合は、逆コンパイルされたコードを確認すると、関数の主要な処理を特定しやすくなります。Emotet バイナリの 2 つの関数(0x00403860 と 0x00403960)を例に、GhIDA を使ってバイナリの逆コンパイルを効果的に行う方法をここでご紹介します。

  • まず、ショートカットキー Ctrl + Alt + D を使用して GhIDA による 0x00403860 の逆コンパイルを開始します。
  • GhIDA で逆コンパイルされたコードのビューを IDA のテキストビューまたはグラフビューの隣に移動します。
  • 逆コンパイルされたコードのビューとショートカット「N」を使用して、関数名と変数名を更新します。ショートカット「:」を使用してコメントを追加することもできます。次のスクリーンショットでは、「sub_403860」の名前を「Custom_RC4」に変更しています。
  • 呼び出し元関数内の関数名を更新する場合は、呼び出し元関数の逆コンパイルされたコードをキャッシュから削除し(右クリックして [現在の関数のキャッシュをクリア(Clear cache for current function)] を選択し)、逆コンパイルを再度実行します。次の例では、0x00403960 関数をもう一度逆コンパイルし、逆コンパイルされたコード内の呼び出し先関数「Custom_RC4」の名前を更新しています。

GhIDA の機能の詳細は、次のビデオからもご覧いただけます。

GHIDA は Python 2 / Python 3 で利用可能

GhIDA には、Python 2 用と Python 3 用の 2 つのバージョンがあります。IDA 7.4 には IDAPython API の Python 3 バージョンを追加したほか、GhIDA の Python 3 バージョンも新たに作成しました。まだすべてのユーザが IDA Python 3 に移行しているわけではないため、当面は両方のバージョンのプラグインを維持する予定です。

最新バージョンの GhIDA は、GitHub のリリースページpopup_iconからダウンロードできます。Talos では、Ghidra 9.1.2 を使用し、IDA 7.3(Python 2 バージョン)および IDA 7.5(Python 3 バージョン)でプラグインのテストを行っています。

Ghidraaas によるバイナリ分析の自動化

Ghidraaas は、Ghidra によるバイナリ分析を自動化するためのシンプルな REST API を提供する Docker コンテナです。同じファミリに属する複数のサンプルを分析する場合は、Ghidraaas を分析ワークフローに統合し、関数の抽出と逆コンパイルを自動化すると便利です。

現在の API セットは、Ghidra によるバイナリ分析の開始、関数のリストの取得、特定の関数の逆コンパイルという 3 つの主要機能を提供します。さらに、新しい Ghidra プラグインを組み込んで REST API を更新すると、特定の要件に基づいて新しい機能を簡単に公開できます。

DDR バージョン 1.0.2

IDA 向けには、新しいバージョンの Dynamic Data Resolver を近日中にリリースする予定です。皆様からのご要望を受けた他の新機能も追加されます。DDR を使うと、レジスタやメモリ位置などの動的な値をトレースできます。バッファをダンプしたり、サンプルにパッチを適用してコード実行フローを変更したりすることもできます。詳細については、DDR に関する以前のブログ記事をご覧ください。DDR も GitHubpopup_icon からダウンロードできます。

以前のバージョンの DDR では、0x410000 〜 0x412000 のように絶対コード範囲を入力するか、特定の基本ブロックをマークする必要がありました。しかし新バージョンでは、開始アドレス機能とブレークアドレス機能が導入されており、柔軟なアドレス指定が可能になっています。特定のアドレス範囲を定義するだけでなく、図 1 に示すように開始アドレスとブレークアドレスを追加することもできます。そのため、検索するコード範囲をさらにきめ細かく定義できるようになっています。

図 1

新しいアーキテクチャにはいくつかの利点があります。まず、IDA のワークフローが改善されます。また、分析する部分を絞り込むことで、分析が高速化されます。さらに、特定の部分を調べた後でコード実行を停止するブレークアドレス機能も追加しています。図 1 で説明したように、開始アドレスとブレークアドレスの違いは、開始アドレスの前のコードが実行されることです。

もう 1 つの新しいオプションは、分析対象のサンプルにコマンドラインパラメータ(図 2)を渡すオプションです。これらの新機能はすべて、[DDR/選択(DDR/Select)] メニューから設定できます。

図 2

一部のユーザの混乱を解消するために、IDA の再配置チェック機能も追加しました。DDR は、IDA から渡された仮想アドレス(0x410010 など)を使用して、サンプルが実行時に使用する仮想アドレスにマッピングします。再配置は DDR によって自動的に処理されます。IDA でサンプルをリベースする場合、または IDA デバッガによってサンプルが自動的にリベースされた場合、このプロセスは現時点では機能しません。たとえば、IDA でサンプルをデバッグして、ローダがサンプルを再配置したために、IDA がコードセグメントをリベースした場合などです。DDR プラグインは、IDA から PE ファイルベースの元の仮想アドレスを取得することを想定しているため、DDR は誤ったアドレスを使用することになります。

概要ビデオ

次のビデオでは、DDR 1.0.2 ベータ版で実装された新機能について説明しています。ベータ版と呼ばれていますが、DDR の中で最も完成度の高いテスト済みのバージョンですので、ぜひ使用してみてください。

更新とインストール

従来どおり、インストーラpopup_iconをダウンロードして実行するだけで、既存の DDRpopup_icon インストールを更新できます。インストーラスクリプトによってサーバ側にインストールディレクトリが存在するかどうかが確認され、「existing installation found(既存のインストールが見つかりました)」という情報メッセージに対して OK を選択すると、既存のインストールが削除されます。プラグイン側も同様です。インストーラスクリプトを実行すると、既存のインストールディレクトリ全体とその内容(C:\tools\DDR など)が削除されることにご注意ください。インストーラによってインストールディレクトリが削除される前に、必要なファイルがインストールディレクトリ内に保存されていないかを確認してください。DDR は Python3 のみをサポートしています。

皆様が Talos のツールを楽しみながら、素晴らしい新年を迎えられることをスタッフ一同願っています。また、年末の休暇期間が皆様にとって家族や友人とゆっくり過ごせる素晴らしい時間になることをお祈りします。そして、リバースエンジニアリングの楽しさもじっくりと味わってみてください。

 

本稿は 2020 年 12 月 17 日に Talos Grouppopup_icon のブログに投稿された「Talos tools of the tradepopup_icon」の抄訳です。

 

Tags:
コメントを書く