Z3Py:我应该如何表示一些32位; 16位和8位寄存器?

时间:2015-09-13 18:29:56

标签: z3 z3py

我是x86-32bit的新手。对不起,如果这是一个愚蠢的问题..

我基本上试图在BitVec汇编指令上实现一个简单的符号执行引擎。这是我现在面临的问题:

假设在执行之前,我使用self.eq['%eax'] = BitVec('reg%d' % 1, 32) self.eq['%ebx'] = BitVec('reg%d' % 2, 32) self.eq['%ecx'] = BitVec('reg%d' % 3, 32) self.eq['%edx'] = BitVec('reg%d' % 4, 32) 初始化了一些寄存器。

16-bit

所以这是我的问题,如何处理一些8-bit甚至8-bit个寄存器?

无论如何,我可以从32位BitVec中提取z3部分,为其分配一些值,然后将其放回去?我可以在$tempPath中执行此操作吗?还是有更好的方法..?

我清楚了吗?非常感谢你!

1 个答案:

答案 0 :(得分:2)

您可以提取位向量的部分,这会产生一个新的,较小的位向量值,您可以按照自己喜欢的方式使用它(例如添加)。

您可以通过首先提取所有部分然后将较小的位向量连接成一个大的位置来替换位向量的部分。

例如,递增eax的上半部分将是这样的:

eaxNew = concat(add(extract(eaxOld, upperHalf), 1), extract(eaxOld, lowerHalf))

(伪代码)

http://research.microsoft.com/en-us/um/redmond/projects/z3/namespacez3py.html