前面几题太基础就不写了。
WxtVM1
IDA打开直接查看主函数,可以看到flag的长度为24,经过一个函数调用后,与密文进行对比。
那么关键点就是sub_4005B6函数了,内部是这样的,
这个流程说明它是个虚拟机,字节码存在byte_6010C0中,一共有15000个字节,3个字节为一条指令,第1个字节决定操作符,第2个字节决定flag的偏移,第3个字节作为值与flag对应偏移的字节进行运算,不过这个虚拟机并不是汇编级别的,且流程不复杂,所有运算可逆,所以可以直接当作加密函数逆向,写出解密函数即可,然后把密文解密即可得到flag,脚本如下,
f = open('WxyVM1', 'rb')
f_conten = f.read()
tmp = f_conten[0x1060:0x1060+24*4]
m_data = f_conten[0x10c0:0x10c0+15000]
tmp = list(tmp)
m_data = list(m_data)
box = []
for i in range(0, len(tmp), 4):
num = 0
for j in range(4):
num += tmp[i+j] << j*8
box.append(num)
i = 14997
while i >= 0:
v0 = m_data[i]
v3 = m_data[i+2]
result = v0
if v0 == 1:
result = m_data[i+1]
box[result] -= v3
elif v0 == 2:
result = m_data[i+1]
bo