文章总结: 本文档记录了FIC2026初赛PC部分的数字取证分析过程,涉及Deepin系统检材分析、钓鱼邮件识别、RSA加密图片解密、VPN端口确认、AI模型信息提取、勒索软件逆向分析及数据恢复等技术操作。关键发现包括通过因数分解RSA模数成功解密推广设计图、分析恶意程序获取勒索联系方式[email protected]、修复被加密MP4文件并还原保险柜编号与密码。可操作建议涵盖使用Python脚本进行数据解密、CRC校验修复及二进制逆向分析等方法。 综合评分: 78 文章分类: CTF,渗透测试,应急响应,恶意软件,漏洞分析
致敬手搓的大佬
- 分析计算机检材,李安弘电脑vpn软件开放的代理端口为
9527 右下角查看uos ai 系统代理
- 分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为
deepseek 右下角uos ai
- 分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为
/home/lha/.local/share/deepin/uos-ai-assistant/db/basic
火眼全盘搜索9676a,
- 分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为
vc加密分区(密码在手机备忘录)挂载,ida加ai分析下面的get_token_linux程序
1. 构造通配符字符串 "*.mp4"2. 调用 filepath.Glob("*.mp4") 查找所有 MP4 文件3. 遍历每个文件: - 读取文件内容(os.ReadFile) - 调用 main._a(file_data, 1337) 进行加密 - 用 OR 操作累积返回值4. 如果有文件被修改(返回值非0): - 打印勒索信息 - 休眠1秒 - 打印第二条信息5. 否则静默退出
分析出其中的邮件地址 [email protected]
- 分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是
其中的mp4文件,导出修复,可以直接用视频修复软件,也可以用上面的分析对每个 stco 中的 chunk offset 减去 1337 即可恢复文件,其中一个视频有
# 解密脚本思路import structdef decrypt_mp4(filepath): with open(filepath, 'rb') as f: data = bytearray(f.read()) # 找到 "stco" 原子 idx = data.find(b'stco') if idx == -1: return # stco 结构: [4字节size][4字节"stco"][4字节版本/标志][4字节entry_count][entries...] entry_count_off = idx + 4 + 4 # 版本/标志之后 entry_count = struct.unpack('>I', data[entry_count_off:entry_count_off+4])[0] # 修改每个 chunk offset for i in range(entry_count): off = entry_count_off + 4 + i * 4 val = struct.unpack('>I', data[off:off+4])[0] val -= 1337 # 减去 1337 还原 struct.pack_into('>I', data, off, val) with open(filepath, 'wb') as f: f.write(data)
- 分析计算机检材,李安弘电脑中记录的保险柜密码是
在数据盘tools目录发现enrycpxls文件,是et文件的加密方式
丢给ai编写出解码程序
iimport olefileimport structimport osfolder = r'c:\Users\Administrator\Documents\trae_projects\2\zhongyao'filepath = os.path.join(folder, '保险箱的秘密.et')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]]}def decrypt_value(val): part1 = val // 1000 part2 = val % 1000 x = (part1 ^ 85) - 100 y = (part2 ^ 85) - 100 return x, ydef encrypt_coord(x, y): return ((x + 100) ^ 85) * 1000 + ((y + 100) ^ 85)ole = olefile.OleFileIO(filepath)workbook_data = ole.openstream('Workbook').read()ole.close()print("Checking for missing 'i' character at position 4")print("="*70)expected_i_dots = font['i']print(f"\nExpected 'i' dots: {expected_i_dots}")for dot in expected_i_dots: x = 4 * 25 + dot[0] * 4 y = dot[1] * 4 enc = encrypt_coord(x, y) print(f" Dot ({dot[0]},{dot[1]}) -> coord ({x},{y}) -> encrypted {enc}") enc_str = str(enc) enc_utf16 = enc_str.encode('utf-16-le') idx = workbook_data.find(enc_utf16) if idx >= 0: print(f" FOUND at offset {idx}") else: print(f" NOT FOUND in workbook data") for start in range(len(workbook_data) - len(enc_str)): if workbook_data[start:start+len(enc_str)] == enc_str.encode('ascii'): print(f" Found as ASCII at offset {start}") breakprint("\n" + "="*70)print("Searching for ALL possible encrypted values using brute force")print("="*70)all_encrypted = []for char_idx in range(25): for ch, matrix in font.items(): for dot in matrix: x = char_idx * 25 + dot[0] * 4 y = dot[1] * 4 enc = encrypt_coord(x, y) all_encrypted.append((enc, char_idx, ch, dot))all_encrypted.sort()print(f"Total possible encrypted values: {len(all_encrypted)}")found_values = set()for enc, char_idx, ch, dot in all_encrypted: enc_str = str(enc) enc_utf16 = enc_str.encode('utf-16-le') if enc_utf16 in workbook_data: found_values.add(enc)print(f"Found {len(found_values)} encrypted values in workbook data")missing = []for enc, char_idx, ch, dot in all_encrypted: if enc not in found_values: missing.append((enc, char_idx, ch, dot))if missing: print(f"\nMissing {len(missing)} values:") for enc, char_idx, ch, dot in missing[:20]: print(f" {enc} (char #{char_idx} '{ch}' dot {dot})")else: print("\nAll expected values found!")print("\n" + "="*70)print("Reconstructing text from found values")print("="*70)char_map = {}for enc, char_idx, ch, dot in all_encrypted: if enc in found_values: if char_idx not in char_map: char_map[char_idx] = set() char_map[char_idx].add((dot[0], dot[1]))result = ""for idx in sorted(char_map.keys()): dots = char_map[idx] dots_set = set(dots) best_char = '?' best_score = -1 for ch, matrix in font.items(): matrix_set = set(tuple(d) for d in matrix) if dots_set == matrix_set: best_char = ch best_score = 1.0 break intersection = len(dots_set & matrix_set) union = len(dots_set | matrix_set) jaccard = intersection / union if union > 0 else 0 if jaccard > best_score: best_score = jaccard best_char = ch result += best_char print(f" Char #{idx}: '{best_char}' (score={best_score:.2f}) dots={sorted(dots)}")print(f"\n*** FINAL DECODED TEXT: '{result}' ***")
执行后解码得到解码结果: baoxianguimima:583985
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:老皮的碎碎念念 老皮皮 老皮皮《fic2026初赛pc部分wp》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论