主要观点:作者从事二进制验证工具开发一段时间,在项目中常处理编译器输出的二进制垃圾等。提出在文本汇编中添加内联验证注释的想法,类似 Dafny 或 Frama-C,还介绍了相关设计约束及多种实现方式,如利用 Pypcode 等工具,通过编写宏和使用 SMTLib 规范语言来实现对二进制程序的验证,并给出了多个示例代码展示验证过程及遇到的问题和后续改进方向,如处理 exits 和 assumes、支持更多架构等,同时提到了其他相关的二进制验证工作和资源。
关键信息:
- 常用工具:ghidra、binutils、angr、Pypcode 等。
- 设计约束:文件需能被常规 binutils 工具链汇编,倾向使用 Python 作为用户界面语言。
- 验证方式:通过运行程序的所有路径,根据入口、断言、假设、出口等信息进行验证,遇到注释的出口则终止路径。
- 示例代码:展示了多个简单的汇编代码示例及其验证过程,如移动值到寄存器、比较寄存器等。
- 后续改进:处理 cuts、支持更多架构、优化错误输出等。
重要细节:
- 宏的使用:通过定义宏来添加验证相关信息,如
kd_entry
等。 - SMTLib 规范:以 SMTLib 作为规范语言,可通过编程生成规范或使用现有的 smt 库。
- 验证函数:
run_all_paths
函数用于执行验证过程,遍历入口点,根据规范进行断言和假设的验证等。 - 代码示例中的细节:如寄存器映射、具体的汇编指令操作等,以及在不同示例中对各种指令的验证过程和结果。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。