分配指令空间和数据存储空间
进入vmp解释器
解释器结构
由于时间问题没法快速解析指令对应的handler,所以采取IDA指令跟踪的方式
根据对handler指令分析可以发现
可能为相关运算操作指令
使用IDA指令跟踪可以快速分析指令执行
当数据编码完成后开始对比数据
0x2B为输入数据编码后的结果
直接nop掉跳转指令,运行获取全部对比数据,得到数据
add ?, ?
imul ?, ?
div ?
movzxeax, byte ptr [?]取单字节数据
add ?, ?
imul ?, ?
div ?
movzxeax, byte ptr [?]取单字节数据
612a725f7e736dda72df43ab72bf4de96bc965
612a725f7e736dda72df43ab72bf4de96bc965
import
binascii
import
z3
z
=
z3.Solver()
right
=
binascii.unhexlify(
"612a725f7e736dda72df43ab72bf4de96bc965"
)
flag
=
[z3.BitVec(
"a%d"
%
_,
32
)
for
_
in
range
(
0x13
)]
buff
=
[]
temp
=
flag[
0
]
for
_
in
range
(
len
(flag)):
try
:
temp
=
temp
*
3
+
flag[_
+
1
]
except
IndexError:
temp
=
temp
*
3
temp
%
=
(
0x1000
+
1
)
temp &
=
0xFF
buff.append(flag[
0
] ^ temp ^
len
(flag))
temp1
=
temp
+
len
(flag)
for
_
in
range
(
1
,
len
(flag)):
buff.append(flag[_] ^ temp1 ^ buff[_
-
1
])
temp1
+
=
len
(flag)
-
_
temp1 &
=
0xFF
for
p, i
in
enumerate
(buff):
z.add(z3.simplify(i
=
=
right[p]))
if
z.check()
=
=
z3.sat:
for
i
in
flag:
print
(
chr
(z.model()[i].as_long()), end
=
"")
import
binascii
import
z3
z
=
z3.Solver()
right
=
binascii.unhexlify(
"612a725f7e736dda72df43ab72bf4de96bc965"
)
flag
=
[z3.BitVec(
"a%d"
%
_,
32
)
for
_
in
range
(
0x13
)]
buff
=
[]
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2021-5-10 15:35
被Delevy编辑
,原因: