Z3约束器使用流程

Z3约束器使用流程

z3基本数据类型

Int #整型
Bool #布尔型
Array #数组
BitVec('a',8) #char型

其中BitVec可以是特定大小的数据类型,不一定是8,例如C语言中的int型可以用BitVec(a',32)表示

例如:x = Int('x') #这个int不是c/c++中的那个四字节,而仅仅只代表整数
y = Real('y') #实数变量(数学中的那个实数)
z = BitVec('z',8) #char型
m = BitVec('m',32) #int型
n = Bool('n') #定义布尔型

初始化未知数序列
flag =[BitVec('x%d'%i,8) for i in range(32)]      #char型序列
flag= [Int('%d'%i) for i in range(32)]                #int型整数序列
flag =[BitVec('x%d'%i,32) for i in range(32)]         #int型序列

z3求解四步骤

1.创建约束求解器

s = Solver()
Solver()命令会创建一个通用求解器,创建后我们可以添加我们的约束条件,进行下一步的求解
添加约束

2.s.add

s.add()命令用来添加约束条件,通常在solver()命令之后,添加的约束条件通常是一个逻辑等式

3.判断解是否存在

if(s.check( )==sat):
该函数通常用来判断在添加完约束条件后,来检测解的情况,有解的时候会回显sat,无解的时候会
unsat

4.求解

print(s.model( ))
在存在解的时候,该函数会将每个限制条件所对应的解集的交集,进而得出正解

CTF中的Z3模板

from z3 import *
s=Solver()
v = [BitVec(('x%d' % i), 8) for i in range(len(flag))]
flag=v[:]
for i in range(0, len(flag)):
    s.add(flag[i] <= 127)
    s.add(flag[i] >= 32)
#中间添加程序的加密正向算法
s.add(flag[i]==cmp[i])
if s.check() == sat:
    model = s.model()
    string = [chr(model[v[i]].as_long()) for i in range(len(flag))]
    print("".join(string))
posted @   陳51r  阅读(98)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示