为什么这个 z3 方程式失败了?
Why this z3 equation is failing?
我需要解决这段代码(C中的代码)
if ( ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1)+ len_input_serial- 3 * ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1) != 14)
return 0xFFFFFFFFLL;
那是我的 python 脚本
from z3 import *
len_input_serial = BitVec("serial_len",64)
solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14)
然而这给了我 [serial_len = 14]
我知道解决方案应该在 [42,38,40]
左右,所以这里有什么问题吗?
这个表达式:
(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1
始终等同于 0
。如果将 64 位数量右移 64 位,则得到 0。(请注意,您使用的是 LShr
,它将其输入视为无符号数量。)
因此整个事情简化为求解 len_input_serial == 14
,这就是 Z3 生成的答案。
请注意,当您在 Python 中写入一个长整数(即 0x123L 等)时,您将获得无限精度。 (参见此处:Maximum value for long integer)。在 C 中,你得到 (most-likely) 64 位整数。所以,您的 Z3 代码实际上是正确的; Python 在这里使用了更高的精度,因此造成了混乱。
我需要解决这段代码(C中的代码)
if ( ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1)+ len_input_serial- 3 * ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1) != 14)
return 0xFFFFFFFFLL;
那是我的 python 脚本
from z3 import *
len_input_serial = BitVec("serial_len",64)
solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14)
然而这给了我 [serial_len = 14]
我知道解决方案应该在 [42,38,40]
左右,所以这里有什么问题吗?
这个表达式:
(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1
始终等同于 0
。如果将 64 位数量右移 64 位,则得到 0。(请注意,您使用的是 LShr
,它将其输入视为无符号数量。)
因此整个事情简化为求解 len_input_serial == 14
,这就是 Z3 生成的答案。
请注意,当您在 Python 中写入一个长整数(即 0x123L 等)时,您将获得无限精度。 (参见此处:Maximum value for long integer)。在 C 中,你得到 (most-likely) 64 位整数。所以,您的 Z3 代码实际上是正确的; Python 在这里使用了更高的精度,因此造成了混乱。