使用 pypcode 语义在 Python 中进行半自动化装配验证

主要观点:作者从事二进制验证工具开发一段时间,在项目中常处理编译器输出的二进制垃圾等。提出在文本汇编中添加内联验证注释的想法,类似 Dafny 或 Frama-C,还介绍了相关设计约束及多种实现方式,如利用 Pypcode 等工具,通过编写宏和使用 SMTLib 规范语言来实现对二进制程序的验证,并给出了多个示例代码展示验证过程及遇到的问题和后续改进方向,如处理 exits 和 assumes、支持更多架构等,同时提到了其他相关的二进制验证工作和资源。

关键信息:

  • 常用工具:ghidra、binutils、angr、Pypcode 等。
  • 设计约束:文件需能被常规 binutils 工具链汇编,倾向使用 Python 作为用户界面语言。
  • 验证方式:通过运行程序的所有路径,根据入口、断言、假设、出口等信息进行验证,遇到注释的出口则终止路径。
  • 示例代码:展示了多个简单的汇编代码示例及其验证过程,如移动值到寄存器、比较寄存器等。
  • 后续改进:处理 cuts、支持更多架构、优化错误输出等。

重要细节:

  • 宏的使用:通过定义宏来添加验证相关信息,如kd_entry等。
  • SMTLib 规范:以 SMTLib 作为规范语言,可通过编程生成规范或使用现有的 smt 库。
  • 验证函数:run_all_paths函数用于执行验证过程,遍历入口点,根据规范进行断言和假设的验证等。
  • 代码示例中的细节:如寄存器映射、具体的汇编指令操作等,以及在不同示例中对各种指令的验证过程和结果。
阅读 8
0 条评论