使用固定字符在Z3中定义位向量

时间:2018-12-17 02:06:31

标签: python z3 z3py

我们可以在Z3中定义输入BitVec()的方式,使我们知道输入的一部分,而我们希望Z3解决的另一部分?

作为一个例子,在下面的代码中,我定义一个位向量来表示一个10个字符的字符串。

from z3 import *

s = Solver()

input = [BitVec("input%s" % i, 8) for i in range(10)]

s.add(gen(input) == 0xAABBCCDD)

在上面的示例中,gen()是一个使用输入生成DWORD的函数。

现在,让我们说,我已经知道输入的前几个字符。例如,输入始终采用以下格式:CHECKXXXXX

其中X是未知字符。

我现在如何在Z3中定义输入以利用已知字符?

1 个答案:

答案 0 :(得分:1)

好的。由于您正在为输入的每个字符生成一个符号输入,因此只需为您知道的元素添加相应的断言即可:

from z3 import *

s = Solver()

input = [BitVec("input%s" % i, 8) for i in range(10)]

known = "CHECK"
s.add([input[i] == ord(known[i]) for i in range(len(known))])

print s.check()
print s.model()

此打印:

sat
[input4 = 75,
 input3 = 67,
 input2 = 69,
 input1 = 72,
 input0 = 67]

这正是您想要的。现在,您可以调用gen函数,并进一步约束input的其他部分以获得完整的模型。

或者,您可以使用BitVecVal函数直接创建常量位向量,而不必首先创建符号变体:https://z3prover.github.io/api/html/namespacez3py.html#a74d306d60d4cc4432907f58306b41686但是我认为使用纯符号输入并添加约束更好,因为它简化了编程。首先没有创建符号变量的微不足道的性能节省几乎是不值得的。