初音ミクの消失

HappyVM

字数统计: 525阅读时长: 2 min
2019/03/21 Share

happyVM

第一次做VM题,花了很多时间,最终还是有所收获

首先逆向虚拟机的操作数,操作数无非几个操作:压栈,出栈,寄存器与内存之间的读写,寄存器与寄存器之间的赋值

使用如下代码配合ida python获得所有操作数:

addr = 0x400D40
cnt = 0x78-0x40+1
i = addr
print "********my calc********"
print "********my calc********"
print "********my calc********"
print "********my calc********"
print "********my calc********"
while(i <= addr + cnt -1):
c = int(Byte(i))
if(c in [0x0,0x8,0x9,0xA,0xC,0xD,0xE,0x11,0x13,0x14]):
i += 1
print "opt:" , hex(c) , " data:", hex(Byte(i))
else:
print "opt:" , hex(c)
i += 1

得到如下指令:

0(0x00) : opt: 0x11    data: 0x2d
2(0x01) : opt: 0x0 data: 0x22
4 : opt: 0x5
5 : opt: 0x10
6 : opt: 0x14 data: 0x9
8 : opt: 0x17
9(0x9) : opt: 0x0 data: 0x32
11 : opt: 0x5
12 : opt: 0x3
13 : opt: 0x11 data: 0x16
15 : opt: 0x6
16 : opt: 0x0 data: 0x16
18 : opt: 0x5
19 : opt: 0x11 data: 0x16
21 : opt: 0x17
22(0x16) : opt: 0xe data: 0x1
24 : opt: 0x15
25 : opt: 0x4
26 : opt: 0xf
27 : opt: 0x1
28 : opt: 0x16
29 : opt: 0x2
30 : opt: 0x0 data: 0x0
32 : opt: 0x4
33 : opt: 0x3
34 : opt: 0x5
35 : opt: 0x10
36 : opt: 0x14 data: 0x2b
38 : opt: 0x5
39 : opt: 0x9 data: 0x3
41 : opt: 0x13 data: 0x16
43(0x2b) : opt: 0x5
44 : opt: 0x12

45(0x2d) : opt: 0x15
46 : opt: 0x4
47 : opt: 0x10
48 : opt: 0x14 data: 0x36
50 : opt: 0xa data: 0x1
52 : opt: 0x13 data: 0x2d

54(0x36) : opt: 0x3
55 : opt: 0x4
56 : opt: 0x12

逐行翻译,其中部分压栈与出栈操作可以合并为内存与寄存器,寄存器与寄存器之间的数据交换,翻译得到如下代码:

	simplify:


call 0x2d;//strlen(str)
B = 0x22;
if(A != B) return;//字符串长度为0x22
0x9:
B = 0x32;
push(C);//此时C = 0x22
call(0x16);
C = pop();
B = 0x16;
call(0x16);
return;

0x16:
C--;//倒序处理整个字符串
A = str[C];
A ^= B; //str[C] = str[C] ^ B ,而且B每次加3
str[C] = A;
push(B);
A = 0;
B = C;
if(A == B){//如果这个字符串已经处理完成
goto 0x2b;
}else{
B = pop();
B += 3;
goto 0x16;
}

0x2b:
B = pop();

0x2d:
do{
A = str[C];
if(A == B) break;
C++;
}while(A != B)

A = C;
ret;

最后获取到s2的数据,solve

str = [132 , 131 , 157 , 145 , 129 , 151 , 215 , 190 , 67 , 114 , 97 , 115 , 115 , 12 , 106 , 112 , 115 , 17 , 72 , 44 , 52 , 51 , 49 , 54 , 35 , 52 , 62 , 92 , 35 , 78 , 23 , 17 , 25 , 89 ]
B = 0x16
for i in range(0x21, -1, -1):
str[i] = str[i] ^ B
B += 3

B = 0x32
for i in range(0x21, -1, -1):
str[i] = str[i] ^ B
B += 3

for i in range(0x22):
print(chr(str[i]),end="")

原文作者:mrh929

原文链接:https://mrh1s.top/posts/461ecec/

发表日期:March 21st 2019, 10:25:17 pm

更新日期:May 7th 2019, 11:57:54 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG