給出一個簡單的移位和異或運算,其中「輸入」是象徵性的:爲什麼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不能找到這個解決方案?