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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
| from Crypto.Util.number import *
def reverse_magic(magic_number):
tmp = int(magic_number[2:],16)
# long_to_bytes()默认是大端序
# 将十进制的长整型转换为 bytes 数据
tmp = long_to_bytes(tmp)
# 将 bytes 数据按照小端序转换为int类型
number = int.from_bytes(tmp[:2],'little')
return number
PYTHON_MAGIC = {
# Python 3
3000: (3, 0),
3010: (3, 0),
3020: (3, 0),
3030: (3, 0),
3040: (3, 0),
3050: (3, 0),
3060: (3, 0),
3061: (3, 0),
3071: (3, 0),
3081: (3, 0),
3091: (3, 0),
3101: (3, 0),
3103: (3, 0),
3111: (3, 0), # a4
3131: (3, 0), # a5
# Python 3.1
3141: (3, 1), # a0
3151: (3, 1), # a0
# Python 3.2
3160: (3, 2), # a0
3170: (3, 2), # a1
3180: (3, 2), # a2
# Python 3.3
3190: (3, 3), # a0
3200: (3, 3), # a0
3220: (3, 3), # a1
3230: (3, 3), # a4
# Python 3.4
3250: (3, 4), # a1
3260: (3, 4), # a1
3270: (3, 4), # a1
3280: (3, 4), # a1
3290: (3, 4), # a4
3300: (3, 4), # a4
3310: (3, 4), # rc2
# Python 3.5
3320: (3, 5), # a0
3330: (3, 5), # b1
3340: (3, 5), # b2
3350: (3, 5), # b2
3351: (3, 5), # 3.5.2
# Python 3.6
3360: (3, 6), # a0
3361: (3, 6), # a0
3370: (3, 6), # a1
3371: (3, 6), # a1
3372: (3, 6), # a1
3373: (3, 6), # b1
3375: (3, 6), # b1
3376: (3, 6), # b1
3377: (3, 6), # b1
3378: (3, 6), # b2
3379: (3, 6), # rc1
# Python 3.7
3390: (3, 7), # a1
3391: (3, 7), # a2
3392: (3, 7), # a4
3393: (3, 7), # b1
3394: (3, 7), # b5
# Python 3.8
3400: (3, 8), # a1
3401: (3, 8), # a1
3410: (3, 8), # a1
3411: (3, 8), # b2
3412: (3, 8), # b2
3413: (3, 8), # b4
# Python 3.9
3420: (3, 9), # a0
3421: (3, 9), # a0
3422: (3, 9), # a0
3423: (3, 9), # a2
3424: (3, 9), # a2
3425: (3, 9), # a2
}
res = ''
with open('magic.txt','r') as f:
data = f.read().split()
for magic_number in data:
number = reverse_magic(magic_number)
res = res + str(PYTHON_MAGIC[number][1])
# print(res)
zip_data = long_to_bytes(int(res))
with open('flag.zip','wb') as f:
f.write(zip_data)
print("[+] 转换成功")
|