First_VM

signal

这nm垃圾VM题目

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
while ( ip_ < i114 )
{
switch ( notinput[ip_] ) // 2 3 4 5 11 12连续取最后一个
{
case 1: // 将ax压入判断端
Str[v5 + 100] = ax_;
++ip_;
++v5;
++v7;
break;
case 2: // ax为input第n位+上操作符后一位
ax_ = notinput[ip_ + 1] + Str[v7];
ip_ += 2;
break;
case 3:
ax_ = Str[v7] - LOBYTE(notinput[ip_ + 1]);// ax为input-后一位
ip_ += 2;
break;
case 4:
ax_ = notinput[ip_ + 1] ^ Str[v7]; // ax为input与后一位做异或
ip_ += 2;
break;
case 5:
ax_ = notinput[ip_ + 1] * Str[v7]; // ax为后一位与input相乘
//
ip_ += 2;
break;
case 6:
++ip_; // 过号
break;
case 7:
if ( Str[v6 + 100] != notinput[ip_ + 1] )// 做判断,可能一位多解
//
{
printf("what a shame...");
exit(0);
}
++v6;
ip_ += 2;
break;
case 8:
Str[v4] = ax_; // input这一位赋值为ax
++ip_;
++v4;
break;
case 10: // input
read(Str);
++ip_;
break;
case 11: // ax为input-1
ax_ = Str[v7] - 1;
++ip_;
break;
case 12: // ax为input+1
ax_ = Str[v7] + 1;
++ip_;
break;
default:
goto LABEL_2;
}

就这个是主函数然后操作位为

1
2
3
4
5
6
7
8
9
10
.data:00403040 dword_403040    dd 0Ah, 4, 10h, 8, 3, 5, 1, 4, 20h, 8, 5, 3, 1, 3, 2, 8
.data:00403040 ; DATA XREF: _main+18↑o
.data:00403040 dd 0Bh, 1, 0Ch, 8, 2 dup(4), 1, 5, 3, 8, 3, 21h, 1, 0Bh
.data:00403040 dd 8, 0Bh, 1, 4, 9, 8, 3, 20h, 1, 2, 51h, 8, 4, 24h, 1
.data:00403040 dd 0Ch, 8, 0Bh, 1, 5, 2, 8, 2, 25h, 1, 2, 36h, 8, 4, 41h
.data:00403040 dd 1, 2, 20h, 8, 5, 2 dup(1), 5, 3, 8, 2, 25h, 1, 4, 9
.data:00403040 dd 8, 3, 20h, 1, 2, 41h, 8, 0Ch, 1, 7, 22h, 7, 3Fh, 7
.data:00403040 dd 34h, 7, 32h, 7, 72h, 7, 33h, 7, 18h, 7, 0FFFFFFA7h
.data:00403040 dd 7, 31h, 7, 0FFFFFFF1h, 7, 28h, 7, 0FFFFFF84h, 7, 0FFFFFFC1h
.data:00403040 dd 7, 1Eh, 7, 7Ah

然后硬解吧。

供上EXP:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#flag=[0x22,0x3F,0x34,0x32,0x72,0x33,0x18,0xFFFFFFA7,0x31,0xFFFFFFF1,0x28,0xFFFFFF84,0xFFFFFFC1,0x1E,0x7A]
flag=[0x22,0x3F,0x34,0x32,0x72,0x33,0x18,0xA7,0x31,0xF1,0x28,0x84,0xC1,0x1E,0x7A]

flag[0]=flag[0]+5
flag[0]=flag[0]^0x10

#4 0x20 8 5 3
flag[1]=flag[1]/3
flag[1]=int(flag[1])^0x20

#3 2 8 0B
flag[2]=flag[2]+3
#

#0C 8 4 4
flag[3]=flag[3]^4
flag[3]=flag[3]-1
#

#5 3 8 3 0x21
flag[4]=flag[4]+0x21
flag[4]=flag[4]//3
#0B 8 0B
flag[5]=flag[5]+2

#4 9 8 3 20
flag[6]=flag[6]+0x20
flag[6]=flag[6]^0x9

#2 51 8 4 24
flag[7]=flag[7]^0x24
flag[7]=flag[7]-0x51
# 0C 8 0B
flag[8]=flag[8]-1
flag[8]=flag[8]+1
#

#5 2 8 2 25
flag[9]=flag[9]-0x25
flag[9]=flag[9]//2

#2 36 8 4 41
flag[10]=flag[10]^0x41
flag[10]=flag[10]-0x36

#2 20 8 5 1
flag[11]=flag[11]
flag[11]=flag[11]-0x20

#5 3 8 2 25
flag[12]=flag[12]-0x25
flag[12]=flag[12]//3

#4 9 8 3 20
flag[13]=flag[13]+0x20
flag[13]=flag[13]^0x9

#2 41 8 0C
flag[14]=flag[14]-1
flag[14]=flag[14]-0x41

for i in range(15):
# print(i)
print(chr(flag[i]),end='')

这里需要注意的是那个0XFFFFFF~,这个东西我一开始理解为负数,见过发现并不是,这里是溢出了,然后原数被扩展了,因为二进制的最高位为1所以默认从byte扩展成32位/64位时,被拓展为FFFF

这里就不赘述了,

垃圾VM毁我青春。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!