z3基础学习
创始人
2024-11-13 02:39:00
0

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]*36  for i in range(36):     s.add(a1[i] <127)   #添加约束条件①     s.add(a1[i] >=32)  for i in range(36):     ptr[i] = a1[i] >> 4     v7[i] = a1[i] & 15  for 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

相关内容

热门资讯

秒懂教程!微信群链接拼三张房卡... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
秒懂教程“微信斗牛房间怎么弄,... 微信斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
仕邦出勤安卓系统,高效便捷的考... 你有没有听说最近仕邦出勤安卓系统的新变化?这可是个大新闻,让我来给你详细说说,保证让你对这款系统有了...
秒懂教程!微信牛牛房卡如何充值... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享受...
房卡必备教程“金花大厅链接房卡... 人皇大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来...
秒懂教程!微信炸金花怎么买房卡... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
一分钟了解“在哪里买炸金花房卡... 新毛豆互娱是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡...
秒懂教程!微信里面拼三张房卡在... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
给大家讲解“微信链接金花房卡怎... 随意玩是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来...
秒懂教程!微信斗牛房卡找谁买,... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享受...
ia实测“怎样创建微信金花链接... 金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享受...
秒懂教程!微信上链接牛牛房卡,... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
安卓平板带学习系统的,智能教育... 你有没有想过,拥有一款既能满足日常娱乐需求,又能助力学习的安卓平板电脑,是不是就像拥有了双重身份的超...
一分钟推荐“微信炸金花链接怎样... 微信炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡...
秒懂教程!拼三张房卡链接去哪里... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
一分钟推荐“金花链接房卡如何充... 九酷大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来...
秒懂教程!炸金花房卡怎么弄,新... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
房卡必备教程“微信牛牛房卡招代... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房卡来享...
秒懂教程!怎么创建牛牛房间房卡... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
安卓手机用锤子系统,探索个性化... 你有没有发现,现在安卓手机的世界里,锤子系统可是个热门话题呢!它就像一股清新的风,吹进了这个五彩斑斓...