同一变量的不同字节的 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 的用法。这应该可以解决问题。