如何在Z3py公式中正确使用ZeroExt(n,a)?

如何在Z3py公式中正确使用ZeroExt(n,a)?,z3,smt,z3py,Z3,Smt,Z3py,我试图找出隐藏在二进制文件中的keygen算法的密码。因此,我从程序集中提取了公式,并用一个小Python脚本(希望是正确的)对其进行了翻译: #/usr/bin/env python 从z3进口* #密码初始化 pwd=比特向量('pwd0 pwd1 pwd2 pwd3 pwd4 pwd5',8) #内部状态 状态=位向量('state0 state1 state2 state3 state4 state5 state6',32) #建立公式 状态[0]=(pwd[3]^0x1337)+0x5

我试图找出隐藏在二进制文件中的keygen算法的密码。因此,我从程序集中提取了公式,并用一个小Python脚本(希望是正确的)对其进行了翻译:

#/usr/bin/env python
从z3进口*
#密码初始化
pwd=比特向量('pwd0 pwd1 pwd2 pwd3 pwd4 pwd5',8)
#内部状态
状态=位向量('state0 state1 state2 state3 state4 state5 state6',32)
#建立公式
状态[0]=(pwd[3]^0x1337)+0x5EEED
对于范围(6)中的i:
状态[i+1]=(ZeroExt(24,pwd[i])^状态[i])%0xcafe
#约束条件下的公式求解
求解(状态[6]==0xbad1dea)
不幸的是,
ZeroExt(n,a)
似乎会产生以下错误消息:

回溯(最近一次呼叫最后一次):
文件“/alt.py”,第13行,在
状态[i+1]=(ZeroExt(24,pwd[i])^状态[i])%0xcafe
文件“/usr/lib/python2.7/dist packages/z3.py”,第3115行,在异或中__
返回BitVecRef(Z3_mk_bvxor(self.ctx_ref(),a.as_ast(),b.as_ast()),self.ctx)
Z3_mk_bvxor中的文件“/usr/lib/python2.7/dist packages/z3core.py”,第1743行
引发Z3异常(lib().Z3_get_error_msg_ex(a0,err))
z3types.z3异常:位置1处的参数(bvadd(bvxor pwd3#x37)#xed)与声明(declare fun bvxor((u-BitVec 32)(u-BitVec 32))(u-BitVec 32))不匹配
我做错了什么?如何解决这个问题


注意:我更改了质询的常量,以避免通过搜索很容易找到它(没有作弊!)。因此,这个问题可能没有令人满意的解决方案…

将状态向量初始化为32位Z3表达式并不重要。一旦您将
状态[0]
改写为您提供的表达式,它就不是32位了。它只是8位。此外,由于
pwd[3]
的位宽度,位向量常数被截断为8位

因此,以下方面的影响:

     state[0] = (pwd[3] ^ 0x1337) + 0x5eeded
状态[0]
包含大小为8的位向量

然后,当您使用
状态[0]
(ZeroExt(24,pwd[0])
的异或时,您会得到类型不匹配


修复方法是在第一次出现时将
pwd[3]
扩展为零。

当然!!!扩展
pwd[3]
做到了…我只是有时失明!对不起!!!该死…非常感谢!