检材密码:FIC-{e404d6e66586e9460c23755afab5a872bcf78ab4}

排名22,与大佬们的差距还是太大了orz......好消息是晋级了,大佬们决赛见!
本来想着全写完发的,实在是太忙了,就先发计算机和手机吧
计算机部分
计算机VC密码在手机便签中

1. 分析计算机检材,操作系统版本号为【参考格式:1.1】
23.1
在基本信息里可以看到

2. 分析计算机检材,李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件,其发送用户邮箱为【参考格式:123@qq.com】
hf13338261292@outlook.com
在邮件中一眼可以看到

3. 分析计算机检材,李安弘电脑中记录的黄金换现金的商家联系方式为【参考格式:110】
13612817854
仿真之后再开始页面找到了一个记事本

打开看到黄金换现金的商家联系方式

4. 分析计算机检材,推广设计图中的apk下载链接为【参考格式:http:///?*】
https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing
在下载文件夹中看到了推广设计图

这个图片是被加密的,这个html可以查看加密图片,私钥是rsa的n和d
在public.txt中看到了n和e,算出d,写出解密脚本
import sympy
import libnum
n = 57751892008149574447756694613209346511056045951970458143905594411398554113111623746466692172544473909892773600617029641656248235151775166339061269972238018743173330948084699695182438765935110193323089354031112350869626121317836465551360104372140181097747761558797918522051881262043738603183528521379831286761
e = 65537
分解 n
p, q = sympy.factorint(n).keys() # 只适用于小 n
p, q = list(sympy.factorint(n).keys())
print(f"p={p}, q={q}")
phi = (p-1)*(q-1)
d = libnum.invmod(e, phi)
print(f"d = {d}")
** **接下来解密一下图片

扫码识别一下

5. 分析计算机检材,李安弘电脑vpn软件开放的代理端口为【参考格式:80】
9527
在开始菜单这里看到clash

查看设置

6. 分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为【参考格式:deepseek】
OpenRouter
在电脑右下角看到了ai软件

查看设置

7. 分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为【参考格式:sk-abcd...】
sk-or-v1-f501ba...676a
搜索一下有关这个ai的文件夹,找到一堆,从文件数量最多的开始看

在/home/lha/.local/share/deepin/uos-ai-assistant文件夹下找到db文件

8. 分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为【参考格式:abcd123232】
beijixin996@tutanota.com
用手机中的VC密码解密一下磁盘9ed2@99y8.com.cn

看到文件中有个get_token_linux文件,在浏览器的历史记录中看到访问了github中类似的文件

将这个文件导出拿ida查看一下,反编译main_main,看到有个邮箱

转换一下邮箱上面两行可以看到 解密请系系,所以就是这个邮箱

9. 分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是【参考格式:1】
997546
分析main_main和main_a两个函数可知,这个程序会将mp4文件进行加密,然后同目录下.hidden文件也有提示

写一个解密脚本,解密一下与这个程序同目录下的mp4文件
#!/usr/bin/env python3
import struct, sys, shutil
for f in sys.argv[1:]:
shutil.copy2(f, f+'.bak')
d = bytearray(open(f,'rb').read())
p = 0
while (p := d.find(b'stco', p)) != -1:
n = struct.unpack('>I', d[p+8:p+12])[0]
for i in range(n):
e = p+12+i*4
d[e:e+4] = struct.pack('>I', (struct.unpack('>I', d[e:e+4])[0]-1337)&0xFFFFFFFF)
p = p+12+n*4
open(f,'wb').write(d)
print(f'已修复: {f}')
修复之后打开mp4文件

10. 分析计算机检材,李安弘电脑中记录的保险柜密码是【参考格式:123456】
583985
在/root/文档/zhongyao看到有关保险箱密码的文件

导出发现没有内容,在电脑中看到excel的加密代码

让ai写一个脚本解密一下
import olefile
import struct
ole = olefile.OleFileIO(r'd:\OneDrive\Desktop\新建文件夹\保险箱的秘密.et')
workbook_data = ole.openstream('Workbook').read()
ole.close()
xor_key = 85
spacing = 25
Parse BIFF records
def parse_biff_records(data):
records = []
i = 0
while i < len(data) - 3:
rec_type = struct.unpack('<H', data[i:i+2])[0]
rec_len = struct.unpack('<H', data[i+2:i+4])[0]
rec_data = data[i+4:i+4+rec_len]
records.append((i, rec_type, rec_len, rec_data))
i += 4 + rec_len
if rec_len == 0 and rec_type == 0:
i += 1
return records
records = parse_biff_records(workbook_data)
Collect MSODRAWING records with their positions
mso_records = [(p, t, l, d) for p, t, l, d in records if t == 0x00EC]
obj_records = [(p, t, l, d) for p, t, l, d in records if t == 0x005D]
print(f"MSODRAWING records: {len(mso_records)}")
print(f"OBJ records: {len(obj_records)}")
shape_values = []
for i, (pos, rec_type, rec_len, rec_data) in enumerate(mso_records):
# Search for UTF-16LE digit sequences in this record
nums_in_record = []
j = 0
while j < len(rec_data) - 1:
code = struct.unpack('<H', rec_data[j:j+2])[0]
if 0x30 <= code <= 0x39:
k = j
num_str = ""
while k < len(rec_data) - 1:
c = struct.unpack('<H', rec_data[k:k+2])[0]
if 0x30 <= c <= 0x39:
num_str += chr(c)
k += 2
else:
break
if len(num_str) >= 4:
nums_in_record.append((j, num_str))
j = k
else:
j += 2
if nums_in_record:
for offset, num_str in nums_in_record:
encoded = int(num_str)
x_part = encoded // 1000
y_part = encoded % 1000
x = (x_part ^ xor_key) - 100
y = (y_part ^ xor_key) - 100
shape_values.append((x, y, i, num_str))
print(f"\nExtracted {len(shape_values)} values from MSODRAWING records")
Also try: search for ANSI numbers in each MSODRAWING record
ansi_shape_values = []
for i, (pos, rec_type, rec_len, rec_data) in enumerate(mso_records):
j = 0
while j < len(rec_data):
if 0x30 <= rec_data[j] <= 0x39:
k = j
num_str = ""
while k < len(rec_data) and 0x30 <= rec_data[k] <= 0x39:
num_str += chr(rec_data[k])
k += 1
if len(num_str) >= 4:
encoded = int(num_str)
x_part = encoded // 1000
y_part = encoded % 1000
x = (x_part ^ xor_key) - 100
y = (y_part ^ xor_key) - 100
ansi_shape_values.append((x, y, i, num_str))
j = k
else:
j += 1
print(f"Extracted {len(ansi_shape_values)} ANSI values from MSODRAWING records")
Valid points should have: 0 <= y <= 28 (7 rows * 4 pixels), y % 4 == 0, x >= 0
print("\n--- UTF-16LE extraction validation ---")
valid_utf16 = [(x, y, i, n) for x, y, i, n in shape_values if 0 <= y <= 28 and y % 4 == 0 and x >= 0]
print(f"Valid UTF-16LE points: {len(valid_utf16)}/{len(shape_values)}")
print("\n--- ANSI extraction validation ---")
valid_ansi = [(x, y, i, n) for x, y, i, n in ansi_shape_values if 0 <= y <= 28 and y % 4 == 0 and x >= 0]
print(f"Valid ANSI points: {len(valid_ansi)}/{len(ansi_shape_values)}")
Use whichever source gives more valid points
all_values = valid_utf16 if len(valid_utf16) >= len(valid_ansi) else valid_ansi
source = "UTF-16LE" if len(valid_utf16) >= len(valid_ansi) else "ANSI"
print(f"\nUsing {source} with {len(all_values)} valid points")
Print all decoded points
print("\nAll valid decoded points:")
for x, y, rec_idx, num_str in sorted(all_values, key=lambda v: (v[0], v[1])):
char_idx = x // spacing
local_x = (x % spacing) // 4
local_y = y // 4
print(f" x={x:3d}, y={y:2d}, char_idx={char_idx:2d}, local=({local_x},{local_y}), encoded={num_str}")
Group points by character index
char_points = {}
for x, y, rec_idx, num_str in all_values:
char_idx = x // spacing
local_x = (x % spacing) // 4
local_y = y // 4
if char_idx not in char_points:
char_points[char_idx] = set()
char_points[char_idx].add((local_x, local_y))
print(f"\nGrouped into {len(char_points)} character positions")
print(f"Character positions: {sorted(char_points.keys())}")
Font dictionary
font = {
'0':[[1,0],[2,0],[0,1],[3,1],[0,2],[3,2],[0,3],[3,3],[1,4],[2,4]],
'1':[[2,0],[1,1],[2,1],[2,2],[2,3],[1,4],[2,4],[3,4]],
'2':[[1,0],[2,0],[0,1],[3,1],[2,2],[1,3],[0,4],[1,4],[2,4],[3,4]],
'3':[[0,0],[1,0],[2,0],[3,1],[1,2],[2,2],[3,3],[0,4],[1,4],[2,4]],
'4':[[3,0],[2,1],[3,1],[1,2],[3,2],[0,3],[1,3],[2,3],[3,3],[4,3],[3,4]],
'5':[[0,0],[1,0],[2,0],[0,1],[0,2],[1,2],[2,2],[3,3],[0,4],[1,4],[2,4]],
'6':[[1,0],[2,0],[0,1],[0,2],[1,2],[2,2],[0,3],[3,3],[1,4],[2,4]],
'7':[[0,0],[1,0],[2,0],[3,0],[3,1],[2,2],[1,3],[1,4]],
'8':[[1,0],[2,0],[0,1],[3,1],[1,2],[2,2],[0,3],[3,3],[1,4],[2,4]],
'9':[[1,0],[2,0],[0,1],[3,1],[1,2],[2,2],[3,2],[3,3],[2,4]],
'a':[[1,2],[2,2],[3,2],[0,3],[3,3],[1,4],[2,4],[3,4]],
'b':[[0,0],[0,1],[0,2],[1,2],[2,2],[0,3],[3,3],[0,4],[1,4],[2,4]],
'c':[[1,0],[2,0],[3,0],[0,1],[0,2],[0,3],[1,4],[2,4],[3,4]],
'd':[[3,0],[3,1],[1,2],[2,2],[3,2],[0,3],[3,3],[1,4],[2,4],[3,4]],
'e':[[1,0],[2,0],[0,1],[0,2],[1,2],[2,2],[0,3],[1,4],[2,4]],
'f':[[1,0],[2,0],[1,1],[0,2],[1,2],[2,2],[1,3],[1,4]],
'g':[[1,2],[2,2],[3,2],[0,3],[3,3],[1,4],[2,4],[3,4],[3,5],[1,6],[2,6]],
'h':[[0,0],[0,1],[0,2],[1,2],[2,2],[0,3],[3,3],[0,4],[3,4]],
'i':[[1,0],[1,2],[1,3],[1,4]],
'j':[[2,0],[2,2],[2,3],[2,4],[2,5],[1,6],[0,5]],
'k':[[0,0],[0,1],[0,2],[0,3],[0,4],[2,2],[1,3],[3,3],[2,4]],
'l':[[1,0],[1,1],[1,2],[1,3],[1,4]],
'm':[[0,1],[1,1],[2,1],[3,1],[4,1],[0,2],[2,2],[4,2],[0,3],[4,3]],
'n':[[0,1],[1,0],[2,0],[0,2],[3,2],[0,3],[3,3],[0,4],[3,4]],
'o':[[1,1],[2,1],[0,2],[3,2],[1,3],[2,3]],
'p':[[0,2],[1,2],[2,2],[0,3],[3,3],[0,4],[1,4],[2,4],[0,5],[0,6]],
'q':[[1,2],[2,2],[0,3],[3,2],[3,3],[3,4],[3,5],[4,5]],
'r':[[0,2],[0,3],[0,4],[1,2],[2,2]],
's':[[1,0],[2,0],[3,0],[0,1],[1,2],[2,2],[3,3],[0,4],[1,4],[2,4]],
't':[[1,0],[1,1],[1,2],[1,3],[1,4],[0,2],[2,2]],
'u':[[0,2],[0,3],[3,2],[3,3],[1,4],[2,4],[3,4]],
'v':[[0,0],[4,0],[1,2],[3,2],[2,4]],
'w':[[0,2],[0,3],[1,4],[2,3],[3,4],[4,2],[4,3]],
'x':[[0,0],[4,0],[1,1],[3,1],[2,2],[1,3],[3,3],[0,4],[4,4]],
'y':[[0,0],[4,0],[1,1],[3,1],[2,2],[2,3],[1,4]],
'z':[[0,0],[1,0],[2,0],[3,0],[2,1],[1,2],[0,3],[0,4],[1,4],[2,4],[3,4]],
':':[[1,1],[1,3]],
'@':[[1,0],[2,0],[0,1],[3,1],[0,2],[2,2],[3,2],[0,3],[1,4],[2,4]],
'.':[[1,4]]
}
Match each character
result = ""
for idx in sorted(char_points.keys()):