【问题标题】:Z3: How to select 4 bytes from array of 8-bits?Z3:如何从 8 位数组中选择 4 个字节?
【发布时间】:2013-04-10 13:16:03
【问题描述】:

使用 Python Z3,我有一个字节数组,可以使用 Select 读取 1 个字节,如下所示。

MI = BitVecSort(32)
MV = BitVecSort(8)
Mem = Array('Mem', MI, MV)

pmt = BitVec('pmt', 32)
pmt2 = BitVec('pmt2', 8)

g = True
g = And(g, pmt2 == Select(Mem, pmt))

到目前为止,一切正常。但是,现在我想从 Mem 数组中读取 4 个字节,如下所示。

t3 = BitVec('t3', 32)
g = And(g, t3 == Select(Mem, pmt))

事实证明这是错误的,因为 t3 是 32 位的,而不是 8 位的,而 Mem 是 8 位的数组。

问题是:如何使用 Select 读取 4 个字节,而不是上面示例中的 1 个字节?

我想我可以创建一个新函数来读取 4 个字节,比如说 Select4(),但我不确定如何在 Z3 python 中创建一个函数。

非常感谢!

【问题讨论】:

    标签: python z3


    【解决方案1】:

    我们可以将Select4定义为

    def Select4(M, I):
      return Concat(Select(M, I + 3), Select(M, I + 2), Select(M, I+1), Select(M, I))
    

    Concat 操作本质上是附加四个位向量。 Z3还支持Extract操作。这两个操作可用于对 C 等编程语言中可用的转换操作进行编码。

    这里是完整的例子(也可以在线获得here):

    MI = BitVecSort(32)
    MV = BitVecSort(8)
    Mem = Array('Mem', MI, MV)
    
    pmt = BitVec('pmt', 32)
    pmt2 = BitVec('pmt2', 8)
    
    def Select4(M, I):
      return Concat(Select(M, I + 3), Select(M, I + 2), Select(M, I+1), Select(M, I))
    
    g = True
    g = And(g, pmt2 == Select(Mem, pmt))
    t3 = BitVec('t3', 32)
    g = And(g, t3 == Select4(Mem, pmt))
    
    solve(g, pmt2 > 10)
    

    【讨论】:

    • 狮子座,非常感谢。但是,我想你忘了提到你在上面的代码中假设了 little-edian?
    猜你喜欢
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 2012-06-07
    • 2015-12-04
    相关资源
    最近更新 更多