Ponce(发音为 ['poN θe] pon-the)是一个 IDA Pro 插件,它允许用户以简单直观的方式对二进制文件进行污点分析和符号执行。使用 Ponce,您只需点击一下即可获得尖端符号执行的全部力量。完全使用 C/C++ 编写。
符号执行在安全社区中并不是一个新概念。它已经存在多年,但直到 2015 年左右,像 Triton 和 Angr 这样的开源项目才被创建来解决这一需求。尽管这些项目可用,但终端用户通常需要自己实现具体的用例。
我们通过创建 Ponce 来满足这些需求,这是一个 IDA 插件,在逆向工程师最常用的反汇编器/调试器中实现了符号执行和污点分析。
Ponce 适用于任何 IDA 版本 >= 7.0 的 x86 和 x64 二进制文件。安装插件只需将 最新构建 中的相应文件复制到 IDA 安装目录的 plugins\ 文件夹中即可。
请确保使用针对您的 IDA 版本编译的 Ponce 二进制文件,以避免任何不兼容。
Ponce 原生支持 Windows、Linux 和 OSX!
该插件会自动运行,并在首次运行时引导您完成初始配置。配置将保存到配置文件中,因此您无需再次担心配置窗口。
在下一个 gif 中,我们可以看到自动污点的使用,以及如何在调试时否定一个条件并将其注入内存:
argv。elite,该密钥已注入内存,从而到达 Win 代码。crackme 源代码可以在这里找到。

在这个示例中,我们看到了污点引擎与 cmake 的使用。我们正在:
fread() 从文件中读取的缓冲区。
在下一个示例中,我们使用快照引擎:
fread() 从文件中读取的缓冲区。
示例源代码可以在这里找到。
在本节中,我们将列出不同的 Ponce 选项以及键盘快捷键:












Ponce 依赖于 Triton 框架 来提供语义、污点分析和符号执行。Triton 是一个由 Quarkslab 赞助、主要由 Jonathan Salwan 维护的优秀开源项目,拥有丰富的库。我们要感谢并支持 Jonathan 在 Triton 上的工作。你太棒了!:)
自 Ponce v0.3 起,我们已将构建编译过程迁移到使用 CMake。这样做统一了 Linux、Windows 和 OSX 的配置和构建方式。我们现在支持在伪代码中提供关于符号或污点指令的反馈。要使此功能正常工作,您需要将 hexrays.hpp 添加到 IDA SDK 的 include 文件夹中。hexrays.hpp 可以在 IDA 安装路径的 plugins/hexrays_sdk/ 中找到。如果您没有购买 hex-rays 反编译器,仍然可以通过使用 -DBUILD_HEXRAYS_SUPPORT=OFF 来构建 Ponce。我们使用 Github Actions 作为 CI 环境。如果您想了解构建过程是如何进行的,请查看操作文件。
Juan Ponce de León(1474 – 1521年7月)是一位西班牙探险家和征服者。他在美国发现了佛罗里达。这个 IDA 插件将帮助您发现、探索并希望征服二进制文件中的不同路径。
是的,您可以在 IDA for Windows 中原生使用 Ponce,或者远程附加到 Linux 或 OS X 机器上使用。在下一个 Ponce 版本中,我们将原生支持 Ponce for Linux 和 OS X 的 IDA 版本。
在我们的测试中,我们达到了每秒处理 3000 条指令的速度。我们计划使用 IDA 提供的 PIN tracer 来提高速度。
请开一个 issue,我们会尽快解决 ;)
当然可以!请做 pull request 并处理已打开的 issues。我们会用啤酒作为回报 ;)
混合执行和 Ponce 存在一些问题:
符号内存加载/写入:当用于读取内存值的索引是符号化时,例如 x = aray[symbolic_index],会出现一些问题,可能导致丢失对污点/符号化的用户控制输入的跟踪。
Triton 对浮点指令的处理不是很好。
混合执行只分析已执行的指令。这意味着在以下情况下符号跟踪会丢失:
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!
}