Re题目

做了一天的Re题目

题目

链接:https://pan.baidu.com/s/1u7IHEIt4045aLwKhh_soLw 密码:2oz4

分析

一看加密函数不多,感觉可以快速做出来。然后,就做了很久很久。
直接找到加密函数

用od找到初始化生成的数组,并且dump出来

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
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#coding=utf8
#flag{e4435341-401a-4bc4-96c1-eadf1951d904}
def ini_juz(index):
init_key='''
D1 FD 44 F8 A8 86 FC 60 78 9B 3C CA DC DA 33 71
31 57 2F B7 D5 60 75 D1 AD E4 50 F1 B7 51 6D C1
55 08 5A 92 73 4D 2B E7 71 A6 A5 09 BA B5 68 DF
C0 17 CF BE 65 DC 53 4B 15 EC 82 C2 09 2B 51 86
BC 3C 38 B9 7F D8 09 70 7A 21 D9 29 8B 24 7C 43
BE CF C5 9B B6 E1 83 76 9F 84 64 1D 82 A3 1F FA
4C A6 09 0F EB 5B 5D 91 BC 67 2B 98 E6 E1 D2 5F
F6 F4 94 E7 57 53 B9 BE C0 CF 3B FB DD C7 3D B4
'''
key=init_key.replace(' ','').replace('\n','').replace(' ','')
data=bytearray.fromhex(key)
data1=[]
for i in range(len(data)):
data1.append(hex(data[i]))
c1=[]
for i in range(3,-1,-1):
c1.append(data1[index+i])
for i in range(4):
if len(c1[i])!=4:
k='0x0'+c1[i][2:]
c1[i]=k
k=c1[0][2:]+c1[1][2:]+c1[2][2:]+c1[3][2:]
return k
def key_juz(index):
data='''
D6 90 E9 FE CC E1 3D B7 16 B6 14 C2 28 FB 2C 05
2B 67 9A 76 2A BE 04 C3 AA 44 13 26 49 86 06 99
9C 42 50 F4 91 EF 98 7A 33 54 0B 43 ED CF AC 62
E4 B3 1C A9 C9 08 E8 95 80 DF 94 FA 75 8F 3F A6
47 07 A7 FC F3 73 17 BA 83 59 3C 19 E6 85 4F A8
68 6B 81 B2 71 64 DA 8B F8 EB 0F 4B 70 56 9D 35
1E 24 0E 5E 63 58 D1 A2 25 22 7C 3B 01 21 78 87
D4 00 46 57 9F D3 27 52 4C 36 02 E7 A0 C4 C8 9E
EA BF 8A D2 40 C7 38 B5 A3 F7 F2 CE F9 61 15 A1
E0 AE 5D A4 9B 34 1A 55 AD 93 32 30 F5 8C B1 E3
1D F6 E2 2E 82 66 CA 60 C0 29 23 AB 0D 53 4E 6F
D5 DB 37 45 DE FD 8E 2F 03 FF 6A 72 6D 6C 5B 51
8D 1B AF 92 BB DD BC 7F 11 D9 5C 41 1F 10 5A D8
0A C1 31 88 A5 CD 7B BD 2D 74 D0 12 B8 E5 B4 B0
89 69 97 4A 0C 96 77 7E 65 B9 F1 09 C5 6E C6 84
18 F0 7D EC 3A DC 4D 20 79 EE 5F 3E D7 CB 39 48
'''
key=data.replace(' ','').replace('\n','').replace(' ','')
data=bytearray.fromhex(key)
return data[index]
#循环移位 k为正,左移k位,k位负,右移k位
def demo(lst, k):
return lst[k:] + lst[:k]
def xolr(num,k):
sum=bin(num)[2:]
if len(sum)!=32:
k1=32-len(sum)
s=''
for i in range(k1):
s=s+'0'
sum=s+sum
data=demo(sum,k)
data=int(data,2)
return data
def enc_re1():
enc_flag="F4 88 91 C2 9B 20 5B 03 F1 ED F6 13 46 3C 55 81 61 0F FF 14 6E 1C 48 28 79 9F 85 AF C5 58 0D D6 A5 D9 64 FD 46 09 8C DF 3B A5 37 62 5A A6 D2 4B"
key=enc_flag.replace(' ','')
data1=bytearray.fromhex(key)
enc_re1=[]
k=51
for i in range(48):
enc_re1.append(hex(data1[i]^(51+i)))
return enc_re1
def to_4(data):
c=[]
i=0
while True:
if i>=16:
break
k=data[i][2:]+data[i+1][2:]+data[i+2][2:]+data[i+3][2:]
c.append(k)
i=i+4
c1=[]
for i in range(3,-1,-1):
c1.append(c[i])
return c1
def decode_re(data,num):
k=ini_juz(num)
k1=int(data[0],16)^int(data[1],16)^int(data[2],16)^int(k,16)
k=hex(k1)
if len(k)==9:
k='0x0'+k[2:]
if len(k)==8:
k='0x00'+k[2:]
c=[]
c.append(k[2:4])
c.append(k[4:6])
c.append(k[6:8])
c.append(k[8:10])
c1=[]
for i in range(4):
c1.append(hex(key_juz(int(c[i],16))))
for i in range(4):
if len(c1[i])==3:
k1='0x0'+c1[i][2:]
c1[i]=k1
k=c1[0][2:]+c1[1][2:]+c1[2][2:]+c1[3][2:]
k1=int(k,16)^xolr(int(k,16),-0xe)^xolr(int(k,16),-0x8)^xolr(int(k,16),0xa)^xolr(int(k,16),0x2)^int(data[3],16)
bf=hex(k1)
if len(bf)!=10:
bf='0x0'+bf[2:]
return bf[2:]
def mov_re(data,bf):
data[3]=data[2]
data[2]=data[1]
data[1]=data[0]
data[0]=bf
def mov(data,bf):
data[0]=data[1]
data[1]=data[2]
data[2]=data[3]
data[3]=bf
def to_ch(enc):
s=''
for i in range(4):
s=s+enc[i]
data=bytearray.fromhex(s)
s=''
for i in range(len(data)):
s=s+chr(data[i])
return s
def main():
enc=enc_re1()
enc1=[]
enc2=[]
enc3=[]
for i in range(16):
if len(enc[i])!=4:
k='0x0'+enc[i][2:]
enc1.append(k)
else:
enc1.append(enc[i])
if len(enc[16+i])!=4:
k='0x0'+enc[16+i][2:]
enc2.append(k)
else:
enc2.append(enc[16+i])
if len(enc[32+i])!=4:
k='0x0'+enc[32+i][2:]
enc3.append(k)
else:
enc3.append(enc[32+i])
data=to_4(enc1) #换成enc2 enc3 即可
num=124
bf=decode_re(data,num)
mov_re(data,bf)
for i in range(31):
num=num-4
bf=decode_re(data,num)
mov_re(data,bf)
print(data)
s=to_ch(data)
print(s)
main()

后来发现是国密4加密算法,想想自己对算法了解太少了,应该多多学习,不过也真正的逆了一次国密算法。今天又尝试下载python3.6(感觉还是习惯了2.7),不过3.6肯定有很大的有点,多多适应吧。

Donate
-------------本文结束感谢您的阅读-------------