virtual_world

点击此处获得更好的阅读体验


WriteUp来源

来自看雪论坛的Delevy

题目描述

题目考点

解题思路

分配指令空间和数据存储空间

进入vmp解释器

解释器结构

由于时间问题没法快速解析指令对应的handler,所以采取IDA指令跟踪的方式
根据对handler指令分析可以发现

1
2
3
4
add ?, ?
imul ?, ?
div ?
movzxeax, byte ptr [?]取单字节数据

可能为相关运算操作指令

使用IDA指令跟踪可以快速分析指令执行,当数据编码完成后开始对比数据

0x2B为输入数据编码后的结果

直接nop掉跳转指令,运行获取全部对比数据,得到数据

1
612a725f7e736dda72df43ab72bf4de96bc965

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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="")

Flag

1
flag{di3869Fop1lNm}