4

点击此处获得更好的阅读体验


WriteUp来源

来自M01N战队

题目描述

某安全机构截获了一段密文,并通过社工的方式获取了该密文对应的加密方式。现请你帮助他们对该密文进行解密。4441774e565535504f535a4e524870556446414f5a45496b6152634f41424e49483355774e5339414d44553d

题目考点

  • 算法分析

解题思路

根据题意编写解密算法,得到flag

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
import struct
import base64
import binascii
flag = 'xxxxxxxxxxxxxxxxxxxxx'
key = 0x326c3567

def crypto(data):
#print(data,data>>16)
return data ^ data >> 16

def encode(data_content, key):
cyphertext = []
data_content_length = len(data_content)
cyphertext += [crypto(data_content[0] ^ key)]

for i in range(1, data_content_length):
cyphertext += [crypto(cyphertext[i-1] ^ data_content[i])]

crypted_result = ''
for c in cyphertext:
crypted_result += struct.pack("I", c)

return base64.b64encode(crypted_result)
def decode(p_en_content,key):

p_en_content=base64.b64decode(p_en_content)
en_content = struct.unpack("I" * (len(p_en_content) / 4), p_en_content)
print(en_content)
plain_text=[]
en_len= len(en_content)
plain_text+=[crypto(en_content[0])^key]
for i in range(1, en_len):
plain_text += [crypto(en_content[i])^en_content[i-1] ]
decrypted_result = ''
for c in plain_text:
decrypted_result += struct.pack("I", c)

return decrypted_result

padding = 4 - len(flag) % 4
if padding != 0:
flag = flag + "\x00" * padding

data_content = struct.unpack("I" * (len(flag) / 4), flag)
en_data=encode(data_content, key)
print(decode(en_data,key))
#data_content = struct.unpack("I" * (len(flag) / 4), flag)
en_flag=binascii.a2b_hex('4441774e565535504f535a4e524870556446414f5a45496b6152634f41424e49483355774e5339414d44553d')
print(decode(en_flag,key))
print('%x'%crypto(crypto(0x45678922)))

Flag

1
flag{e4sy_Cr7pt0_cgs_lz_!@#}