使用 Python Z3 和 QWORD
Using Python Z3 with QWORDs
我是 z3py 的新手。
我正在对一个代码进行逆向工程,其中我有两个 QWORD 存储在 XMM 寄存器中。
并且对其执行了不同的操作。
比方说,我必须找到 2 个 qwords,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 字符。那么,我应该如何表示我的输入?
最好改用 Python 4 个 8 位值的数组:
#! /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]
这样您就可以自然地使用数组元素添加任意约束。
我是 z3py 的新手。
我正在对一个代码进行逆向工程,其中我有两个 QWORD 存储在 XMM 寄存器中。
并且对其执行了不同的操作。
比方说,我必须找到 2 个 qwords,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 字符。那么,我应该如何表示我的输入?
最好改用 Python 4 个 8 位值的数组:
#! /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]
这样您就可以自然地使用数组元素添加任意约束。