给出一个简单的移位和异或运算,其中“输入”是象征性的:为什么Z3会说这个方程式是不可满足的,当我输入正确的时候呢?
input = BitVec('input',32)
feedback = 0x8049d30
shiftreg = input^feedback
shiftreg = 0xffffffff & ((shiftreg << 8) | (shiftreg >> 24))
shiftreg = shiftreg^0xcafebabe
s = Solver()
s.add(shiftreg == 0x804a008)
s.check()
# unsat
我们被告知,这个方程是不可解。如果打印,s
包含:
[4294967295 &
((input^134520112) << 8 | (input^134520112) >> 24)^
3405691582 ==
134520840]
然而,我可以平凡创建解决该方程为“输入”的例子。
want = 0x804a008
want ^= 0xcafebabe
want = 0xffffffff & ((want >> 8) | (want << 24))
want ^= 0x8049d30
print hex(want)
# 0xbec6672a
将我们的解法输入到Z3的方程中,我们看到我们可以满足它。
input = 0xbec6672a
[4294967295 &
((input^134520112) << 8 | (input^134520112) >> 24)^
3405691582 ==
134520840]
# True
为什么Z3不能找到这个解决方案?