为什么Z3落在这?

Why Z3 falling at this?

我正在尝试使用 z3-solver 解决这个问题
但问题是它给了我错误的价值观
我试图用 LShR 替换 >> 值发生变化,但没有一个是正确的
但是我知道 w 的值在十六进制中应该是 0x41414141
我还尝试将 w 设置为 0x41414141 并且它说它是 unsat

from z3 import *
def F(w):
    return ((w * 31337) ^ (w * 1337 >> 16)) % 2**32

s = Solver()
w = BitVec("w",32)
s.add ( F(w) == F(0x41414141))

while s.check() == sat:
     print s.model()
     s.add(Or(w != s.model()[w]))

Python 使用 arbitrary-size 整数,而 z3 将所有中间结果限制为 32 位,因此 F 为 Python 和 z3 给出了不同的结果。你需要像

这样的东西
def F1(w):
    return ((w * 31337) ^ (((w * 1337) & 0xffffffff) >> 16)) % 2**32
def F1Z(w):
    return ((w * 31337) ^ LShR(((w * 1337) & 0xffffffff), 16)) % 2**32

s.add ( F1Z(w) == F1(0x41414141))