SMT
概述
可满足性模理论(Satisfiability Modulo Theories,简称 SMT) 可以看作是一个更强大的 “解方程” 工具。它解决的核心问题是:在特定的数学理论(如整数运算、数组、位向量等)背景下,判断一个逻辑公式是否存在一组解
工作原理
主流的 SMT 求解器多采用 “惰性(Lazy)算法”,其工作流程像一个高效的 “猜-验” 循环:
抽象化:将 SMT 公式中的理论部分(如
x > y)替换为布尔变量,交给内部的 SAT 求解器去 “猜” 一个可能的布尔赋值组合理论验证:将 SAT 求解器 “猜” 出的布尔组合,还原回具体的理论约束,交给对应的理论求解器(如线性算术求解器)去 “验” 证这些约束是否有数学上的解
反馈与迭代:
有解:如果理论求解器找到了解,则整个 SMT 公式可满足,求解成功
- 无解:如果理论求解器发现矛盾,它会生成一个 “冲突子句” 反馈给 SAT 求解器,告知它这种 “猜测” 行不通。SAT 求解器会排除这个错误选项,继续 “猜” 下一个组合
结束:重复此过程,直到找到可行解,或 SAT 求解器穷尽所有可能后宣布不可满足
主流 SMT 求解器
目前已有众多功能强大的SMT求解器,以下是一些主流代表
Z3:由微软研究院开发,因其鲁棒性、多功能性和频繁更新,被广泛认为是表现最好的求解器之一
CVC5:由斯坦福大学等机构开发,是著名求解器 CVC4 的继任者
Yices2:由 SRI International 开发
Alt-Ergo:在 SMT 竞赛中常见的求解器
实战案例
martricks(矩阵 + SMT 求解)

IDA 反编译

1 | flag = input() |
也就是说:
A 是由输入 flag 变形得到的矩阵
B 是由程序内置数组
byte_601060变形得到的矩阵
所以后续目标就是根据 byte_601060 和 byte_6010A0 反推出 A,再根据 A 还原 flag
1 | from z3 import * |
