2026FIC预选赛
检材:
百度网盘链接:
https://pan.baidu.com/s/1UV8K7PiakhvYNrTool__YA
提取码:ha86
校验值sha256:
830d0227bd16768648245e1aefe5d6583dd1d077b43b86422
066b198ea169efa
vc密码:FIC-{e404d6e66586e9460c23755afab5a872bcf78ab4}
题目一共53题
pc10题,手机17,服务器17,互联网3,二进制5
计算机部分
- 分析计算机检材,操作系统版本号为【参考格式:1.1】
23.1
分析计算机检材,李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件,其发送用户邮箱为【参考格式:123\@qq.com】
hf13338261292\@outlook.com
分析计算机检材,李安弘电脑中记录的黄金换现金的商家联系方式为【参考格式:110】
13612817854分析计算机检材,推广设计图中的apk下载链接为【参考格式:http:///?\*】
https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing
直接通过RsaCtfTool就可以破解的
python脚本是1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23from Crypto.PublicKey import RSA
pem_data = """-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgFI9zfiZkbbVEaYuqT7hG3P0aIO2Dh4Ts67lLZWZGWn3/9jv7egH
zgXxotNYK6XPPKeK4iXETxJzZ97MX008GXWpgqDzYyL5a59Mag51zRP9zZcnLP1Y
6TpgcZ3EyQtsWv1AWIKIM53jNcx6oM7bVngXHcx5FXlTACQ3foGyZwvpAgMBAAEC
gYAylkGzwQKYa8dHaTxBqUWxtYz0N2/HoGbOFbpMYrf3Lsz5K9wy9VoM3e1CAuIW
Q7sTc6JXiMD6oHIr4Zpdb7JYs0KpWgzHmMrL9k6BKL8IQFUXcBkOXv0DfUlGhNHa
qOcaJWv2f+7t7PYKu7qwFbsNKpKIfOzWUzFUI1oJ5t5J4QJBAJEZazVk2XVWB++v
2RPH87hk945agB8VWWIsGFpDTF7xLlDmT6gQuKdrRZetPFhyyEvgbfxcI74nMRV0
BY6/b6sCQQCRGWs1ZNl1Vgfvr9kTx/O4ZPeOWoAfFVliLBhaQ0xe8S5Q5k+oELin
a0WXrTxYcshL4G38XCO+JzEVdAWOv267AkAscsjwtlAXLZ+IwSmScbIrTmK3bOnK
m9Ohyzg6jlsaym8RwTutlFG8l5Pd/ud5gM/yznFi2Sbp3T+f/salD+e5AkEAhxeM
alzn3cfoga9OQ42Bi6dtmPsHmGkPHEkDr15DB44zWhzkAwz2buGAHLSsn4jWlVZx
8Gh02sCwgVHRLtNqqwJAbDhKoFs3hWE7QKIWK42qCpgaxNaywdmF3Xye9oVksXpH
4Jq1Aq6ayaqscA8SV00TQR/roY1BDuOhaIiqi4hhJw==
-----END RSA PRIVATE KEY-----"""
# 导入 PEM 密钥并提取十进制参数
key = RSA.import_key(pem_data)
print(f"{key.n}")
print(f"{key.d}")
分析计算机检材,李安弘电脑vpn软件开放的代理端口为【参考格式:80】
9527分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为【参考格式:deepseek】
OpenRouter分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为【参考格式:sk-abcd…】
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分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为【参考格式:abcd123232】
zheniyexin@tutanota.com分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是【参考格式:1】
分析计算机检材,李安弘电脑中记录的保险柜密码是【参考格式:123456】
手机部分
分析手机检材,该手机型号为【参考格式:HUAWEIP90】
Redmi Note 7 Pro分析手机检材,李安弘手机计划前往迪拜的日期是【参考格式:20260101】
20260606
注意到用户输入法中存在乘坐飞机\dubai等字样
建立全局搜索
找到2026.06.06 乘坐飞机去 dubai
分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app安装日期为【参考格式:20260101】
20260414分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app,存放聊天数据的数据库为【参考格式:message.db】
wk_9628874a3c6b403593766496fa985893.db
定位到数据存储路径下,可以看到有两个数据库
其中wk_9628874a3c6b403593766496fa985893.db为加密数据库
- 分析手机检材,存放聊天数据的数据库的解密密码为【参考格式:123456】
密码就是9628874a3c6b403593766496fa985893.db - 分析手机检材,李安弘购买云服务器商家的收款备用钱包地址为【参考格式:1】
TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1
分析手机检材,李安弘手机中给网站搭建人员第一次转账的交易hash前6位为【参考格式:1】
26226f分析手机检材,手机中使用的AI软件李安弘主动向AI提问了几次【参考格式:1】
5
- 分析手机检材,李安弘手机使用的AI软件调用本地AI模型及版本为【参考格式:Fic2.6】
Qwen3.5
- 分析手机检材,李安弘曾使用无人机航拍,分析其飞行轨迹,其在哪个县进行飞行【参考格式:平安县】
有一个大疆的,这里套用一下别的佬的脚本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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283#!/usr/bin/env python3
"""
Parse DJI FlightRecord *.txt files without relying on the `djirecord` CLI.
This script uses the pydjirecord Python library directly. That means:
1. You do not need the `djirecord` command in PATH.
2. Header/details JSON works without a DJI API key.
3. Frame exports (GeoJSON / CSV) need a DJI API key for v13/v14 logs.
"""
from __future__ import annotations
import argparse
import csv
import dataclasses
import json
import math
import os
import subprocess
import sys
from datetime import date, datetime, time
from enum import Enum
from pathlib import Path
from typing import Any, Iterable
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Parse DJI FlightRecord files and export details JSON."
)
parser.add_argument(
"inputs",
nargs="+",
help="One or more DJI FlightRecord *.txt files.",
)
parser.add_argument(
"-o",
"--out-dir",
default=".",
help="Output directory. Default: current directory.",
)
parser.add_argument(
"--api-key",
default=None,
help="DJI API key used to decrypt v13/v14 frame data.",
)
parser.add_argument(
"--no-verify",
action="store_true",
help="Disable TLS verification when fetching DJI keychains.",
)
parser.add_argument(
"--geojson",
action="store_true",
help="Also export a GeoJSON track when frame data is available.",
)
parser.add_argument(
"--csv",
action="store_true",
help="Also export a CSV track when frame data is available.",
)
parser.add_argument(
"--print",
dest="print_summary",
action="store_true",
help="Print parsed summary to stdout.",
)
parser.add_argument(
"--install",
action="store_true",
help="If pydjirecord is missing, try to install it with pip first.",
)
return parser.parse_args()
def ensure_pydjirecord(auto_install: bool) -> tuple[Any, Any]:
try:
from pydjirecord import DJILog # type: ignore
from pydjirecord.frame.details import FrameDetails # type: ignore
return DJILog, FrameDetails
except ImportError:
if auto_install:
cmd = [sys.executable, "-m", "pip", "install", "pydjirecord"]
subprocess.run(cmd, check=True)
from pydjirecord import DJILog # type: ignore
from pydjirecord.frame.details import FrameDetails # type: ignore
return DJILog, FrameDetails
raise SystemExit(
"Missing dependency: pydjirecord\n"
"Install one of the following and rerun:\n"
f" {sys.executable} -m pip install pydjirecord\n"
"If your analysis machine is offline, download the wheel on another machine\n"
"and then install it locally with:\n"
f" {sys.executable} -m pip install .\\pydjirecord-*.whl\n"
)
def to_jsonable(value: Any) -> Any:
if dataclasses.is_dataclass(value):
return {k: to_jsonable(v) for k, v in dataclasses.asdict(value).items()}
if isinstance(value, (datetime, date, time)):
return value.isoformat()
if isinstance(value, Enum):
return value.name
if isinstance(value, Path):
return str(value)
if isinstance(value, dict):
return {str(k): to_jsonable(v) for k, v in value.items()}
if isinstance(value, (list, tuple, set)):
return [to_jsonable(v) for v in value]
if hasattr(value, "__dict__"):
return {
k: to_jsonable(v)
for k, v in vars(value).items()
if not k.startswith("_")
}
return value
def valid_coordinate(lat: Any, lon: Any) -> bool:
try:
lat_f = float(lat)
lon_f = float(lon)
except (TypeError, ValueError):
return False
if math.isnan(lat_f) or math.isnan(lon_f):
return False
if lat_f == 0.0 and lon_f == 0.0:
return False
return -90.0 <= lat_f <= 90.0 and -180.0 <= lon_f <= 180.0
def iter_frame_rows(frames: Iterable[Any]) -> list[dict[str, Any]]:
rows: list[dict[str, Any]] = []
for idx, frame in enumerate(frames):
osd = getattr(frame, "osd", None)
if osd is None:
continue
lat = getattr(osd, "latitude", None)
lon = getattr(osd, "longitude", None)
if not valid_coordinate(lat, lon):
continue
rows.append(
{
"index": idx,
"latitude": float(lat),
"longitude": float(lon),
"altitude": getattr(osd, "altitude", None),
"height": getattr(osd, "height", None),
"x_speed": getattr(osd, "x_speed", None),
"y_speed": getattr(osd, "y_speed", None),
"z_speed": getattr(osd, "z_speed", None),
"cumulative_distance": getattr(osd, "cumulative_distance", None),
}
)
return rows
def export_geojson(path: Path, rows: list[dict[str, Any]]) -> None:
coordinates = []
for row in rows:
lon = row["longitude"]
lat = row["latitude"]
alt = row["altitude"]
if alt is None:
coordinates.append([lon, lat])
else:
coordinates.append([lon, lat, alt])
data = {
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {"point_count": len(coordinates)},
"geometry": {
"type": "LineString",
"coordinates": coordinates,
},
}
],
}
path.write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
def export_csv(path: Path, rows: list[dict[str, Any]]) -> None:
fieldnames = [
"index",
"latitude",
"longitude",
"altitude",
"height",
"x_speed",
"y_speed",
"z_speed",
"cumulative_distance",
]
with path.open("w", encoding="utf-8", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
writer.writerows(rows)
def main() -> int:
args = parse_args()
out_dir = Path(args.out_dir)
out_dir.mkdir(parents=True, exist_ok=True)
api_key = args.api_key or os.environ.get("DJI_API_KEY")
DJILog, FrameDetails = ensure_pydjirecord(args.install)
for item in args.inputs:
input_path = Path(item)
if not input_path.is_file():
print(f"[!] File not found: {input_path}", file=sys.stderr)
continue
data = input_path.read_bytes()
log = DJILog.from_bytes(data)
result: dict[str, Any] = {
"version": log.version,
"details": to_jsonable(log.details),
}
frames: list[Any] = []
frame_rows: list[dict[str, Any]] = []
if log.version < 13 or api_key:
try:
keychains = None
if log.version >= 13:
keychains = log.fetch_keychains(api_key, verify=not args.no_verify)
frames = list(log.frames(keychains))
frame_rows = iter_frame_rows(frames)
result["frame_count"] = len(frames)
if frames:
result["details_from_frames"] = to_jsonable(
FrameDetails.from_details(log.details, frames)
)
except Exception as exc: # pragma: no cover - backend/runtime dependent
result["frame_error"] = str(exc)
else:
result["frame_warning"] = (
"Log version >= 13 detected. Header/details are exported, but frame data "
"requires a DJI API key. Re-run with --api-key KEY or set DJI_API_KEY."
)
json_path = out_dir / f"{input_path.stem}.json"
json_path.write_text(
json.dumps(result, ensure_ascii=False, indent=2),
encoding="utf-8",
)
if args.geojson and frame_rows:
export_geojson(out_dir / f"{input_path.stem}.geojson", frame_rows)
if args.csv and frame_rows:
export_csv(out_dir / f"{input_path.stem}.csv", frame_rows)
if args.print_summary:
print(f"=== {input_path.name} ===")
print(json.dumps(result, ensure_ascii=False, indent=2))
return 0
if __name__ == "__main__":
raise SystemExit(main())
- 分析手机检材,李安弘最近安装了一个视频类APP,该APP声明了多个敏感权限用于收集用户隐私。请选择
其中涉及用户隐私的敏感权限。
A. READ_CONTACTS
B. READ_SMS
C. RECEIVE_BOOT_COMPLETED
D. READ_CALL_LOG
E. SEND_SMS
ABD
- 上述APP启动后会加载一个色情网站。请找出该APP当网络不可用时APP加载的本地离线页面路径。 填空题
file:///android_asset/www/index.html
上述APP将非法收集的用户隐私数据上传至远程服务器。上传地址在代码中经过编码处理。请找出编码方
式,还原出完整的上传服务器URL。https://api.sp-live88.com/collect/userdata该APP在本地创建了SQLite数据库存储收集到的用户信息。请分析代码,写出用于存储用户信息的表名
user_collection该APP的assets目录中存在一个加密配置文件config.dat。请解密该文件,写出其中的USDT钱包地址
TXqH7sVn8bR4kL2mN9pW6xJ3cY5dF1gA
可以看出来是aes,需要一个seed解密
找到,然后用ai写一个脚本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
30import hashlib
from Crypto.Cipher import AES
# 1. 替换为你从 strings.xml 中找到的 config_seed 的真实值
config_seed = "hotclub_2026_sec"
# 2. 根据源码逻辑生成 AES 密钥:MD5 32位小写 -> 截取前16位
md5_hash = hashlib.md5(config_seed.encode('utf-8')).hexdigest()
aes_key = md5_hash[:16].encode('utf-8')
print(f"[*] 算出的 AES 密钥: {aes_key.decode('utf-8')}")
# 3. 读取加密的 config.dattry:
with open('config.dat', 'rb') as f:
encrypted_data = f.read()
# 4. 使用 AES/ECB/PKCS5Padding 解密
cipher = AES.new(aes_key, AES.MODE_ECB)
decrypted_padded = cipher.decrypt(encrypted_data)
# 去除 PKCS5Padding padding_len = decrypted_padded[-1]
decrypted_data = decrypted_padded[:-padding_len]
print("[*] 成功解密!配置文件内容如下:")
print("-" * 40)
print(decrypted_data.decode('utf-8'))
print("-" * 40)
except Exception as e:
print(f"[!] 解密出错,请检查 config.dat 文件是否存在或 seed 是否正确: {e}")
结束
该APP前端JS代码可以直接调用Android原生方法获取用户隐私数据。请分析暴露了哪些方法用于获取通
讯录?
getContactsList()当主上传服务器不可达时,APP会获取备用服务器地址。请分析备用服务器的完整域名和端口
backup.sp-live88.xyz:8443
【参考格式:a.b.c:80】
会调用一个security的库
ida启动SHIFT+F10查找关键词,注意到https
果断跟进
注意到有个D14函数,查看可知是个解密函数,,那就好解了
直接双击unk_7EC,拿到密文
甩给ai得到解密脚本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
54import struct
def decrypt_domain(ciphertext_bytes, key_ints):
data = bytearray(ciphertext_bytes)
size = len(data)
# 1. 前置处理:异或混淆
for i in range(size):
data[i] ^= (i & 0xF) ^ 0x55
# 2. XTEA 核心解密 (64轮)
for offset in range(0, size, 8):
if offset + 8 > size: break
v10, v12 = struct.unpack('<II', data[offset:offset + 8])
v11 = -274271601 & 0xFFFFFFFF
v14 = -1914803136 & 0xFFFFFFFF
for _ in range(64):
# 解密 v12 v15 = (key_ints[(v14 >> 11) & 3] + v14) & 0xFFFFFFFF
v14 = (v14 + 1640531535) & 0xFFFFFFFF
v12_sub = ((((v10 << 4) ^ (v10 >> 5)) + v10) ^ v15) & 0xFFFFFFFF
v12 = (v12 - v12_sub) & 0xFFFFFFFF
# 解密 v10 v16 = (key_ints[v11 & 3] + v11) & 0xFFFFFFFF
v11 = (v11 + 1640531535) & 0xFFFFFFFF
v10_sub = (v16 ^ (((v12 << 4) ^ (v12 >> 5)) + v12)) & 0xFFFFFFFF
v10 = (v10 - v10_sub) & 0xFFFFFFFF
struct.pack_into('<II', data, offset, v10, v12)
# 3. 去除 PKCS#7 填充
pad_len = data[-1]
if 0 < pad_len <= size:
domain_bytes = data[:-pad_len]
else:
domain_bytes = data
return domain_bytes.decode('utf-8', errors='ignore')
# ================= 你提取的真实数据 =================
# unk_817: 32字节密文
cipher_hex = "73B9456AC2C01312FF9040C7E36E3B57DD60ACC007036FC79D2A053F6CC682B8"
ciphertext = bytes.fromhex(cipher_hex)
# dword_840: XTEA的四个32位密钥
key_array = [0xDEADBEEF, 0xCAFEBABE, 0x12345678, 0x9ABCDEF0]
# 执行解密
result = decrypt_domain(ciphertext, key_array)
print(f"[*] 恭喜!解密成功的底层API域名是: {result}")
服务器
- 该服务器主机操作系统版本为
【参考格式:0.9】 - 该服务器根分区硬盘的uuid号为
11.00 分
【参考格式:a1b2-c3】 - 该服务器中最新的docker镜像创建时间为
【参考格式:2020-01-01T00:00:00.012345678Z】 - 该服务器根分区快照路径为
【参考格式:/abc/def】 - 该网站后台管理入口对应的文件名为
【参考格式:123.txt】 - 该网站设置的icp备案号为
【参考格式:icp123】 - 该网站设置的主域名为
【参考格式:abc.com】 - 该网站分类3中,视频的拼音为
【参考格式:abc】 - 该站点设置页面中,被使用的前端模板来自于哪个源文件?
【参考格式:abc.def - 该网站的伪静态规则配置文件sm3值为
【参考格式:ABC123】 - 该网站关联的数据库的ip地址为
【参考格式:1.1.1.1】 - 该网站数据库使用了哪一类容器技术
【参考格式:abc】 - 运行在4000端口的备份数据库版本号为
【参考格式:v1.1.1】 - 新注册用户数量最多的日期为
【参考格式:2000/1/1】 - 马慧美最后一次登录该网站的ip为
【参考格式:1.1.1.1】 - 以下哪个文件系统未被使用 12.00 分
A. ntfs
B. btrfs
C. xfs
D. lvm - 该服务器安装了以下那些数据库服务
A. mysql
B. GuessDB
C. tidb
D. postgresql
E. mariadb
互联网 - 售卖卡密的公开群组ID为
【参考格式:@abc123】 - 备份数据库中视频图片的文件名为
【参考格式:abc.png】 - ngrok提供的域名为
【参考格式:a.b.c】
二进制 - 分析u盘检材,找到其中保存的加密程序SampleVC.exe,请给出这个exe程序的md5值?
(答案格式:c4ca4238a0b923820dcc509a6f75849b) - 分析SampleVC.exe,该程序编译的日期可能是什么?
(答案格式:2025-06-06) - 分析SampleVC.exe,正确的密码是什么?
(答案格式:abcdefghABCDEFGH) - 分析u盘检材,利用SampleVC.exe解密U盘中被加密的文件,解密后的文件的后缀是什么?
(答案格式:exe) - 分析u盘检材,找到被加密的交易记录,统计李安弘虚拟币收款地址钱包总收款金额为
【参考格式:1.00】















































