这道题对我来说还是太阴间了,我实在是不知道该怎么说好,算是促进我得学习把

题目分析:

首先给了一个.o文件让根据.o文件进行分析加密把.csv文件的数据还原。

首先是.o文件是linux在编译c语言的时候的中间产物,不必太在意直接当程序看就好

进入ida里(ida还坏了修了半天/(ㄒoㄒ)/~~)

7AFB4545058572927E03D3F8D9EC9889

按x查看他的交叉引用:

863D4DEF0BD9643C1C67B7141BC22DE7

密钥流的具体加密:

BEC1A03EF7240A3D0B0408E14FADD501

B81BC9248A21D05F64BAE23444B89EDD

对加密算法的分析

FC692CCA1DF891570CB2116D5250A578

异或的流加密;解密脚本很好写,这个地方虽然数据是一样的,但是却放到了不同的变量,所以写解密脚本的时候要注意,是有一定的区别的。

所以解密思路就是,先流加密xor然后base64换表编码,然后对于密钥已经知道了是2025年3月15号了。所以尝试一整天的时间伪随机数爆破。

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
import base64
import binascii

standard_base64_chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
custom_base64_chars = "QRSTUVWXYZabcdefABCDEFGHIJKLMNOPwxyz0123456789+/ghijklmnopqrstuv"

encode_table = {standard_base64_chars[i]: custom_base64_chars[i] for i in range(len(standard_base64_chars))}
decode_table = {custom_base64_chars[i]: standard_base64_chars[i] for i in range(len(custom_base64_chars))}


def custom_base64_encode(data):
standard_encoded = base64.b64encode(data)
custom_encoded = bytearray(standard_encoded)
for i in range(len(custom_encoded)):
custom_encoded[i] = encode_table.get(chr(custom_encoded[i]), chr(custom_encoded[i])).encode('utf-8')[0]
return bytes(custom_encoded)


def custom_base64_decode(encoded_data):
standard_encoded = bytearray(encoded_data)
for i in range(len(standard_encoded)):
standard_encoded[i] = decode_table.get(chr(standard_encoded[i]), chr(standard_encoded[i])).encode('utf-8')[0]
decoded_data = base64.b64decode(bytes(standard_encoded))
return decoded_data


import time


def sub_555555555329(v3, a2):
v3[0] = 1664525
v3[1] = 1013904223
v3[2] = 6789237
v3[3] = 255
v3[4] = ((a2 * v3[0] + v3[1]) & 0xffffffff) % v3[2] % (v3[3] + 1)


def sub_5555555553A8(v3):
v3[4] = ((v3[0] * v3[4] + v3[1]) & 0xffffffff) % v3[2] % (v3[3] + 1)
return v3[4] # 返回的是 v3[4],即修改后的值


def simulate_sub_555555555403(target_time):
v3 = [0] * 24 # 创建一个长度为 24 的空数组 v3
sub_555555555329(v3, target_time) # 填充 v3 数组
# if v3[4] == 0xea:
# print(1111111111111111111111111)
byte_5555555590C0 = [0] * 2048 # 初始化 byte_5555555590C0 数组

# 填充 byte_5555555590C0 数组
for i in range(2048):
byte_5555555590C0[i] = sub_5555555553A8(v3)

return byte_5555555590C0


with open("C:\\Users\HP\Desktop\一直没有做出来的csv\data01\数据公开与隐私保护附件\data\\2025-03-15.enc.csv", "rb") as f:
enc = bytearray(f.read())

for t in range(180):
tmp = enc[:]#浅拷贝,可以不影响两个数组
target_time = 1742952120 + t # 这是一个示例的目标时间戳(你应该用实际目标时间戳替换它)

# 模拟并获取 byte_5555555590C0 数组
result = simulate_sub_555555555403(target_time)
ptr = result[:]
xor = result[:]

for i in range(len(enc)):
tmp[i] ^= ptr[i]
for j in range(len(enc)):
ptr[j] ^= xor[i]

try:
decoded_data = custom_base64_decode(tmp)
if b'id' in decoded_data:
print(f"Decoded Data: {decoded_data.decode('utf-8', errors='ignore')}")
break
print(decoded_data[:10])
except (binascii.Error, UnicodeDecodeError) as e:
pass
print("\n---\n")

还原了原表

2333FA50C83A8BFE2139000B76B07635