Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Ponce — IDA 2016 插件大赛获胜者!符号执行只需一键! | Kitploit
工具/GitHubGitHub/illera88/ponce
逆向工程调试器恶意软件分析CTF二进制分析
GitHubillera88/ponce

Ponce

IDA 2016 插件大赛获胜者!符号执行只需一键!

查看仓库
1.6k851年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
网站

Build for Windows Build for OSX Build for Linux

Ponce

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!

使用场景

  • 漏洞利用开发:Ponce 可以帮助您更高效地创建漏洞利用,因为漏洞利用开发者可以轻松查看哪些内存部分和寄存器是可控制的,以及哪些地址可以用作 ROP 小工具。
  • 恶意软件分析:Ponce 的另一个用途与恶意软件代码相关。分析特定恶意软件系列支持的指令,可以通过符号化一个简单的已知指令并否定检查指令的所有条件来轻松实现。
  • 协议逆向:Ponce 最有趣的用途之一是能够识别可控用户输入所需的 magic number、头部甚至整个协议。例如,Ponce 可以帮助您列出给定命令行二进制文件所接受的所有参数,或提取特定文件解析器所需的文件格式。
  • CTF:Ponce 加快了 CTF 期间逆向工程二进制文件的速度。由于 Ponce 完全集成在 IDA 中,您无需担心设置时间。它即开即用!

该插件会自动运行,并在首次运行时引导您完成初始配置。配置将保存到配置文件中,因此您无需再次担心配置窗口。

使用模式

  • 污点引擎:该引擎用于在二进制执行的每一步确定内存和寄存器的哪些部分可控于用户输入。
  • 符号引擎:该引擎在二进制执行路径的每一步维护寄存器和部分内存的符号状态。

示例

否定并注入条件

在下一个 gif 中,我们可以看到自动污点的使用,以及如何在调试时否定一个条件并将其注入内存:

  • 我们选择符号引擎,并设置选项来符号化 argv。
  • 我们识别出满足 crackMe 所需的条件。
  • 每次检查我们的输入字节与密钥时,我们否定并注入解决方案。
  • 最终我们得到密钥 elite,该密钥已注入内存,从而到达 Win 代码。

crackme 源代码可以在这里找到。

crackmexor_negate_and_inject

使用污点引擎跟踪用户控制输入

在这个示例中,我们看到了污点引擎与 cmake 的使用。我们正在:

  • 将文件作为参数传递给 cmake 以便它解析该文件。
  • 我们选择使用污点引擎。
  • 我们污点 fread() 从文件中读取的缓冲区。
  • 我们在调试器控制下恢复执行,以查看污点输入被移动到哪里。
  • Ponce 将重命名被污点化的函数。这些是用户以某种方式影响的函数,而不是简单执行的函数。

cmake_tainting_fread

使用否定、注入与恢复

在下一个示例中,我们使用快照引擎:

  • 将文件作为参数传递。
  • 我们选择使用符号引擎。
  • 我们污点 fread() 从文件中读取的缓冲区。
  • 我们在解析从文件读取的缓冲区的函数中创建一个快照。
  • 当一个条件被评估时,我们否定它,将解决方案注入内存,并用它恢复快照。
  • 解决方案将是“有效的”,因此我们将满足存在的条件。

fread_test_negate_restore_inject

示例源代码可以在这里找到。

使用方法

在本节中,我们将列出不同的 Ponce 选项以及键盘快捷键:

  • 访问配置和污点/符号窗口:Edit > Ponce > Show Config(Ctl+Shift+P 和 Ctl+Alt+T)

2016-09-15 11_39_08-configuracion

  • 启用/禁用 Ponce 追踪(Ctl+Shift+E)

2016-09-15 11_31_34-

  • 符号化/污点一个寄存器(Ctl+Shift+R)

2016-09-15 11_32_32-

  • 符号化/污点内存。可以从 IDA View 或 Hex View 进行(Ctl+Shift+M)

2016-09-15 11_32_52-ida - testproject idb testproject exe c__users_default default-pc_documents_vi 2016-09-15 11_33_10-taint _ symbolize memory range

2016-09-15 12_09_11-inicio

  • 求解公式(Ctl+Shift+S)

2016-09-15 11_35_11-

  • 否定并注入(Ctl+Shift+N)

2016-09-15 11_34_44-

  • 否定、注入并恢复快照(Ctl+Shift+I)

2016-09-15 11_47_19-

  • 创建执行快照(Ctl+Shift+C)

2016-09-15 11_37_40-

  • 恢复执行快照(Ctl+Shift+S)

2016-09-15 11_38_10-

  • 删除执行快照(Ctl+Shift+D)

2016-09-15 11_38_23-

  • 原生执行(Ctl+Shift+F9)

2016-09-15 12_07_10-

Triton

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 环境。如果您想了解构建过程是如何进行的,请查看操作文件。

常见问题

为什么取名 Ponce?

Juan Ponce de León(1474 – 1521年7月)是一位西班牙探险家和征服者。他在美国发现了佛罗里达。这个 IDA 插件将帮助您发现、探索并希望征服二进制文件中的不同路径。

Ponce 可以用于分析 Windows、OS X 和 Linux 二进制文件吗?

是的,您可以在 IDA for Windows 中原生使用 Ponce,或者远程附加到 Linux 或 OS X 机器上使用。在下一个 Ponce 版本中,我们将原生支持 Ponce for Linux 和 OS X 的 IDA 版本。

Ponce 每秒可以处理多少条指令?

在我们的测试中,我们达到了每秒处理 3000 条指令的速度。我们计划使用 IDA 提供的 PIN tracer 来提高速度。

某些功能无法正常工作!

请开一个 issue,我们会尽快解决 ;)

我很喜欢你的项目!我可以参与贡献吗?

当然可以!请做 pull request 并处理已打开的 issues。我们会用啤酒作为回报 ;)

局限性

混合执行和 Ponce 存在一些问题:

  • 符号内存加载/写入:当用于读取内存值的索引是符号化时,例如 x = aray[symbolic_index],会出现一些问题,可能导致丢失对污点/符号化的用户控制输入的跟踪。

  • Triton 对浮点指令的处理不是很好。

  • 混合执行只分析已执行的指令。这意味着在以下情况下符号跟踪会丢失:

    root@kitploit:~
    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!
    }
    

作者

  • Alberto Garcia Illera (@algillera) [email protected]
  • Francisco Oca (@francisco_oca) [email protected]
下载工具