FIC 2026 团队赛

2026FIC初赛(write up)

围绕 FIC 的公开复盘与解题记录。

作者:xxdecayxx 发布日期:2026-07-15 46 次阅读

计算机部分 ### 1. 分析计算机检材,操作系统版本号为 23.1 ### 2.分析计算机检材,李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件,其发送用户邮箱为 ****lihongan19851024@163.com ### 3.分析计算机检材,李安弘电脑中记录的黄金换现金的商家联系方式为 启动器,我的常用。这里还会发现一个 clash verge 13612817854 ### 4. 分析计算机检材,推广设计图中的apk下载链接为 仿真后,在文档里面有相关信息,看来图片是被加密了,有一个公钥 火眼可以看到,需要的是私钥 仿真的系统浏览器,历史记录有,可以去原项目看加密过程 然后复制这些文件丢给 ai,就出来私钥了,就得到了图片 扫描结果https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing ### 5. 分析计算机检材,李安弘电脑vpn软件开放的代理端口为 这个软件,打开一看是 vpn 软件,端口 9527 ### 6. 分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为 这个能从很多地方可以看到,邮箱里面就有,然后浏览器历史记录也很多openrouter 还有仿真后,右下角的图标就是 ai ,点开就是这个 ### 7. 分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为 在历史记录里面点开可以找到 apikey,但是中间少一部分 sk-or,直接全局搜索吧。后缀不对,不是完整的,点击偏移 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 ### 8. 分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为 计算机挂载时,会有一个 vc 加密的分区,然后队友说手机那里刚好有个密码,那就解密了。 里面是这样 看到这个.hidden,就觉得不对劲,而且加密了肯定也与题目有关。查看这个 get_token_linux,发现是个 elf 文件,没想太多直接用 ida 分析,在主函数直接找到答案了 beijixin996@tutanota.com ### 9. 分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是 根据 hidden 内容,应该就藏在这俩里面 但是在最近文档里面看到了一堆 password 和保险柜的秘密,都是表格 然后在电脑上找到了,像是加密原理的代码。而且浏览器记录也有他搜的表格加密的四种办法。 把 MP4,勒索软件给 ai,跑不出来 ### 10. 分析计算机检材,李安弘电脑中记录的保险柜密码是 这个应该就是根据那个加密原理,以及保险柜密码.et 文件来解答。 然后再聊天记录也可以看到,是将 excel 加密了,搜了一下 vba > VBA(Visual Basic for Applications)是微软开发的一种宏编程语言,主要用于在 Office 应用程序(如 Excel、Word、Access、PowerPoint 等)中编写宏,实现自动化操作、数据处理、自定义功能等任务。 > 所以最后这两个文件喂给 ai,然后提示有 vba 加密 583985 ## 手机 ### 1.手机型号 文件系统里面,一点开就有个这个 查看一下,Redmi Note 7 Pro ### 2.计划前往迪拜的日期 感觉可能放在笔记软件,在分析出来的 apk 中找不到,直接搜索 note,可以看到有这个包 搜索这个包,选择数据多的 在数据库中2026.06.06 ### 3.与网站搭建人员沟通所用 APP 的安装日期 在 packages.xml 里面,搜索 uu 找到 it 字段(install time),是十六进制,转换一下19d8b6fd571 让 ai 转化为 utc 时间,2026-04-14 10:00:55 ### 4.沟通所用 APP 的聊天数据库路径 在 apk 中,可以找到该 app,uuutalk 复制包名,搜索com.talk.uuuim 在这个 377,里面找到了这个,看起来不像是聊天对话 应该是这个 wk,但是打不开,那就对应了下一题加密了 /data/user/0/com.talk.uuuim/databases/wk_9628874a3c6b403593766496fa985893.db ### 5.聊天数据库解密密码 密码居然就是文件名没想到,不过这个文件名确实长得挺像 9628874a3c6b403593766496fa985893 ### 6.云服务器商家收款备用钱包地址 在 message 表里聊天记录搜索地址,找到备用地址 {"content": "加上CDN一年特惠,一共算您5000 U,给您保驾护航,老板发大财,转账唯二地址TK7mR3hS8vY7tY1nZ4kL9otSzgjLj6tP8v,备用转账地址:TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1", "type": 1, "from_uid": "c5e0f4afea09370702f943e7cfcef741"} ### 7.给网站架构人员第一次路由的交易哈希前6位 在searchable_word 搜索图片,右侧查看路径 看修改时间最早的就行,26226f ### 8.李安弘主动向 AI 提问次数 apk 分析中有 apk 包 在文件系统找一下 选择 50 的那个,查一查数据库。在 message 表可以找到 10 个信息,两个用户交替,那就是 5 次 ### 9.AI 软件调用的本地模型及版本 还是上一题的数据库,local pals 表里面有ggml-org/SmolVLM-500M-Instruct-GGUF/SmolVLM-500M-Instruct-Q8_0.gguf ### 10.无人机飞行所在县 没什么思路,在视频里面找到了一堆大疆视频 直接在文件系统搜 dji 在这里找到了飞行记录 直接看的话是乱码,那就用官方的分析工具https://djiflightdata.com 直接拖入这俩个文件就行,**正常应该一步到位得到地点** 但是连接超时了,只得到了个经纬度 查一下经纬度,结果是米脂县https://www.mapchaxun.cn/jingweidu ### 11. 分析手机检材,李安弘最近安装了一个视频类APP,该APP声明了多个敏感权限用于收集用户隐私。请选择其中涉及用户隐私的敏感权限。 **A. READ_CONTACTS** **B. READ_SMS** **C. RECEIVE_BOOT_COMPLETED** **D. READ_CALL_LOG** **E. SEND_SMS** 很明显就是这个,直接雷电 app 分析 找一下有的,ABD ### 12. 上述APP启动后会加载一个色情网站。请找出该APP当网络不可用时APP加载的本地离线页面路径 先看看智能分析出来的敏感信息,可以看到一个网址 双击跟进一下,很明显第二个网址就是file:///android_asset/www/index.html ### 13. 上述APP将非法收集的用户隐私数据上传至远程服务器。上传地址在代码中经过编码处理。请找出编码方式,还原出完整的上传服务器URL **一把梭哈** Base64、https://api.sp-live88.com/collect/userdata ### 14.该APP在本地创建了SQLite数据库存储收集到的用户信息。请分析代码,写出用于存储用户信息的表名 在 jadx 中搜索 user,找到了user_collection ### 15.该APP的assets目录中存在一个加密配置文件config.dat。请解密该文件,写出其中的USDT钱包地址 可以直接用**Ai 大模型源码分析**,自动找到加密逻辑,编写脚本在本地,只需要运行解秘脚本一下即可 TXqH7sVn8bR4kL2mN9pW6xJ3cY5dF1gA 或者,搜索一下config.dat,找一下调用 查看加密逻辑,写脚本解密即可 ### 16.该APP前端JS代码可以直接调用Android原生方法获取用户隐私数据。请分析暴露了哪些方法用于获取通讯录? 在前端代码找到了获取通讯录的方法,**getContactsList**,简直汉译英 除此之外并没有找到与通讯录相关的方法 为了确定是,可以搜索一下**getContactsList,发现了JavascriptInterface 机制,由此可以确定** > **JavascriptInterface是 Android WebView 提供的一个机制,用来让网页里的 JS 调用 Android 原生代码。** > ### 17.当主上传服务器不可达时,APP会获取备用服务器地址。请分析备用服务器的完整域名和端口 a.b.c:80 雷电敏感信息 url 未发现备用地址,可初步判断 jadx 读不到明文,也可能是拼接。但是按照经验,应该是藏在了Native 层里面 用 ida 打开 so 文件,找到了getBackupEndpoint 字段,证明确实在这 根据加密逻辑,写一个解密脚本 ```python import struct def decrypt_backup_endpoint(): # 加密数据 (0xAB0, 32 bytes) enc = bytes([ 0x73, 0xB9, 0x45, 0x6A, 0xC2, 0xC0, 0x13, 0x12, 0xFF, 0x90, 0x40, 0xC7, 0xE3, 0x6E, 0x3B, 0x57, 0xDD, 0x60, 0xAC, 0xC0, 0x07, 0x03, 0x6F, 0xC7, 0x9D, 0x2A, 0x05, 0x3F, 0x6C, 0xC6, 0x82, 0xB8 ]) # XOR 初始密钥 (0x980, 16 bytes) xor_key = bytes([ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F ]) # XTEA 密钥 (0x990, 4 x uint32) xtea_key = [0xDEADBEEF, 0xCAFEBABE, 0x12345678, 0x9ABCDEF0] data = bytearray(enc) # ========== Stage 1: XOR 解密 ========== # 对齐到 16 字节的块数 aligned_len = len(data) & 0xFFF0 key = bytearray(xor_key) offset = 0 # 16 字节块处理 (NEON SIMD 逻辑的标量等价) while offset < aligned_len: # 取密钥低 4 位 (AND 0x0F) masked_key = bytearray([key[i] & 0x0F for i in range(16)]) # data ^= masked_key; data ^= 0x55 for i in range(16): data[offset + i] = (data[offset + i] ^ masked_key[i]) ^ 0x55 # 密钥递增 0x10 key = bytearray([(key[i] + 0x10) & 0xFF for i in range(16)]) offset += 16 # 剩余字节逐字节处理 for i in range(aligned_len, len(data)): data[i] ^= (i & 0xF) ^ 0x55 print(f"Stage 1 (XOR) result: {data.hex()}") # ========== Stage 2: XTEA 解密 ========== # 初始 sum 值 (来自汇编指令) # W16 = MOV #0x6C40; MOVK #0x8DDE,LSL#16 => 0x8DDE6C40 # W0 = MOV #0xF28F; MOVK #0xEFA6,LSL#16 => 0xEFA6F28F # delta = MOV #0x864F; MOVK #0x61C8,LSL#16 => 0x61C8864F init_sum0 = 0x8DDE6C40 init_sum1 = 0xEFA6F28F delta = 0x61C8864F num_blocks = len(data) // 8 for block_idx in range(num_blocks): base = block_idx * 8 v0 = struct.unpack_from('<I', data, base)[0] v1 = struct.unpack_from('<I', data, base + 4)[0] sum0 = init_sum0 sum1 = init_sum1 for _ in range(64): # v1 -= (((v0<<4 ^ v0>>5) + v0) ^ (sum0 + key[(sum0>>11)&3])) k_idx = (sum0 >> 11) & 3 v1 = (v1 - ((((v0 << 4) ^ (v0 >> 5)) + v0) ^ ((sum0 + xtea_key[k_idx]) & 0xFFFFFFFF))) & 0xFFFFFFFF sum0 = (sum0 + delta) & 0xFFFFFFFF # v0 -= (((v1<<4 ^ v1>>5) + v1) ^ (sum1 + key[sum1&3])) k_idx = sum1 & 3 v0 = (v0 - ((((v1 << 4) ^ (v1 >> 5)) + v1) ^ ((sum1 + xtea_key[k_idx]) & 0xFFFFFFFF))) & 0xFFFFFFFF sum1 = (sum1 + delta) & 0xFFFFFFFF struct.pack_into('<I', data, base, v0) struct.pack_into('<I', data, base + 4, v1) print(f"Stage 2 (XTEA) result: {data.hex()}") # ========== 去除 PKCS 填充 ========== pad_byte = data[-1] if 1 <= pad_byte <= 16 and all(b == pad_byte for b in data[-pad_byte:]): data = data[:-pad_byte] decrypted = data.decode('ascii') print(f"Decrypted: {decrypted}") # 拼接完整 URL url = f"https:// {decrypted}/api/v2" print(f"Backup URL: {url}") return decrypted if __name__ == '__main__': decrypt_backup_endpoint() ``` https://backup.sp-live88.xyz:8443/api/v2 ## 服务器 直接把两个镜像文件放火眼仿真里面,系统选择 linux,可以直接仿真成功 但是进去的时候,是在容器里面,需要ctrl+alt+f2,就可以退出来到主机的终端上。 然后为了方便,下载 ssh 服务 ### 1. 该服务器主机操作系统版本为 cat /etc/os-release Debian GNU/Linux 13 (trixie) ### 2. 根分区UUID findmnt -n -o UUID / 3231e52f-5e15-44c4-b224-e29cb4201c0e ### 3. 该服务器中最新的docker镜像创建时间为 参考格式:2020-01-01T00:00:00.012345678Z】 先看各个 docker 镜像创建时间 docker images --format "table {{.Repository}}\t {{.Tag}}\t {{.ID}}\t {{.CreatedAt}}" docker inspect -f ' {{.Created}}' u22 2026-04-16T07:15:50.535713491Z ### 4. 该服务器根分区快照路径为 btrfs subvolume list / root/history ### 5. 该网站后台管理入口对应的文件名为 在 `/var/www/html/maccms10`目录下,ls 可以一个一个试试,最后是 user.php ### 6. 该网站设置的icp备案号为 在 `/var/www/html/maccms10`目录下递归搜索 grep -r "icp" /var/www/html/maccms10 --include=*.php --include=*.html --include=*.htm --include=*.tpl icp1919810 直接访问服务器 ip ### 7. 该网站设置的主域名为 直接访问服务器 ip,查看源代码 http://www.2026fic.forensix/ ### 8. 该网站分类3中,视频的拼音为 用 winscp 方便看目录下有什么文件以及文件内容. 找到有个数据库,连接一下 在网站可以看到分类三是私拍.... 在表中找一下 sipaanshe ### 9. 该站点设置页面中,被使用的前端模板来自于哪个源文件? 在 config 里面找到模板在 template 里面 在 template 里面找到了 ### 10. 该网站的伪静态规则配置文件sm3值为 知道是 nginx 服务器 在 nginx/下找有 site 文件进去查看 发现相关规则,这个文件就是 计算 sm3 ### 11. 该网站关联的数据库的ip地址为 在这里找到了10.0.3.100 ### 12. 该网站数据库使用了哪一类容器技术 先看了 docker ps,没有符合的 然后查看 ip addr,可以看到数据库的 ip 后面有一些东西,问一下 ai lxc ### 13. 运行在4000端口的备份数据库版本号为 先进入容器中sudo lxc-attach -n mytidb 然后再过滤netstat -ltnp | grep :4000 发现是 tidb-server 然后sudo find / -name "*tidb*" 2>/dev/null 查找整个系统中包含 tidb 的文件 v7.5.0(8.0.11-TiDB-v7.5.0) ### 14. 新注册用户数量最多的日期为 直接再数据库中查询,用其他师傅的 SELECT DATE(FROM_UNIXTIME(user_reg_time)) AS 注册日期, COUNT(*) AS 注册人数 FROM mac_user WHERE user_reg_time IS NOT NULL GROUP BY 注册日期 ORDER BY 注册人数 DESC LIMIT 1; 2026-04-15 ### 15. 马慧美最后一次登录该网站的ip为 直接在 name_user 里面找就行 转化一下就是51.43.21.163 ### 16.以下哪个文件系统未被使用 **A.ntfs** **B.btrfs** **C.xfs** **D.Lvm** 检查块设备及文件系统 lsblk -f 有 lvm,btrfs 再用df -T,看一下。发现 ac 都没有。那就选最对的,a。这个连 linux 系统文件都不属于 **A** ### 17.该服务器安装了以下那些数据库服务 **A.mysql** **B.GuessDB** **C.tidb** **D.postgresql** **E.Mariadb** 先直接尝试看数据库状态,可以初步确定有一个 postgresql 然后前面知道有一个 lxc 容器,先 lxc-attach -n mytidb 进入容器,然后容器名字是 mytidb,猜测有 tidb,输入 systemctl status tidb 也可以测试一下其他的 systemctl status mysql 得等等,发现还有个 mysql **ACD** ## 互联网 ### 1. 售卖卡密的公开群组ID为 不知道为啥在这个文件,也不知道为什么是这串@FIC_2026 问了下 ai ### 2. 备份数据库中视频图片的文件名为 前面说备份数据库是 4000 端口,改一下端口就行 在这里pload/vod/20260415-1/7b3fdd9d464ce48e7f20cd45f918c9a6.jpg ### 3. ngrok提供的域名为 nohup ngrok http 80 > ngrok.log 2>&1 & 用这个命令查看启动了 ngrok 没 顺便知道其进程, kill 6174,杀死进程 然后重新启动 https://blemish-junior-unengaged.ngrok-free.dev ## 二进制程序 ### 1. 分析U盘检材,找到其中保存的加密程序SampleVC.exe,请给出这个exe程序的md5值? 这个直接用火眼分析检材,或者用 ufs。764789DD9C095D74B6B258CF0F7568B2 ### 2. 分析SampleVC.exe,该程序编译的日期可能是什么? 右键在资源管理器中打开, 用 die 打开2026-04-17 13:53:20 ### 3. 分析SampleVC.exe,正确的密码是什么? 用 ida 逆向分析一下,查看主函数,找到主要逻辑函数sub_1400024A0 还需要去sub_140002200 里面 得到密文和 key 写一个解密脚本,得到密码PleaseRunAsAdmin ```python from Crypto.Cipher import AES import struct # AES-128-ECB 密钥: 0123456789ABCDEF0123456789ABCDEF # 来源: v8 = {0x67452301, 0xEFCDAB89, 0x67452301, 0xEFCDAB89} (little-endian DWORD) key = bytes([0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF, 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF]) # 硬编码的密文: Str1 = {-1401439825, 215362084, -1386142476, 1230097010} # 即 0xAC5BEB6F, 0x0CD5F814, 0xAD8D0BB4, 0x49538812 (little-endian) ciphertext = struct.pack('<4i', -1401439825, 215362084, -1386142476, 1230097010) print(f"密文 (hex): {ciphertext.hex()}") # Step 1: AES-128-ECB 解密 cipher = AES.new(key, AES.MODE_ECB) plaintext = cipher.decrypt(ciphertext) print(f"AES 解密结果 (hex): {plaintext.hex()}") # Step 2: 逆预处理 — 每字节 XOR (3*i + 127) # 加密时: a2[i] ^= 2*i + i + 127 即 a2[i] ^= 3*i + 127 # 解密时同样的操作即可还原 (XOR 是自反的) password_bytes = bytes([b ^ ((3 * i + 127) & 0xFF) for i, b in enumerate(plaintext)]) print(f"密码 (hex): {password_bytes.hex()}") print(f"密码: {password_bytes.decode('ascii')}") # 验证: 正向加密确认结果 print("\n--- 验证 ---") verify_input = password_bytes verify_pre = bytes([b ^ ((3 * i + 127) & 0xFF) for i, b in enumerate(verify_input)]) verify_ct = AES.new(key, AES.MODE_ECB).encrypt(verify_pre) print(f"验证密文 (hex): {verify_ct.hex()}") print(f"原始密文 (hex): {ciphertext.hex()}") print(f"匹配: {verify_ct == ciphertext}") ``` ### 4. 分析U盘检材,利用SampleVC.exe解密U盘中被加密的文件,解密后的文件的后缀是什么? 在 winmain 的下一个函数里面,.vhd ### 5. 分析U盘检材,找到被加密的交易记录,统计李安弘虚拟币收款地址钱包总收款金额为 已经知道密码了,记得用管理员身份打开,挂载看一下 发现挂载后没了,根本没看到,可能是自动被删了。 sub_1400027B0 中发现挂载过程,可以看到最后是 remove 被删了 写一个脚本绕过 ```python """ SampleVC.exe 独立解密脚本 用途: 解密加密文件为VHD,不经过挂载和自动删除流程 程序原始流程: 1. 输入密码 → AES验证密码正确性 2. 用密码作为RC4密钥,解密输入文件 → 生成.vhd临时文件 3. 挂载VHD → 读取内容 → 卸载VHD → 删除.vhd文件 (remove()) 本脚本只做步骤1和2,保留.vhd文件不被删除。 """ import sys import os def rc4_decrypt(data: bytes, key: bytes) -> bytes: """标准RC4解密(与加密相同)""" # KSA: Key Scheduling Algorithm S = list(range(256)) j = 0 for i in range(256): j = (j + S[i] + key[i % len(key)]) % 256 S[i], S[j] = S[j], S[i] # PRGA: Pseudo-Random Generation Algorithm i = 0 j = 0 result = bytearray(len(data)) for k in range(len(data)): i = (i + 1) % 256 j = (j + S[i]) % 256 S[i], S[j] = S[j], S[i] result[k] = data[k] ^ S[(S[i] + S[j]) % 256] return bytes(result) def main(): password = "PleaseRunAsAdmin" if len(sys.argv) < 2: print(f"用法: python {sys.argv[0]} <加密文件路径> [输出路径]") print(f"示例: python {sys.argv[0]} secret.dat") print(f" python {sys.argv[0]} secret.dat output.vhd") sys.exit(1) input_path = sys.argv[1] if len(sys.argv) >= 3: output_path = sys.argv[2] else: output_path = input_path + ".vhd" if not os.path.exists(input_path): print(f"错误: 文件不存在 - {input_path}") sys.exit(1) # 密码转UTF-8字节 (与程序中 WideCharToMultiByte CP_UTF8 一致) key = password.encode("utf-8") print(f"密码: {password}") print(f"RC4密钥 (hex): {key.hex()}") print(f"输入文件: {input_path}") print(f"输出文件: {output_path}") # 读取加密文件 with open(input_path, "rb") as f: encrypted_data = f.read() print(f"文件大小: {len(encrypted_data)} 字节") # RC4解密 decrypted_data = rc4_decrypt(encrypted_data, key) # 写入VHD文件 with open(output_path, "wb") as f: f.write(decrypted_data) print(f"解密完成! 已保存到: {output_path}") print(f"提示: 可用 diskpart 或磁盘管理挂载此VHD文件") if __name__ == "__main__": main() ``` 得到 vhd 文件然后挂载, powershell 运行命令 ```powershell diskpart # 进入 diskpart 后执行: select vdisk file="C:\Users\78663\Desktop\vc.vhd" attach vdisk ``` 看挂载出的文件,交易记录,计算一下收款的总金额即可 186948.09