当前位置: 首页 > news >正文

z3基础学习

z3基础学习

​ z3是一个微软出品的开源约束求解器,能够解决很多种情况下的给定部分约束条件寻求一组满足条件的解的问题。

安装:pip install z3-solver

1. 简单使用

from z3 import *
x = Int('x') #创建名为x的int类型变量
y = Int('y')
solve(x + y==10,2*x+4*y==32) #求解并输出结果
#[y = 6, x = 4]

添加约束条件

from z3 import *
a,b=Ints('a b')
s=Solver() #创建一个约束求解器
s.add(a+b==10) #添加约束条件
s.add(a+3*b==12)if s.check()==sat: #有解r=s.model() #求解
print(r) #[b = 1, a = 9]
print(r[a]) #9
print(r[b]) #1

精度设置,简化表达式

from z3 import *
x=Real('x')
y=simplify(3*x+1==2) #化简表达式
print(y) #x == 1/3
solve(y) #[x = 1/3]
set_option(rational_to_decimal=True) #实数结果以小数呈现,默认10位小数
solve(y) #[x = 0.3333333333?]
set_option(precision=30) #精度设为30位
solve(y) #[x = 0.333333333333333333333333333333?]
#有问号说明输出有精度限制x, y = Reals('x y')
# 简化为单项式之和
t = simplify((x + y)**3, som=True)
print (t) #x*x*x + 3*x*x*y + 3*x*y*y + y*y*y
# 幂运算符简化
t = simplify(t, mul_to_power=True)
print (t) #x**3 + 3*x**2*y + 3*x*y**2 + y**3

快速添加变量

s=[Real('s%d' % i) for i in range(50)] #添加50个Real变量
s.add(s[18]*s[8]==5)

可见字符

s.add(x<127)
s.add(x>=32)

注意:

  • 当问题有多个解时,z3求解器只会输出一个解
  • z3不允许列表与列表间添加==约束

2. 数据类型

数据类型格式解释
整数x=Int('x')
实数y=Real('y')
RealVal(1)实数1
布尔b=Bool('b')
有理数Q(1,3)表示1/3
位向量x=BitVec('x',16)长度16位的变量x
BitVecVal(10,32)大小为32的位向量,其值为10
数组a=Array('a',IntSort(),IntSort())索引为整数,值为整数

3. 布尔逻辑与常见运算符

>> <<
== >= > !=
And() Or() Not() 
Implies(P,Q) #蕴含式 p->Q,若P则Q
z=If(b,x,y) #b为真,则z=x,否则z=y

4. 尝试一下

useZ3.bin

main函数

在这里插入图片描述

跟踪一下

在这里插入图片描述

a1,a2是Dword数组的地址,按Y改一波类型

在这里插入图片描述

在这里插入图片描述

from z3 import *
dword_602120=[0x0000007A, 0x000000CF, 0x0000008C, 0x00000095, 0x0000008E, 0x000000A8, 0x0000005F, 0x000000C9, 0x0000007A, 0x00000091, 0x00000088, 0x000000A7, 0x00000070, 0x000000C0, 0x0000007F, 0x00000089, 0x00000086, 0x00000093, 0x0000005F, 0x000000CF, 0x0000006E, 0x00000086, 0x00000085, 0x000000AD, 0x00000088, 0x000000D4, 0x000000A0, 0x000000A2, 0x00000098, 0x000000B3, 0x00000079, 0x000000C1, 0x0000007E, 0x0000007E, 0x00000077, 0x00000093]
dword_6021C0=[0x00000010, 0x00000008, 0x00000008, 0x0000000E, 0x00000006, 0x0000000B, 0x00000005, 0x00000017, 0x00000005, 0x0000000A, 0x0000000C, 0x00000017, 0x0000000E, 0x00000017, 0x00000013, 0x00000007, 0x00000008, 0x0000000A, 0x00000004, 0x0000000D, 0x00000016, 0x00000011, 0x0000000B, 0x00000016, 0x00000006, 0x0000000E, 0x00000002, 0x0000000B, 0x00000012, 0x00000009, 0x00000005, 0x00000008, 0x00000008, 0x0000000A, 0x00000010, 0x0000000D]
unk_602080=[0x00000008, 0x00000001, 0x00000007, 0x00000001, 0x00000001, 0x00000000, 0x00000004, 0x00000008, 0x00000001, 0x00000002, 0x00000003, 0x00000009, 0x00000003, 0x00000008, 0x00000006, 0x00000006, 0x00000004, 0x00000008, 0x00000003, 0x00000005, 0x00000007, 0x00000008, 0x00000008, 0x00000007, 0x00000000, 0x00000009, 0x00000000, 0x00000002, 0x00000003, 0x00000004, 0x00000002, 0x00000003, 0x00000002, 0x00000005, 0x00000004, 0x00000000]
s=Solver()
a1=[BitVec('%d' % i, 8) for i in range(36)] #8位位向量
ptr=[0]*36
v7=[0]*36
v8=[0]*36
v9=[0]*36for i in range(36):s.add(a1[i] <127)   #添加约束条件①s.add(a1[i] >=32)for i in range(36):ptr[i] = a1[i] >> 4v7[i] = a1[i] & 15for i in range(6):for j in range(6):for k in range(6):v8[6*i+j] += ptr[6*i + k] * unk_602080[6*k+j]for i in range(6):for j in range(6):v9[6*i+j]=v7[6*i+j]+unk_602080[6*i+j] #原函数识别一下数组for i in range(36):s.add(v8[i] == dword_602120[i])s.add(v9[i] == dword_6021C0[i])flag=[]
if s.check()==sat:r=s.model()for i in a1:flag.append(r[i].as_long())#BitVecNumRef转长整型print("".join(chr(x) for x in flag))
else:print("无解")
#hgame{1_think_Matr1x_is_very_usef5l}

参考

  1. z3学习 lancer0rz
http://www.lryc.cn/news/413342.html

相关文章:

  • 开发助手专业版,有反编译等多种功能
  • 嵌入式初学-C语言-十一
  • 浅谈几个常用OJ的注册方式
  • Html实现全国省市区三级联动
  • 前端构建工具Webpack 与 Vite 大对比
  • Ubuntu-22.04环境搭建
  • 嵌入式学习---DAY17:共用体与位运算
  • 蓝牙网关和蓝牙MESH总结
  • 了解关于标准化的知识
  • 【云原生】数据库忘记密码怎么办?
  • Postman 接口测试详解
  • 【JavaEE】线程状态
  • C++笔记之编译过程和面向对象
  • ModuleNotFoundError: No module named ‘tqdm‘
  • 东京电影节公布2024年竞赛片评审团成员并对其业绩分别进行评介 没什么含金量
  • 智能景区垃圾识别系统:基于YOLO的深度学习实现
  • ventoy和微pe可以共存吗?ventoy和pe共存使用教程
  • 如何获取和安装SSL证书
  • makefile在IC设计中的使用笔记
  • Suno声称在受版权保护的音乐上训练模型属于“合理使用“
  • Java | Leetcode Java题解之第316题去除重复字母
  • Taro学习记录
  • Spring Cache框架详解
  • 解决Html iframe 内嵌video标签导致视频无法全屏展示的问题
  • 谷粒商城实战笔记-110~114-全文检索-ElasticSearch-查询
  • 【开源】嵌入式Linux(IMX6U)应用层综合项目(1)--云平台调试APP
  • AI人工智能分析王楚钦球拍被踩事件的真相
  • C++客户端Qt开发——多线程编程(一)
  • 安装pnpm
  • CSS平移实现双开门效果