
Ponce(発音は [ 'poN θe ] pon-they)は、IDA Pro のプラグインで、ユーザーがバイナリに対してテイント解析やシンボリック実行を簡単かつ直感的に行えるようにするものです。Ponce を使えば、最先端のシンボリック実行の力をワンクリックで手に入れることができます。完全に C/C++ で記述されています。
シンボリック実行はセキュリティコミュニティにおいて新しい概念ではありません。何年も前から存在していましたが、2015年頃になってようやく Triton や Angr のようなオープンソースプロジェクトがこのニーズに応えるために作成されました。これらのプロジェクトが利用可能であっても、エンドユーザーはしばしば特定のユースケースを自ら実装する必要があります。
私たちはこのニーズに応えるため、リバースエンジニアが最も使用する逆アセンブラ/デバッガである IDA にシンボリック実行とテイント解析を実装したプラグイン、Ponce を作成しました。
Ponce は x86 および x64 の両方のバイナリで動作し、IDA バージョン 7.0 以降に対応しています。インストールは、最新のビルド から適切なファイルを IDA インストールディレクトリの plugins\ フォルダにコピーするだけです。
互換性の問題を避けるため、お使いの IDA バージョンに合わせてコンパイルされた Ponce バイナリを使用してください。
Ponce は Windows、Linux、OSX でネイティブに動作します。
プラグインは自動的に実行され、初回実行時に初期設定を案内します。設定は設定ファイルに保存されるため、設定ウィンドウについて再度心配する必要はありません。
次の gif では、自動テイントの使用と、条件を否定してデバッグ中にメモリに注入する方法を示しています。
argv をシンボル化するオプションを設定します。elite を取得し、Win コードに到達します。クラックミーのソースコードはこちらにあります。

この例では、cmake でのテイントエンジンの使用を示しています。以下を行っています。
fread() がファイルから読み取るバッファをテイントします。
次の例では、スナップショットエンジンを使用しています。
fread() がファイルから読み取るバッファをテイントします。
サンプルソースコードはこちらにあります。
このセクションでは、さまざまな Ponce オプションとキーボードショートカットをリストします。













Ponce は Triton フレームワーク に依存して、セマンティクス、テイント解析、シンボリック実行を提供しています。Triton は Quarkslab がスポンサーとなり、主に Jonathan Salwan によってメンテナンスされている素晴らしいオープンソースプロジェクトで、豊富なライブラリを備えています。Jonathan の Triton への取り組みに感謝し、支持します。最高です!:)
Ponce v0.3 以降、ビルドコンパイルプロセスを CMake を使用するように変更しました。これにより、Linux、Windows、OSX での設定とビルドの方法が統一されました。現在では、シンボリックまたはテイント命令に関するフィードバックを疑似コード上で提供することがサポートされています。この機能を有効にするには、hexrays.hpp を IDA SDK のインクルードフォルダに追加する必要があります。hexrays.hpp は IDA インストールパスの plugins/hexrays_sdk/ にあります。hex-rays デコンパイラを購入していない場合でも、-DBUILD_HEXRAYS_SUPPORT=OFF を使用して Ponce をビルドできます。CI 環境として Github Actions を使用しています。ビルドプロセスを理解したい場合は、アクションファイル を確認してください。
フアン・ポンセ・デ・レオン(1474年 - 1521年7月)は、スペインの探検家でありコンキスタドールでした。彼はアメリカ合衆国のフロリダを発見しました。この IDA プラグインは、バイナリ内のさまざまなパスを発見、探索、そして征服するのに役立ちます。
はい。Windows 用の IDA で Ponce をネイティブに使用するか、リモートで Linux または OS X のマシンにアタッチして使用できます。次のバージョンの Ponce では、Linux および OS X 用の IDA バージョンで Ponce をネイティブサポートする予定です。
私たちのテストでは、毎秒 3000 命令を処理できました。IDA が提供する PIN トレーサーを使用して速度を向上させる予定です。
問題 を報告してください。できるだけ早く解決します ;)
もちろん!プルリクエストを送って、未解決の問題に取り組んでください。ビールをおごりますので、助けてください ;)
Concolic 実行と Ponce にはいくつかの問題があります。
シンボリックメモリのロード/書き込み:x = aray[symbolic_index] のようにメモリ値を読み取るインデックスがシンボリックである場合、ユーザー制御のテイント/シンボル化された入力の追跡が失われる可能性がある問題が発生します。
Triton は浮動小数点命令 でうまく動作しません。
Concolic 実行は実行された命令のみを解析します。つまり、以下のようなケースではシンボリック追跡が失われます。
int check(char myinput) // Input is symbolic/tainted
{
int flag = 0;
if (myinput == 'A') //This condition is symbolic/tainted
flag = 1
else
flag =- 1;
return flag; // flag is not symbolic/tainted!
}