检材:
百度网盘链接:
https://pan.baidu.com/s/1UV8K7PiakhvYNrTool__YA
提取码:ha86
校验值sha256:
830d0227bd16768648245e1aefe5d6583dd1d077b43b86422
066b198ea169efa
vc密码:FIC-{e404d6e66586e9460c23755afab5a872bcf78ab4}

题目一共53题

pc10题,手机17,服务器17,互联网3,二进制5

计算机部分

  1. 分析计算机检材,操作系统版本号为【参考格式:1.1】
    image.png

23.1

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

    hf13338261292\@outlook.com
    image.png

  2. 分析计算机检材,李安弘电脑中记录的黄金换现金的商家联系方式为【参考格式:110】
    13612817854

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

直接通过RsaCtfTool就可以破解的
image.png
image.png
python脚本是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from 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}")

  1. 分析计算机检材,李安弘电脑vpn软件开放的代理端口为【参考格式:80】
    9527
    image.png

  2. 分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为【参考格式:deepseek】
    OpenRouter
    image.png

  3. 分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为【参考格式:sk-abcd…】
    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
    PixPin_2026-05-01_17-24-12.png

  4. 分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为【参考格式:abcd123232】
    image.png
    image.png
    zheniyexin@tutanota.com

  5. 分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是【参考格式:1】

  6. 分析计算机检材,李安弘电脑中记录的保险柜密码是【参考格式:123456】

    手机部分

  7. 分析手机检材,该手机型号为【参考格式:HUAWEIP90】
    Redmi Note 7 Pro
    image.png

  8. 分析手机检材,李安弘手机计划前往迪拜的日期是【参考格式:20260101】
    20260606
    image.png
    注意到用户输入法中存在乘坐飞机\dubai等字样
    image.png

建立全局搜索
image.png
image.png
找到2026.06.06 乘坐飞机去 dubai

  1. 分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app安装日期为【参考格式:20260101】
    20260414
    image.png
    image.png

  2. 分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app,存放聊天数据的数据库为【参考格式:message.db】
    wk_9628874a3c6b403593766496fa985893.db
    定位到数据存储路径下,可以看到有两个数据库

image.png

其中wk_9628874a3c6b403593766496fa985893.db为加密数据库

  1. 分析手机检材,存放聊天数据的数据库的解密密码为【参考格式:123456】
    密码就是9628874a3c6b403593766496fa985893.db
  2. 分析手机检材,李安弘购买云服务器商家的收款备用钱包地址为【参考格式:1】
    TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1
    PixPin_2026-05-01_20-23-58.png
  1. 分析手机检材,李安弘手机中给网站搭建人员第一次转账的交易hash前6位为【参考格式:1】
    26226f
    image.png
    image.png
    image.png

  2. 分析手机检材,手机中使用的AI软件李安弘主动向AI提问了几次【参考格式:1】
    5

    image.png

image.png

  1. 分析手机检材,李安弘手机使用的AI软件调用本地AI模型及版本为【参考格式:Fic2.6】
    Qwen3.5
    image.png
  1. 分析手机检材,李安弘曾使用无人机航拍,分析其飞行轨迹,其在哪个县进行飞行【参考格式:平安县】
    image.png
    有一个大疆的,这里套用一下别的佬的脚本
    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())

image.png

  1. 分析手机检材,李安弘最近安装了一个视频类APP,该APP声明了多个敏感权限用于收集用户隐私。请选择
    其中涉及用户隐私的敏感权限。
    A. READ_CONTACTS
    B. READ_SMS
    C. RECEIVE_BOOT_COMPLETED
    D. READ_CALL_LOG
    E. SEND_SMS

image.png
image.png
ABD

  1. 上述APP启动后会加载一个色情网站。请找出该APP当网络不可用时APP加载的本地离线页面路径。 填空题

file:///android_asset/www/index.html
image.png

  1. 上述APP将非法收集的用户隐私数据上传至远程服务器。上传地址在代码中经过编码处理。请找出编码方
    式,还原出完整的上传服务器URL。
    https://api.sp-live88.com/collect/userdata

    image.png

  2. 该APP在本地创建了SQLite数据库存储收集到的用户信息。请分析代码,写出用于存储用户信息的表名
    user_collection
    image.png

  3. 该APP的assets目录中存在一个加密配置文件config.dat。请解密该文件,写出其中的USDT钱包地址
    TXqH7sVn8bR4kL2mN9pW6xJ3cY5dF1gA
    image.png

可以看出来是aes,需要一个seed解密
image.png
找到,然后用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
import 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}")

image.png
结束

  1. 该APP前端JS代码可以直接调用Android原生方法获取用户隐私数据。请分析暴露了哪些方法用于获取通
    讯录?
    getContactsList()
    image.png

  2. 当主上传服务器不可达时,APP会获取备用服务器地址。请分析备用服务器的完整域名和端口
    backup.sp-live88.xyz:8443
    【参考格式:a.b.c:80】
    image.png

会调用一个security的库
ida启动
image.png
SHIFT+F10查找关键词,注意到https
果断跟进
image.png

image.png
image.png
image.png
注意到有个D14函数,查看可知是个解密函数,,那就好解了
直接双击unk_7EC,拿到密文
image.png
image.png
甩给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
54
import 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}")

image.png

服务器

  1. 该服务器主机操作系统版本为
    【参考格式:0.9】
  2. 该服务器根分区硬盘的uuid号为
    11.00 分
    【参考格式:a1b2-c3】
  3. 该服务器中最新的docker镜像创建时间为
    【参考格式:2020-01-01T00:00:00.012345678Z】
  4. 该服务器根分区快照路径为
    【参考格式:/abc/def】
  5. 该网站后台管理入口对应的文件名为
    【参考格式:123.txt】
  6. 该网站设置的icp备案号为
    【参考格式:icp123】
  7. 该网站设置的主域名为
    【参考格式:abc.com】
  8. 该网站分类3中,视频的拼音为
    【参考格式:abc】
  9. 该站点设置页面中,被使用的前端模板来自于哪个源文件?
    【参考格式:abc.def
  10. 该网站的伪静态规则配置文件sm3值为
    【参考格式:ABC123】
  11. 该网站关联的数据库的ip地址为
    【参考格式:1.1.1.1】
  12. 该网站数据库使用了哪一类容器技术
    【参考格式:abc】
  13. 运行在4000端口的备份数据库版本号为
    【参考格式:v1.1.1】
  14. 新注册用户数量最多的日期为
    【参考格式:2000/1/1】
  15. 马慧美最后一次登录该网站的ip为
    【参考格式:1.1.1.1】
  16. 以下哪个文件系统未被使用 12.00 分
    A. ntfs
    B. btrfs
    C. xfs
    D. lvm
  17. 该服务器安装了以下那些数据库服务
    A. mysql
    B. GuessDB
    C. tidb
    D. postgresql
    E. mariadb
    互联网
  18. 售卖卡密的公开群组ID为
    【参考格式:@abc123】
  19. 备份数据库中视频图片的文件名为
    【参考格式:abc.png】
  20. ngrok提供的域名为
    【参考格式:a.b.c】
    二进制
  21. 分析u盘检材,找到其中保存的加密程序SampleVC.exe,请给出这个exe程序的md5值?
    (答案格式:c4ca4238a0b923820dcc509a6f75849b)
  22. 分析SampleVC.exe,该程序编译的日期可能是什么?
    (答案格式:2025-06-06)
  23. 分析SampleVC.exe,正确的密码是什么?
    (答案格式:abcdefghABCDEFGH)
  24. 分析u盘检材,利用SampleVC.exe解密U盘中被加密的文件,解密后的文件的后缀是什么?
    (答案格式:exe)
  25. 分析u盘检材,找到被加密的交易记录,统计李安弘虚拟币收款地址钱包总收款金额为
    【参考格式:1.00】