同一变量的不同字节的 z3 排序不匹配
z3 sort mismatch for different bytes of the same variable
我正在使用 z3 python 包模拟算法的行为,但是我在使用按位异或时遇到问题。
一开始我定义
class State:
def __init__(self):
self.state = [0] * 0x270
self.index = 0
def mag(i):
return z3.If(i == 0, 0x0, 0x9908b0df)
seed = z3.BitVec('seed', 32)
s= State()
脚本继续,但是当我 运行 求解器时,我得到一个 z3.z3types.Z3Exception: sort mismatch
,这是由于试图在行
中执行 __xor__
s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1) ^ mag((s.state[1] & 1) *8)
此处 s.state 中的每个条目都取决于种子的符号值。
我是这类求解器的初学者,我不确定到底是什么导致了这个问题。
该行本身没有任何问题。您可以通过以下运行验证它:
from z3 import *
class State:
def __init__(self):
self.state = [BitVec('x', 32)] * 0x270
self.index = 0
seed = z3.BitVec('seed', 32)
s= State()
i = 87
s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1)
print(s.state[I])
这会打印:
x ^ (x & 2147483647 | x & 2147483648) >> 1
所以,问题一定出在您程序的其他地方。您需要将其简化为一个最小的示例(请参阅此处的指南:https://whosebug.com/help/minimal-reproducible-example),并希望在简化过程中您会自己发现问题。如果没有,请随时使用其他人可以复制的完整示例再次 post。
关于 mag
功能:
请注意,您的 mag
函数仅使用整数,因此 z3 无法推断它是关于位向量的。这就是您遇到排序不匹配的原因。为避免此问题,请按如下方式定义 mag
:
def mag(i):
return z3.If(i == 0, z3.BitVecVal(0x0, 64), z3.BitVecVal(0x9908b0df, 64))
注意 BitVecVal
的用法。这应该可以解决问题。
我正在使用 z3 python 包模拟算法的行为,但是我在使用按位异或时遇到问题。
一开始我定义
class State:
def __init__(self):
self.state = [0] * 0x270
self.index = 0
def mag(i):
return z3.If(i == 0, 0x0, 0x9908b0df)
seed = z3.BitVec('seed', 32)
s= State()
脚本继续,但是当我 运行 求解器时,我得到一个 z3.z3types.Z3Exception: sort mismatch
,这是由于试图在行
__xor__
s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1) ^ mag((s.state[1] & 1) *8)
此处 s.state 中的每个条目都取决于种子的符号值。
我是这类求解器的初学者,我不确定到底是什么导致了这个问题。
该行本身没有任何问题。您可以通过以下运行验证它:
from z3 import *
class State:
def __init__(self):
self.state = [BitVec('x', 32)] * 0x270
self.index = 0
seed = z3.BitVec('seed', 32)
s= State()
i = 87
s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1)
print(s.state[I])
这会打印:
x ^ (x & 2147483647 | x & 2147483648) >> 1
所以,问题一定出在您程序的其他地方。您需要将其简化为一个最小的示例(请参阅此处的指南:https://whosebug.com/help/minimal-reproducible-example),并希望在简化过程中您会自己发现问题。如果没有,请随时使用其他人可以复制的完整示例再次 post。
关于 mag
功能:
请注意,您的 mag
函数仅使用整数,因此 z3 无法推断它是关于位向量的。这就是您遇到排序不匹配的原因。为避免此问题,请按如下方式定义 mag
:
def mag(i):
return z3.If(i == 0, z3.BitVecVal(0x0, 64), z3.BitVecVal(0x9908b0df, 64))
注意 BitVecVal
的用法。这应该可以解决问题。