Z3python XOR总和?

时间:2019-09-14 14:50:31

标签: python python-3.x z3 z3py

我目前正在尝试使用z3python解决一些方程式,但遇到了无法解决的情况。

我需要使用特定的非ascii字符值对某些BitVecs进行异或运算,然后将它们求和以检查校验和。 这是一个示例:

pbInput = [BitVec("{}".format(i), 8) for i in range(KEY_LEN)]
password = "\xff\xff\xde\x8e\xae"
solver.add(Xor(pbInput[0], password[0]) + Xor(pbInput[3], password[3]) == 300)

这会导致z3类型异常: z3.z3types.Z3Exception: Value cannot be converted into a Z3 Boolean value

我找到了this post并尝试将一个函数应用于我的password字符串,并将此行添加到我的脚本中: password = Function(password, StringSort(), IntSort(), BitVecSort(8)) 但是当然会失败,因为该字符串不是ASCII字符串。 我不在乎它是字符串,我只是尝试做Xor(pbInput[x] ^ 0xff),但这也不起作用。我找不到有关这种特殊情况的任何文档。

编辑: 这是完整的回溯。

Traceback (most recent call last):
  File "solve.py", line 18, in <module>
    (Xor(pbInput[0], password[0]) 
  File "/usr/local/lib/python2.7/dist-packages/z3/z3.py", line 1555, in Xor
    a = s.cast(a)
  File "/usr/local/lib/python2.7/dist-packages/z3/z3.py", line 1310, in cast
    _z3_assert(self.eq(val.sort()), "Value cannot be converted into a Z3 Boolean value")
  File "/usr/local/lib/python2.7/dist-packages/z3/z3.py", line 91, in _z3_assert
    raise Z3Exception(msg)
z3.z3types.Z3Exception: Value cannot be converted into a Z3 Boolean value

如果您对我如何进行此操作有任何了解,请先感谢!

1 个答案:

答案 0 :(得分:1)

您的代码中有两个问题。

  • Xor仅适用于Bool个值;对于位向量,只需使用^
  • 使用函数ord将字符转换为整数,然后再传递给xor

您没有提供完整的程序(这总是有帮助的!),但是这是将z3py中的该部分作为完整程序编写的方法:

from z3 import *

solver = Solver()
KEY_LEN = 10

pbInput = [BitVec("c_{}".format(i), 8) for i in range(KEY_LEN)]
password = "\xff\xff\xde\x8e\xae"
solver.add((pbInput[0] ^ ord(password[0])) + (pbInput[3] ^ ord(password[3])) == 300)

print solver.check()
print solver.model()

此打印:

sat
[c_3 = 0, c_0 = 97]

(我给变量取了更好的名称,以便更正确地区分。)因此,它告诉我们解决方案是:

>>> (0xff ^ 97) + (0x8e ^ 0)
300

确实是您要的。