banner
NEWS LETTER

N1Junior-Writeup

Scroll down

Untitled

总结

好的挑战,英雄联盟,爱来自中国!

刚好是碰到了最近在学的几个点,unicon,代码混淆等等,算是一个实践的过程,而且相较于前几场比赛几乎都在搞加密算法,平时rust和go也做的少,所以N1junior的体验还是挺好的,可惜现在已经是大二老油条咯😭

junior_enc

pyc字节码分析 + unicon + AESmagic

HACKING

一看是pyc当然想反编译,不过我一开始做的是checkin-rs,后面降难度了直接看源码咯~

要分析的主要是这几大块

Unicon

程序加载了shellcode到ARM架构上,具体如下,那么要看他干了啥的话,

1
mu = Uc(UC_ARCH_ARM, UC_MODE_THUMB)

dump出shellcode后直接用IDA加载就能看了漂亮的伪代码啦😋

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
int __fastcall sub_0(int result)
{
_BYTE *v1; // [sp+4h] [bp-20h]
char v2; // [sp+Fh] [bp-15h]
int m; // [sp+10h] [bp-14h]
int k; // [sp+14h] [bp-10h]
int j; // [sp+18h] [bp-Ch]
int i; // [sp+1Ch] [bp-8h]

v1 = (_BYTE *)result;
for ( i = 0; i <= 31; ++i )
{
result = (unsigned __int8)(v1[i] & ~v1[(i + 1) % 32]);
v1[i] = v1[i] & ~v1[(i + 1) % 32] | ~v1[i] & v1[(i + 1) % 32];
}
for ( j = 0; j <= 31; ++j )
{
if ( (j & 1) != 0 )
v1[j] += 6;
else
v1[j] += 9;
}
for ( k = 0; k <= 31; k += 2 )
{
v2 = v1[k];
v1[k] = v1[k + 1];
v1[k + 1] = v2;
}
for ( m = 1; m <= 31; ++m )
{
result = (unsigned __int8)v1[m];
v1[m] = (v1[m] | v1[m - 1]) & ~(result & v1[m - 1]);
}
return result;
}

这里的加密逻辑也是挺简单的,根据for循环分成四段:

  1. result不用管,再者是一个MBA混淆,实际上是异或input[i] ^= input[(i + 1) % 32]
  2. 2个data为一组进行add(有脏东西,等会说-O-)
  3. 对换
  4. 也是MBA混淆,实际上是异或

hookcode

上面留了个伏笔,就是hook_code函数改写了add的数据,下面才是part2真正的加密逻辑

1
2
3
4
5
6
7
for ( j = 0; j <= 31; ++j )
{
if ( (j & 1) != 0 )
input[j] += 8; // 奇数
else
input[j] += 18; // 偶数
}

AES魔改

这里的AES也有脏东西☹搞了贼久才发现

SubBytes层换成了SubBytes_INV

行移位层从 0 <<<1 <<<2 <<<3, 改成:>>>1 >>>2 >>>3 >>>4

赛博厨子aes16位时怪怪的,输出是32位的???

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
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
from numpy import zeros  # 矩阵的初始化
from copy import deepcopy # 对于多级列表得采取深度复制避免对中间态矩阵的影响
from functools import reduce # 对于可迭代对象的累点积(自定义点积)的函数
from binascii import unhexlify

class AES128():
def __init__(self, key):

self.key = key # 密钥(固定为16个字符)

self.Key2Matrix() # 密钥转密钥矩阵

self.Key_extension() # 密钥扩展

def Text2Matrix(self): # 文本转文本矩阵
# 初始化文本矩阵(ECB模式,所以矩阵各元素初始化为0)
self.Text_Matrix = zeros((4, 4), dtype=int)

for x in range(len(self.text)): # 遍历将文本元素转换为ASCILL码并赋值给矩阵
self.Text_Matrix[x % 4][x//4] = ord(self.text[x])
pass

def Key2Matrix(self): # 密钥转密钥矩阵
self.Key_Matrix = zeros((4, 44), dtype=int) # 初始化密钥矩阵

for x in range(len(self.key)): # 遍历将密钥元素转换为ASCILL码并赋值给矩阵
self.Key_Matrix[x % 4][x // 4] = ord(self.key[x])

def DeText2Matrix(self): # 密文本转密文本矩阵
# 初始化密文本矩阵(ECB模式,所以矩阵各元素初始化为0)
self.DeText_Matrix = zeros((4, 4), dtype=int)

for x in range(len(self.detext)//2): # 遍历将密文本元素转换为整数并赋值给矩阵
self.DeText_Matrix[x % 4][x //
4] = int(self.detext[2*x], 16)*16+int(self.detext[2*x+1], 16)

def Key_extension(self): # 密钥扩展
self.sbox = [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16, ]

self.invsbox = [0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D]

self.Rconj = [[0x01, 0x00, 0x00, 0x00], [0x02, 0x00, 0x00, 0x00], [0x04, 0x00, 0x00, 0x00], [0x08, 0x00, 0x00, 0x00], [0x10, 0x00, 0x00, 0x00],
[0x20, 0x00, 0x00, 0x00], [0x40, 0x00, 0x00, 0x00], [0x80, 0x00, 0x00, 0x00], [0x1B, 0x00, 0x00, 0x00], [0x36, 0x00, 0x00, 0x00]]
for i in range(4, 44):
if i % 4:
# W[i]=W[i-4]⨁W[i-1]
self.Key_Matrix[:, i] = self.XOR(
self.Key_Matrix[:, i - 4], self.Key_Matrix[:, i - 1])

else:

# 求T(b)

# 1.字循环
temp = self.Byte_Cycle(self.Key_Matrix[:, i - 1], 1, 1)

# 2.字节代换
temp = self.Byte_Substitution(temp, 1)

# 3.轮常量异或

temp = self.XOR(temp, self.Rconj[i // 4 - 1])

# W[i]=W[i-4]⨁T(W[i-1])
self.Key_Matrix[:, i] = self.XOR(
self.Key_Matrix[:, i - 4], temp) # 密钥扩展已完成

def encrypto(self, text):

self.text = text # 文本(最长为16个字符)

self.Text2Matrix() # 文本转文本矩阵

self.Column_mixed_fixed_matrix = [[0x02, 0x03, 0x01, 0x01],
[0x01, 0x02, 0x03, 0x01],
[0x01, 0x01, 0x02, 0x03],
[0x03, 0x01, 0x01, 0x02]]

self.Intermediate_Matrix = self.Text_Matrix # 保留原始文本矩阵

self.AES_encrypto1_9() # 前九轮单调循环

self.AES_encrypto10() # 第十轮与前九轮有区别

return self.final_encryptohex()

def decrypto(self, detext):

self.detext = detext # 密文本(最长为16个字符)

self.DeText2Matrix() # 密文本转密文本矩阵

self.invsbox = [0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D]

self.Inverse_column_mixed_fixed_matrix = [[0x0e, 0x0b, 0x0d, 0x09],
[0x09, 0x0e, 0x0b, 0x0d],
[0x0d, 0x09, 0x0e, 0x0b],
[0x0b, 0x0d, 0x09, 0x0e]]

self.Intermediate_Matrix = self.DeText_Matrix # 保留原始密文本矩阵

self.AES_decrypto1_9() # 前九轮单调循环

self.AES_decrypto10() # 第十轮与前九轮有区别

return self.final_decryptostr()

def AES_encrypto1_9(self):
# 首次特殊轮密钥加
self.Round_key_addition(0)

for i in range(9):
pass
# 字节代换
for j in range(4):
self.Intermediate_Matrix[:, j] = self.Byte_Substitution(
self.Intermediate_Matrix[:, j], 0) #magic

# 行移位
pass
# print(f"\n{self.Intermediate_Matrix}")
for k in range(4):
self.Intermediate_Matrix[k, :] = self.Byte_Cycle(
self.Intermediate_Matrix[k, :], 0, k+1) #magic

# 列混合
pass
self.Column_mixing(1)

# 轮密钥加
pass
self.Round_key_addition(i+1)
pass

def AES_encrypto10(self):

# 字节代换

for j in range(4):
self.Intermediate_Matrix[:, j] = self.Byte_Substitution(
self.Intermediate_Matrix[:, j], 0)
pass

# 行移位
for k in range(4):
self.Intermediate_Matrix[k, :] = self.Byte_Cycle(
self.Intermediate_Matrix[k, :], 0, k+1)

# 轮密钥加
self.Round_key_addition(10)

def AES_decrypto1_9(self):

# 首次特殊轮密钥加
self.Round_key_addition(10)

for i in range(9):

# 行移位
for k in range(4):
self.Intermediate_Matrix[k, :] = self.Byte_Cycle(
self.Intermediate_Matrix[k, :], 1, k+1) #magic

# 字节代换
for j in range(4):
self.Intermediate_Matrix[:, j] = self.Byte_Substitution(
self.Intermediate_Matrix[:, j], 1) #magic

# 轮密钥加
self.Round_key_addition(10 - i - 1)

# 列混合
self.Column_mixing(0)

def AES_decrypto10(self):

# 行移位
for k in range(4):
self.Intermediate_Matrix[k, :] = self.Byte_Cycle(
self.Intermediate_Matrix[k, :], 1, k+1) #magic

# 字节代换
for j in range(4):
self.Intermediate_Matrix[:, j] = self.Byte_Substitution(
self.Intermediate_Matrix[:, j], 1) #magic

# 轮密钥加
self.Round_key_addition(0)

def Round_key_addition(self, rounds): # 轮密钥加

temp = deepcopy(self.Intermediate_Matrix) # 对于多级列表得采取深度复制避免对中间态矩阵的影响

for i in range(4):
self.Intermediate_Matrix[:, i] = self.XOR(
temp[:, i], self.Key_Matrix[:, 4*rounds+i])

def Byte_Substitution(self, Substitution_element, whichbox): # 字节代换

if whichbox == 1:
return list(map(lambda x: self.sbox[Substitution_element[x]], range(4)))

else:
return list(map(lambda x: self.invsbox[Substitution_element[x]], range(4)))

def Byte_Cycle(self, cycle_element, direction, t=0): # 字循环/行位移
if direction:
return list(map(lambda i: cycle_element[(i + t) % 4], range(4)))

else:
return list(map(lambda i: cycle_element[(i - t) % 4], range(4)))

def Column_mixing(self, inverse): # 列混合

temp = deepcopy(self.Intermediate_Matrix) # 对于多级列表得采取深度复制避免对中间态矩阵的影响

if inverse:
for i in range(4):
for j in range(4):
self.Intermediate_Matrix[i][j] = self.Ques_element(
temp[:, j], self.Column_mixed_fixed_matrix[i])
else:
for i in range(4):
for j in range(4):
self.Intermediate_Matrix[i][j] = self.Ques_element(
temp[:, j], self.Inverse_column_mixed_fixed_matrix[i])

def XOR(self, elementx, elementy): # 异或

return list(map(lambda i: elementx[i] ^ elementy[i], range(4)))

def Xtime(self, x): # xtime为域上乘法提供基础

if x // 128:
return ((x * 2) ^ (0x1b)) % 256
else:
return (x * 2) % 256

def Multiplication_over_field(self, x, y): # 域上乘法

Xtime_weight = [x] # 对于x的权的列表并初始化

result = 0
for i in range(8):
Xtime_weight.append(self.Xtime(Xtime_weight[i]))

for j in range(8):
if bin(y)[2:].rjust(8, '0')[j] == '1':
result = result ^ Xtime_weight[7 - j]
return result

def Ques_element(self, element0, element1): # 自定义求下标为(x,y)的单个矩阵元素

temp = list(
map(lambda x, y: self.Multiplication_over_field(x, y), element0, element1))
return reduce(lambda x, y: x ^ y, temp)

def hex_print_matrix(self, element, rounds=0): # 以十六进制打印矩阵

for i in range(4):
for j in range(4):
print("%x" % (element[i][j]), end=" ")
print()

def final_encryptohex(self):
result = []

for i in range(4):

result.append("".join(
list(map(lambda x: hex(x)[2:].rjust(2, '0'), self.Intermediate_Matrix[:, i]))))
result = "".join(result)
return result

def final_decryptostr(self):
temp = []

for i in range(4):

temp.append("".join(
list(map(lambda x: hex(x)[2:].rjust(2, '0'), self.Intermediate_Matrix[:, i]))))
temp = "".join(temp)

result = unhexlify(temp.encode('utf-8'))
return result

def Evidence(text, key):
# 要求key长度为16
aes = AES128(key)
enc = aes.encrypto(text)
print(enc.encode('utf-8'))
detext = aes.decrypto(enc)
print(detext)

def unicon_dec(enc):
print(enc)
for i in range(len(enc)-1,0,-1):
enc[i] ^= enc[i-1]

print(enc)
for i in range(0,len(enc),2):
tmp = enc[i]
enc[i] = enc[i+1]
enc[i+1] = tmp

print(enc)
for i in range(0,len(enc),2):
enc[i]= (enc[i]- 18)&0xFF
enc[i+1]= (enc[i+1]-8)&0xFF

print(enc)
for i in range(len(enc)-1,-1,-1):
enc[i] ^= enc[(i+1)%32]

return enc

key = "anptntmxyuokmlwv"
model = AES128(key)
print(model.encrypto("1234567812345678")) # test
Evidence("1234567812345678",key)

cipher = [61, 182, 175, 175, 2, 168, 124, 177, 32, 240, 230, 220, 58, 123, 165, 238, 53, 192, 237, 21, 175, 91, 224, 150, 133, 153, 54, 203, 79, 33, 193, 172]
cipher = bytes(cipher)
cipher = hex(int.from_bytes(cipher, 'big'))[2:]
c1 = cipher[:32]
c2 = cipher[32:]
output = model.decrypto(c1) + model.decrypto(c2)
print(unicon_dec(list(output)))

checkin-rs

HACKING1

一上来就是rust,rust就rust吧

对rust感觉还是啃汇编代码比较好,可能是还不够熟练吧,希望有大佬指导一下还有没有更好的方法 ( T_T )

对api大体分析可以发现这些是跟rust并发编程相关的内容,了解一下,这里作简要介绍

Untitled

了解到这里基本就有个思路就是input通过多线程的handler处理并判断,最后从通道输出判断信息

问题是handler在哪?

HACKING2

细心发现从网上搜到的示例代码,receiver必有sender,所以找,也是很幸运的找到了交叉引用

Untitled

找到一个backtrace,里面的操作也是看着可疑,下断点验证一下,是不是input经过这个地方,是找对地方了

前面一大堆我是慢慢分析的qwq,所以非常非常慢,其实更好的方法还是对加密操作分段,再下断点观察,不过不知道为啥在这里我下不了硬件断点,值改变了也跟踪不了,小烦。。。

最后加密逻辑很简单,就是逆序再异或i

这里有个小技巧就是测试flag的时候尽量不重复,如123456789abcdefABCDEFGHIJKLMNOPQRSTUVWXYZghi 这样很容易发现规律

EXP

1
2
3
4
5
enc = [0x7D, 0x20, 0x23, 0x22, 0x25, 0x24, 0x68, 0x72, 0x6E, 0x56, 0x79, 0x62, 0x53, 0x79, 0x7D, 0x7A, 0x62, 0x4E, 0x7C, 0x7A, 0x7F, 0x76, 0x73, 0x7F, 0x7B, 0x46, 0x7F, 0x68, 0x6E, 0x78, 0x68, 0x7A, 0x52, 0x7E, 0x5B, 0x50, 0x45, 0x40, 0x5D, 0x4C, 0x46, 0x5C, 0x5A, 0x48, 0x49,0x5E]
for i in range(len(enc)):
enc[i]^=i
enc = enc[::-1]
print(bytes(enc))

n0th1ngG0

HACKING

阿这。。。不知道为啥linux版本的动调不起来

换成exe的就直接能开了,那就拿exe分析好了

降了难度后动调起来GO也不是特别难看,很容易能发现check的地方

Untitled

然后找到加密操作的位置,很明显就是这里

Untitled

进去一看有两个WTF,顺带说说还有些小坑…没动调前还以为这是同一个函数

Untitled

上一个函数不是关键,给input挂上断点就能发现关键操作是在第二个WTF

Untitled

加密逻辑挺简单的,前面都是rax的变化不需要逆,然后猜一手MBA,拿到xorkey后就可以getflag咯~

EXP

1
2
3
4
5
6
7
8
9
10
enc = [0x51, 0x23, 0x48, 0x73, 0x13, 0x50, 0x2C, 0x63, 0x61, 0xBA, 0x60, 0x2E, 0x54, 0x65, 0x29, 0x66, 0x81, 0xAB, 0x87, 0x34, 0x1A, 0xD0, 0x71, 0xAE, 0xA7, 0xE8, 0xAC, 0xCC, 0xEC, 0x75, 0x56, 0xFB, 0x79]
tmp = [0x51, 0x23, 0x48, 0x73, 0x13, 0x50, 0x2C, 0x63, 0x61, 0xBA, 0x60, 0x2E, 0x54, 0x65, 0x29, 0x66, 0x81, 0xAB, 0x87, 0x34, 0x1A, 0xD0, 0x71, 0xAE, 0xA7, 0xE8, 0xAC, 0xCC, 0xEC, 0x75, 0x56, 0xFB]
test = "1234567891234567891234567891234567"
enc_test = [0x13, 0x74, 0x18, 0x37, 0x53, 0x08, 0x70, 0x20, 0x16, 0xBA, 0x0D, 0x57, 0x35, 0x3E, 0x2E, 0x61, 0xCB, 0xCD, 0x84, 0x36, 0x1B, 0xD7, 0x1B, 0xA9, 0xE3, 0x8F, 0xA1, 0x8A, 0xED, 0x35, 0x52, 0xA3, 0x7C]
key = []
for i in range(len(enc_test)):
key.append(enc_test[i]^ord(test[i]))
enc[i] ^= key[i]

print(bytes(enc))
其他文章
cover
Hello World!
  • 23/01/14
  • 17:33
  • 其他