Z3 学习笔记

本文是一篇关于Z3求解器的学习笔记,主要介绍了Z3的参考API、常见用法,并通过一系列例题展示了如何利用Z3解决线性运算、加密问题等。内容涵盖初始化变量、添加约束条件、判断解的存在性以及求解过程。通过实例分析和代码展示,帮助读者更好地理解和应用Z3。
摘要由CSDN通过智能技术生成

前言

也遇到了很多使用z3解决的题,但由于没有整理,对一些api不熟悉,导致解决问题的速度很慢,所以特此做出整理。

参考API

https://z3prover.github.io/api/html/namespacez3py.html
https://ericpony.github.io/z3py-tutorial/guide-examples.htm

常见用法

初始化变量

flag = []
for i in range(49):
    flag.append(BitVec('flag%d' % i, 8))

创建约束求解器
solver = Solver()
添加约束条件(这一步是z3求解的关键)
olver.add(byte_610a0[v10]==i^v4)
判断解是否存在
if solver.check()==sat:
求解
print solver.model()

例题

0x0 martricks

经过一些简单的分析后,可以知道是经过偏移的矩阵乘法,本质上还是线性运算,因此可以采用z3进行解决,照着加密的过程来一遍即可。
需要注意的一点:BitVec是无符号数,Int是有符号数

from z3 import *
byte_610a0 = [0xAA, 0x7A, 0x24, 0x0A, 0xA8, 0xBC, 0x3C, 0xFC, 0x82, 0x4B, 0x51, 0x52, 0x5E, 0x1C, 0x82, 0x1F, 0x79, 0xBA, 0xB5, 0xE3, 0x43, 0x04, 0xFD, 0xAC, 0x10, 0xB5, 0x63, 0xBD, 0x8D, 0xE7, 0x35, 0xD9, 0xD3, 0xE8, 0x42, 0x6D, 0x71, 0x5A, 0x09, 0x54, 0xE9, 0x9F, 0x4C, 0xDC, 0xA2, 0xAF, 0x11, 0x87, 0x94]
byte_601060 = [0x73,0x6F,0x6D,0x65,0x20,0x6C,0x65,0x67,0x65,0x6E,0x64,0x73,0x20,0x72,0x20,0x74,0x6F,0x6C,0x64,0x2C,0x20,0x73,0x6F,0x6D,0x65,0x20,0x74,0x75,0x72,0x6E,0x20,0x74,0x6F,0x20,0x64,0x75,
  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值