将Python Z3与QWORD结合使用

时间:2018-12-03 02:55:24

标签: python z3

我是z3py的新手。

我正在反向工程代码,其中我在XMM寄存器中存储了两个QWORD。

并且对它执行了不同的操作。

比方说,我必须根据以下等式找到2个qword,p1和p2:

x = p1 + p2
y = p1 ^ p2

if x == r1 and y == r2:
    print p1, p2

注意:P1和P2是QWORD,实际上代表8个字符的ASCII字符串。因此,P1是8个字节的数组,其中每个字节对应于可打印字符的ASCII值。

我编写了以下代码:

#! /usr/bin/python

from z3 import *

s = Solver()

a = BitVec('a', 64)
b = BitVec('b', 64)

s.add(a + b == result1)
s.add(a ^ b == result2)

if s.check():
    print(s.model())

问题:

我认为我不应该使用BitVec来表示QWORD,因为我知道QWORD的每个字节都对应一个可打印的ASCII字符。那么,我应该如何表示我的输入?

1 个答案:

答案 0 :(得分:3)

最好使用4个8位值的Python数组代替:

#! /usr/bin/python

from z3 import *

s = Solver()

A = [BitVec('a%s' % i, 8) for i in range(4)]
B = [BitVec('b%s' % i, 8) for i in range(4)]

s.add(A[0] <= 128)
s.add(A[0] + B[0] == 12)
s.add(A[1] + B[1] == 5)
s.add(A[2] ^ B[2] == 9)
s.add(A[3] >= 20)

if s.check() == sat:
    print(s.model())

此打印:

[a2 = 0,
 b2 = 9,
 a3 = 20,
 b1 = 0,
 a1 = 5,
 b0 = 140,
 a0 = 128]

这样,您可以通过自然使用数组元素来添加任意约束。