为什么Z3会落在这?

时间:2018-04-01 17:58:36

标签: python bit-manipulation z3 z3py sat-solvers

我试图用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]))

1 个答案:

答案 0 :(得分:1)

Python使用任意大小的整数,而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))