点击此处获得更好的阅读体验
WriteUp来源
来自看雪论坛的Delevy
题目描述
题目考点
解题思路
分配指令空间和数据存储空间
进入vmp解释器
解释器结构
由于时间问题没法快速解析指令对应的handler,所以采取IDA指令跟踪的方式
根据对handler指令分析可以发现
1
2
3
4add ?, ?
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
29import 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}