前言

185 道题目(9 题未解出)

物联网取证 3、15、17、20、30、31、32、33

服务器取证 24

手机取证

1. 分析黄志远phone.E01检材,黄志远手机总共安装了多少款短视频应用?[答案格式:1]

apk 分析里面,4 个。

2. 分析黄志远phone.E01检材,黄志远手机安装的龙虾应用的包名是什么?[答案格式:com.xxx.ui]

很明显就是这个gptos.intelligence.assistant

3. 接上题,首次打开应用的时间是?[答案格式:2021-01-11-01:11:44]

这个很熟悉了,直接搜索包名,选择 data 目录下的,shared_prefs 文件,里面可以找到

时间戳转化一下1776397998058

2026-04-17-11:53:18

4. 分析黄志远phone.E01检材,黄志远使用此应用攻击过多少台主机?[答案格式:1]

查看包名目录下的文件

挨个翻看并没有发现任何 ip 或者攻击记录等等,所以答案是 0

5. 分析黄志远phone.E01检材,黄志远使用哪款应用控制了其PC的agent工具[答案格式:wechat]

火眼分析出来的这个 discord,查看一下,应该就是

6. 分析黄志远phone.E01检材,黄志远使用这款应用的版本是多少?[答案格式:111.1]

在 apk 分析里面找一下

311.2

7. 分析黄志远phone.E01检材,接上题,登录的用户名是什么?[答案格式:wwww1234]

test901234

8. 分析黄志远phone.E01检材,该应用与pc端agent的配对码是什么?[答案格式:ABC456]

依旧找到 data 目录下的文件,翻一翻

在这里找到了聊天记录

隐藏其他列,复制一下,内容太多。尝试搜索一下 code

第一个搜到的就是 here's your pairing 3EXEQ5R8

9. 分析黄志远phone.E01检材,该应用共对几个ip进行扫描?[答案格式:5]

这个继续在聊天记录里面,先搜索扫描二字,192.168.1.16 192.1681.10,找到了两个

但是bot 始终处于 未配对 / 未执行命令 的状态

后续 bot 只是在 枚举自身命令源码,没有真正跑 nmap或返回端口信息

因此目前还没有完成任何一次有效扫描

扫描的 IP 只有一个:192.168.61.135

从这行命令可以确认(标准的 Kali 渗透测试端口扫描行为)

terminal: "nmap -sS -sV -sC -O -p- -T4 192.168.6..."

10. 分析黄志远phone.E01检材,该应用总共调用了几个暴力破解工具?[答案格式:[1]

两个(都在终端执行的记录这里 )

hydra 爆破密码

Gobuster 目录暴力枚举

11. 分析黄志远phone.E01检材,黄志远使用其内部通联工具进行沟通,其账号的登陆密码是多少? [答案格式:123456]

内部通联工具应该是这个 social_chat_app,因为很多人手机上都有这个,名字也像是

这个题目,先去看了看相关的数据库文件,发现是加密的

shared_prefs 里面有类似数据库的密码,但是不对

Pgs-dbw1776839203359Good

看了其他人手机的检材,偶然看到了这个

仿照格式 s-dbw1776839203359Goo,拿这个试一试成功进去了,可能证明其他人的数据库密码也是这样的

可以看到信息是加密了

这里有用户 id :usr_heiked

密码 hash :fc29eb768c139c05c0bfcb697d9b26d194878a66451b3ab91b202e9710874a63

盐值:a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w

密码就需要爆破了。这里我看格式是纯数字,遵循着由简入难的原则,先试一试 6、7、8 位纯数字

让 ai 写一个脚本,尝试不同哈希拼接方式。

import hashlib
import sys
import time

TARGET_HASH = "fc29eb768c139c05c0bfcb697d9b26d194878a66451b3ab91b202e9710874a63"
SALT = "a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w"

def h(data: bytes) -> str:
    return hashlib.sha256(data).hexdigest()

def d(data: bytes) -> bytes:
    return hashlib.sha256(data).digest()

strategies = [
    ("SHA256(pwd+salt)",           lambda p: h(p.encode() + SALT.encode())),
    ("SHA256(salt+pwd)",           lambda p: h(SALT.encode() + p.encode())),
    ("SHA256(pwd)",                lambda p: h(p.encode())),
    ("SHA256(hex SHA256(pwd+salt))", lambda p: h(h(p.encode()+SALT.encode()).encode())),
    ("SHA256(raw SHA256(pwd+salt))", lambda p: h(d(p.encode()+SALT.encode()))),
    ("SHA256(hex SHA256(salt+pwd))", lambda p: h(h(SALT.encode()+p.encode()).encode())),
    ("SHA256(raw SHA256(salt+pwd))", lambda p: h(d(SALT.encode()+p.encode()))),
    ("MD5(pwd+salt)",              lambda p: hashlib.md5(p.encode()+SALT.encode()).hexdigest()),
    ("MD5(salt+pwd)",              lambda p: hashlib.md5(SALT.encode()+p.encode()).hexdigest()),
]

total_checked = 0
start_time = time.time()

# 从1位到8位依次尝试
digit_lengths = [
    (1, 10),          # 0-9
    (2, 100),         # 00-99
    (3, 1000),        # 000-999
    (4, 10000),       # 0000-9999
    (5, 100000),      # 00000-99999
]

# 已尝试过6位,跳过
digit_lengths.extend([
    (7, 10_000_000),  # 0000000-9999999
])

for digits, total in digit_lengths:
    print(f"\n[*] 正在尝试 {digits} 位数字密码 (0~{10**digits-1})...")
    for pwd_int in range(total):
        password = f"{pwd_int:0{digits}d}"
        for name, hash_func in strategies:
            if hash_func(password) == TARGET_HASH:
                elapsed = time.time() - start_time
                print(f"\n[+] 找到密码!")
                print(f"[+] 策略: {name}")
                print(f"[+] 密码: {password}")
                print(f"[+] 耗时: {elapsed:.2f}秒")
                sys.exit(0)
        total_checked += 1
        if total_checked % 500000 == 0:
            elapsed = time.time() - start_time
            rate = total_checked / elapsed
            print(f"  进度: {total_checked:,} 次, 耗时 {elapsed:.0f}秒, 速度 {rate:.0f} 次/秒", end="\r")
            sys.stdout.flush()

print(f"\n[-] 1-7位数字密码穷举完成,共 {total_checked:,} 次尝试,未找到匹配密码")

# 尝试8位数字
print(f"\n[*] 正在尝试 8 位数字密码...")
for pwd_int in range(100_000_000):
    password = f"{pwd_int:08d}"
    for name, hash_func in strategies:
        if hash_func(password) == TARGET_HASH:
            elapsed = time.time() - start_time
            print(f"\n[+] 找到密码!")
            print(f"[+] 策略: {name}")
            print(f"[+] 密码: {password}")
            print(f"[+] 耗时: {elapsed:.2f}秒")
            sys.exit(0)
    total_checked += 1
    if total_checked % 500000 == 0:
        elapsed = time.time() - start_time
        rate = total_checked / elapsed
        print(f"  进度: {total_checked:,} 次, 耗时 {elapsed:.0f}秒, 速度 {rate:.0f} 次/秒", end="\r")
        sys.stdout.flush()
elapsed = time.time() - start_time
print(f"\n[-] 全部穷举完成,共 {total_checked:,} 次尝试,耗时 {elapsed:.0f}秒,未找到匹配密码")

08164085

12.[答案格式:123456]12.分析黄志远phone.E01检材,黄志远一共发送过几个文件给代号军师的嫌疑人?[答案格式:1]

可以看到这里,黄志远和军师在聊天

看最后俩条黄志远发了 2 个文件

13. 分析方俊朗phone.E01检材,方俊郎手机总共安装了多少款理财应用?[答案格式:1]

4 个

京东金融,股参谋,东方财富,欧易。

最后一个没想到

14. 分析方俊朗phone.E01检材,方俊朗使用筛选优质客户的应用包名是什么?[答案格式:com.xxx.ui]

com.example.predictor

apk取证

1. 分析方俊朗phone.E01检材,筛选优质客户应用将用户查询记录存储在一个加密的本地数据库中。请问该加密数据库的文件名是什么?[答案格式:12_abc.db]

依旧复制包名,找到 data 目录下的 db 文件

social_chat.db

2. 分析方俊朗phone.E01检材,该应用使用了哪种密钥派生算法来生成数据库加密密钥?请写出完整的算法标识名称。[答案格式:DFBDSDFGG123]

用雷电 app 分析一下

发现有壳,脱壳试试

最常见的数据库加密是 KDF

SQLCipher 默认就是 PBKDF2-HMAC-SHA1(密码, salt, 64000, 256bit)

用途

常见KDF

SQLCipher

PBKDF2-HMAC-SHA1 (默认64k迭代)或SHA512(新版)

Jetpack Security (EncryptedFile)

PBKDF2WithHmacSHA1 /SHA256

指纹/锁屏凭证派生

scrypt (较少,多见于自定义)

可以看到是有 sqlcipher 的

搜索一下 kdf

找到了 PBKDF2WithHmacSHA256

3. 分析方俊朗phone.E01检材,该应用的密钥派生过程中使用了多少次迭代运算?[答案格式:345678]

10000

4. 分析方俊朗phone.E01检材,该应用检测动态调试工具时探测了哪个本地端口号?[答案格式:64321]

SecurityManager 类

27042

5. 分析方俊朗phone.E01检材,该应用密钥由多个"盐值片段"拼接后派生而来。请问第一个盐值片段的具体内容是什么?[答案格式:SAltsaltsalt]

第 2 题加密算法那里点进去

有个 getsaltpart1,双击看一下

Pr3d1ct0r

6. 分析方俊朗phone.E01检材,当密钥派生过程出现异常时,应用会使用一个硬编码的备用密钥。请问该备用密钥的完整内容是什么?[答案格式:salt_dlefe_123_dfefaf]

一样的地方

f4ll8ack_k3y_2024_pr3d1ct0r

7. 分析方俊朗phone.E01检材,分析"优质客户预测"应用,该应用的安全检测模块通过检查一个特定的类名来判断设备是否安装了Hook框架。请问被检测的完整类名是什么?[答案格式:ru.foefn.DFeoagn.dfoandf.xoggdg]

在端口下面的代码就是

Xposed 是一个著名的 Android 逆向工程框架,经常用来 hook

isXposedDetected 这个看名字就知道是检测了

8. 分析方俊朗phone.E01检材,该应用在偏好设置文件中存储了一个密钥校验值。请问存储该校验值的键名(key)是什么?[答案格式:ab_dfefegad_cadfeg]

火眼找 data 目录下,发现匹配的

db_integrity_check ,还有之前的迭代次数 10000

可以在 jadx 中搜索确认

9. 分析方俊朗phone.E01检材,该应用加密数据库中存储对话记录的数据表名是什么?[答案格式:liaotian_dfelge]

这个不太会,把 jadx 里的加密代码交给 ai,说还需要 apk SHA - 256 签名

在 jadx 中可以自动提取出来

#! python
# -*- coding: utf-8 -*-

import hashlib
import binascii555555555555555555555555555

# ========================
# 从你截图 & 代码中提取的参数
# ========================

# 1️⃣ 应用签名 SHA-256(来自截图,已去冒号、小写)
SIGNATURE_HASH = (
    "4f030268de5e58c26bb6eec54b1be7c0330dde2bf857ee2b3b26c50b25deb239"
)

# 2️⃣ 三个 Salt(硬编码在 KeyDeriver 中)
SALT_1 = "Pr3d1ct0r"
SALT_2 = "v2.0_release_S@lt"
SALT_3 = "X9kZ!qW3"

# 3️⃣ PBKDF2 参数
PBKDF2_ITERATIONS = 10000
KEY_LENGTH_BITS = 256


def derive_database_key():
    """
    完全复现 KeyDeriver.deriveKey()
    """

    # 拼接 seed(password)
    combined_seed = SIGNATURE_HASH + SALT_1 + SALT_2 + SALT_3

    # PBKDF2-HMAC-SHA256
    key_bytes = hashlib.pbkdf2_hmac(
        hash_name="sha256",
        password=combined_seed.encode("utf-8"),
        salt=SALT_1.encode("utf-8"),
        iterations=PBKDF2_ITERATIONS,
        dklen=KEY_LENGTH_BITS // 8  # 32 bytes
    )

    # 转成 hex(和 bytesToHex 完全一致)
    final_key = binascii.hexlify(key_bytes).decode("utf-8")

    return final_key


if __name__ == "__main__":
    db_key = derive_database_key()

    print("=" * 60)
    print("✅ 数据库加密密钥(HEX)")
    print("=" * 60)
    print(db_key)
    print("=" * 60)

    print("\n📌 使用提示:")
    print("• SQLCipher:")
    print(f"  PRAGMA key = \"x'{db_key}'\";")
    print("• AES-256-CBC:")
    print(f"  Key = {db_key}")

93b16df295656676dd760e6dcfd71623e446b51c91b028ac84c88958fc3ad98b

然后,将加密的数据库文件用 DB Browser for SQLCipher 打开

输入口令即可

chat_records

10. 分析方俊朗phone.E01检材,该应用的密钥生成逻辑,该应用中的第三个盐值片段是通过逐字符拼接生成的。请问该片段拼接后的完整内容是什么?[答案格式:K8m!pQ2x]

这个简单, X9kZ!qW3

11. 分析方俊朗phone.E01检材,该应用使用了载荷在内存中直接加载而不在磁盘落地。若选手希望通过Frida动态拦截明文的DEX字节数组,应该Hook该应用壳的哪个私有方法?[答案格式:loadDexFromMemory]

这个看不懂题...

不过其实可以蒙答案,根据题目要求的是方法,以及格式,可以搜一下 dex

发现有很多匹配的方法,再搜索 dexfrom,就找到了

双击第二个,第一个明显不是、

12. 分析方俊朗phone.E01检材,分析应用的壳代码逻辑,其解密密钥由3个字符串片段混淆拼接而成。请通过静态分析,还原用于解密的3个片段拼接合并后的完整密钥明文。[答案格式:Ab6de_a8bc4d_a5b_345d]

这个就在上一题的代码上面

第一部分

对 U2gzbGxf 解码 base64 得到 Sh3ll_

第二部分

对{93, 33, 112, 117, 34, 99, 78, 90}每个字节异或 17 得到L0ad3r_K

第三部分

"!4202_y3").reverse().toString();

反转!4202_y3 得到3y_2024!

最终结果

Sh3ll_L0ad3r_K3y_2024!

13. 接上题,当选手尝试使用frida-dexdump等通用脱壳工具动态附加时,应用会立刻闪退。请分析该逻辑,写出该线程触发进程自杀所调用的完整Java系统方法签名。[答案格式:abcd.abcd.Abcdabc.abcd]

就在上一题代码上面

显示被检测到自我摧毁,退出

Log.e(TAG, "FATAL: Tracer detected! Self-destructing!");

System.exit(0);

java.lang.System.exit

java.lang是 Java 语言的核心包

所有 Java / Android 程序都自动带它

14. 分析方俊朗phone.E01检材,方俊朗使用其内部通联工具时,共加入过几个群?[答案格式:7]

这个其实在照片可以看出来是俩

15. 分析方俊朗phone.E01检材,方俊朗通过物联网设备漏洞,共获得多少用户信息?[答案格式:10]

这个肯定先看看数据库都有什么(打开方式与密码获取和手机取证那里一样)

浏览聊天记录发现被加密AES-256-CBC(见第 20 题)

让 ai 写一个脚本解密

import base64
import re
from Crypto.Cipher import AES

enc_key_b64 = "bGx3iDfEn4O5kW+2hf0E594C+jcyE1aujg0RIE5DPMM="
enc_iv_b64 = "y1q+/i9a/85OsPry0WMffw=="

key = base64.b64decode(enc_key_b64)
iv = base64.b64decode(enc_iv_b64)

print(f"Key (hex): {key.hex()}")
print(f"IV (hex): {iv.hex()}")
print(f"Key length: {len(key)} bytes")
print(f"IV length: {len(iv)} bytes")
print()

def remove_pkcs7_padding(data):
    if len(data) == 0:
        return data
    padding = data[-1]
    if 1 <= padding <= 16 and all(b == padding for b in data[-padding:]):
        return data[:-padding]
    return data.rstrip(b'\x00').rstrip()

def try_decode_text(data):
    cleaned = remove_pkcs7_padding(data)
    try:
        text = cleaned.decode('utf-8')
        printable_count = sum(1 for c in text if c.isprintable() or c in '\n\r\t')
        if len(text) > 0 and printable_count / len(text) > 0.8:
            return text
    except:
        pass
    return cleaned.hex()

with open('新建 文本文档.txt', 'r', encoding='utf-8') as f:
    encrypted_lines = [line.strip() for line in f if line.strip()]

print(f"共 {len(encrypted_lines)} 行加密数据\n")

with open('decrypted_final.txt', 'w', encoding='utf-8') as out:
    for i, line in enumerate(encrypted_lines, 1):
        try:
            cipher = AES.new(key, AES.MODE_CBC, iv)
            encrypted_data = base64.b64decode(line)
            decrypted = cipher.decrypt(encrypted_data)
            result = try_decode_text(decrypted)
            
            out.write(f"Line {i}: {result}\n")
            
            if i <= 50 or i > 240:
                print(f"Line {i}: {result}")
            elif i == 51:
                print("... (省略中间部分) ...")
                
        except Exception as e:
            error_msg = f"ERROR - {str(e)}"
            out.write(f"Line {i}: {error_msg}\n")
            print(f"Line {i}: {error_msg}")

print(f"\n解密完成!结果已保存到 decrypted_final.txt")
print(f"成功解密 {len(encrypted_lines)} 行数据")

32 个

16. 分析周文杰Image.zip检材,周文杰跟其犯罪团伙人员内部通联工具包名是?[答案格式:com.apt.app]

这个不多说了com.socialchat.social_chat_app

17. 分析周文杰Image.zip检材,内部通联app聊天数据库名称是?[答案格式:abc.db]

不多说social_chat.db

18. 分析周文杰Image.zip检材,内部通联app聊天数据库密码保存在哪个文件中?[答案格式:Abc.txt]

FlutterSharedPreferences.xml

19. 分析周文杰Image.zip检材,周文杰内部通联app聊天数据库密码是?[答案格式:123-abc]

s-dbw1776853545473Goo,解密一下

20. 分析周文杰Image.zip检材,内部通联app聊天数据使用的什么加密算法?[答案格式:ABCDEF]

{"enc_key": "yI0JZciWANMs+bKTuVM+LIjYKPDur2Z11R0X/YwzBA0=", "enc_iv": "ajPN2Pt4zFYG1dl9FrpK4Q=="}通过数据库提供的密钥,密文解码后是 32 字节,iv 解码后是 16 字节

DES/3DES 的 CBC 模式 IV 固定是 8 字节,而这个的 IV 是 16 字节,这与 AES(128位分组)/CBC 模式完全吻合,基本可以排除 DES/3DES。

由此可以确定是 AES-256-CBC(AES)

21. 分析周文杰Image.zip检材,内部通联app用户密码的盐值是?[答案格式:1234abcd]

a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w

22. 分析周文杰Image.zip检材,记录周文杰内部通联app登录密码提示的应用包名是?[答案格式:com.temp.app]

看一下 apk 分析,有个笔记本,看看数据库

看到提示,确定是提示应用com.jinghong.notebookkssjh

23. 分析周文杰Image.zip检材,内部通联app登录密码是?[答案格式:123abc]

上一道题已知密码格式:2 字母+6 数字

密码 hash:5d85b77d7d6d1a76cd589c3ba21d1839b1dd28568e39f1d2facc3a1b7d2e8bcb

salt:a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w

那就可以进行爆破,然后可以先试试手机取证的哈希逻辑——SHA256(hex SHA256(pwd+salt))

让 ai 写一个脚本,发现可以爆破出来

import hashlib
import string
import itertools
from concurrent.futures import ProcessPoolExecutor, as_completed
import multiprocessing
import time

target_hash = "5d85b77d7d6d1a76cd589c3ba21d1839b1dd28568e39f1d2facc3a1b7d2e8bcb"
salt = "a3f8d9c2e1b4h7g6k9m2n5p8q1r4t7w"

def crack_batch(args):
    letter_pairs, target, salt_val = args
    digits = '0123456789'

    for letter_pair in letter_pairs:
        for d1, d2, d3, d4, d5, d6 in itertools.product(digits, repeat=6):
            password = letter_pair + d1 + d2 + d3 + d4 + d5 + d6

            first_hash = hashlib.sha256((password + salt_val).encode()).hexdigest()
            final_hash = hashlib.sha256(first_hash.encode()).hexdigest()

            if final_hash == target:
                return password
    return None

def main():
    letters = string.ascii_letters

    all_letter_pairs = [''.join(combo) for combo in itertools.product(letters, repeat=2)]
    num_workers = multiprocessing.cpu_count()

    total_combinations = len(all_letter_pairs) * 1000000

    print(f"[*] Target hash: {target_hash}")
    print(f"[*] Salt: {salt}")
    print(f"[*] Password format: 2 letters + 6 digits")
    print(f"[*] Total combinations: {total_combinations:,}")
    print(f"[*] Using {num_workers} CPU cores")
    print(f"[*] Starting brute-force...\n")

    chunk_size = max(1, len(all_letter_pairs) // num_workers)
    chunks = []
    for i in range(0, len(all_letter_pairs), chunk_size):
        chunks.append(all_letter_pairs[i:i + chunk_size])

    tasks = [(chunk, target_hash, salt) for chunk in chunks]

    start_time = time.time()
    completed_pairs = 0

    with ProcessPoolExecutor(max_workers=num_workers) as executor:
        future_to_chunk = {executor.submit(crack_batch, task): len(task[0]) for task in tasks}

        for future in as_completed(future_to_chunk):
            chunk_letter_count = future_to_chunk[future]
            completed_pairs += chunk_letter_count
            elapsed = time.time() - start_time
            progress = completed_pairs / len(all_letter_pairs) * 100
            speed = completed_pairs * 1000000 / elapsed if elapsed > 0 else 0
            eta = (len(all_letter_pairs) - completed_pairs) * 1000000 / speed if speed > 0 else 0

            print(f"[*] Progress: {progress:.2f}% | Speed: {speed:,.0f} pwd/s | ETA: {eta:.0f}s", end='\r')

            try:
                result = future.result()
                if result:
                    elapsed = time.time() - start_time
                    print(f"\n\n[+] Password found: {result}")
                    print(f"[+] Time elapsed: {elapsed:.2f}s")
                    first_hash = hashlib.sha256((result + salt).encode()).hexdigest()
                    final_hash = hashlib.sha256(first_hash.encode()).hexdigest()
                    print(f"[+] Hash verification: {final_hash}")
                    print(f"[+] Target hash:       {target_hash}")
                    print(f"[+] Match: {final_hash == target_hash}")
                    return result
            except Exception as e:
                print(f"\n[-] Error: {e}")
    
    elapsed = time.time() - start_time
    print(f"\n\n[-] Password not found after {elapsed:.2f}s")
    return None

if __name__ == "__main__":
    main()

24. 分析周文杰Image.zip检材,周文杰在内部通联app中删除了几条聊天记录?[答案格式:123]

apk 分析里,用雷电 app 打开,同时也把雷电模拟器打开

导入应用数据

选择这个文件夹,显示导入成功

登陆一下

只有和宰相的聊天记录里面有删除,一共六条

25. 分析周文杰Image.zip检材,聊天数据库中,显示聊天数据删除的是哪个字段?[答案格式:ab_cd]

根据题目描述,那肯定实在 message 表里面了,然后我们已知删除的有 6 条

可以对应看一下,是哪个列名

发现这个 1 有六个,那就对应上了

26. 分析林小婉手机检材,发现有个应用隐藏了很多信息,目前已经找到这个应用,它的程序名称是?[答案格式:微信]

给了附件,一个 apk 文件https://www.datacon.org.cn/aa7cb6f3-b43c-46be-ba91-c2eb07b7ee09

用 jadx 打开,看 andriodmainfest.xml,可以看到,名字是今日头条

或者,直接导入雷电 app,自动识别出来是今日头条

27. 分析林小婉手机检材,这个应用有一个安全加密的PIN码,它是多少?[答案格式:12345678]

在雷电的敏感信息里面有相关信息"PIN错误,请重试"

双击去 jadx 查看一下

看到相关代码逻辑,发现判断 verifyPinKotlin isvaild,意思时是否有效,双击verifyPinKotlin 看一下具体逻辑

找到 pin 的相关函数逻辑

- 盐值 (Salt) : "JinriPIN_Salt_"

- 迭代次数 : 10000

- 密钥长度 : 256 位

- 算法 : PBKDF2WithHmacSHA256

- 目标哈希值 : 7e881d49322271f3dd4fa24846a5cc53d1e0506b46007caa4b27f1416b27b54c

但是这样爆破,估计很难出来。找一找有什么其他线索

发现点我的,有提示

可能点了没反应,等一会就行。

提示是女儿生日,那可能就是 4 位数字或者 8 位数字,且是生日,这样就好破解了

让 ai 写一个脚本,爆破看看是不是

import hashlib
import time
from datetime import date

def crack_pin_birthday(target_hash, salt, iterations, key_length):
    """
    爆破生日格式的PIN码 (YYYYMMDD)
    
    参数:
        target_hash: 目标哈希值
        salt: 盐值
        iterations: 迭代次数
        key_length: 密钥长度(字节)
    """
    target_hash_lower = target_hash.lower()
    print(f"[*] 开始爆破生日格式的 PIN 码...")
    print(f"[*] 盐值: {salt}")
    print(f"[*] 迭代次数: {iterations}")
    print(f"[*] 密钥长度: {key_length * 8} 位")
    print(f"[*] 目标哈希: {target_hash}")
    print(f"[*] 密码格式: YYYYMMDD (生日)\n")
    
    total_attempts = 0
    start_time = time.time()
    
    # 生成合理的生日范围:1900年1月1日 到 今天
    today = date.today()
    start_date = date(1900, 1, 1)
    end_date = today
    
    print(f"[*] 日期范围: {start_date.strftime('%Y%m%d')} - {end_date.strftime('%Y%m%d')}")
    total_days = (end_date - start_date).days + 1
    print(f"[*] 总尝试次数: {total_days}\n")
    
    current_date = start_date
    days_count = 0
    
    while current_date <= end_date:
        pin = current_date.strftime('%Y%m%d')
        total_attempts += 1
        days_count += 1
        
        if days_count % 10000 == 0:
            elapsed = time.time() - start_time
            speed = total_attempts / elapsed if elapsed > 0 else 0
            remaining = total_days - days_count
            eta = remaining / speed if speed > 0 else 0
            print(f"[*] 进度: {days_count}/{total_days} ({days_count/total_days*100:.1f}%), "
                  f"当前: {pin}, 速度: {speed:.0f} 次/秒, 预计剩余: {eta:.1f} 秒")
        
        derived_key = hashlib.pbkdf2_hmac(
            'sha256',
            pin.encode('utf-8'),
            salt.encode('utf-8'),
            iterations,
            dklen=key_length
        )
        
        derived_hash = derived_key.hex()
        
        if derived_hash == target_hash_lower:
            elapsed = time.time() - start_time
            print(f"\n[+] 找到 PIN 码: {pin}")
            print(f"[+] 对应日期: {current_date.strftime('%Y年%m月%d日')}")
            print(f"[+] 尝试次数: {total_attempts}")
            print(f"[+] 耗时: {elapsed:.2f} 秒")
            return pin
        
        current_date = current_date.replace(day=current_date.day + 1)
        # 处理日期溢出
        try:
            current_date = date(current_date.year, current_date.month, current_date.day)
        except ValueError:
            # 月末最后一天溢出到下个月
            if current_date.month == 12:
                current_date = date(current_date.year + 1, 1, 1)
            else:
                current_date = date(current_date.year, current_date.month + 1, 1)
    
    elapsed = time.time() - start_time
    print(f"\n[-] 未找到匹配的 PIN 码")
    print(f"[-] 总尝试次数: {total_attempts}")
    print(f"[-] 总耗时: {elapsed:.2f} 秒")
    return None


def crack_pin_birthday_optimized(target_hash, salt, iterations, key_length):
    """
    优化版爆破生日格式的PIN码 (使用timedelta)
    """
    target_hash_lower = target_hash.lower()
    print(f"[*] 开始爆破生日格式的 PIN 码 (优化版)...")
    print(f"[*] 盐值: {salt}")
    print(f"[*] 迭代次数: {iterations}")
    print(f"[*] 密钥长度: {key_length * 8} 位")
    print(f"[*] 目标哈希: {target_hash}")
    print(f"[*] 密码格式: YYYYMMDD (生日)\n")
    
    total_attempts = 0
    start_time = time.time()
    
    today = date.today()
    start_date = date(1900, 1, 1)
    total_days = (today - start_date).days + 1
    
    print(f"[*] 日期范围: {start_date.strftime('%Y%m%d')} - {today.strftime('%Y%m%d')}")
    print(f"[*] 总尝试次数: {total_days}\n")
    
    from datetime import timedelta
    
    for day_offset in range(total_days):
        current_date = start_date + timedelta(days=day_offset)
        pin = current_date.strftime('%Y%m%d')
        total_attempts += 1
        
        if total_attempts % 10000 == 0:
            elapsed = time.time() - start_time
            speed = total_attempts / elapsed if elapsed > 0 else 0
            remaining = total_days - total_attempts
            eta = remaining / speed if speed > 0 else 0
            print(f"[*] 进度: {total_attempts}/{total_days} ({total_attempts/total_days*100:.1f}%), "
                  f"当前: {pin}, 速度: {speed:.0f} 次/秒, 预计剩余: {eta:.1f} 秒")
        
        derived_key = hashlib.pbkdf2_hmac(
            'sha256',
            pin.encode('utf-8'),
            salt.encode('utf-8'),
            iterations,
            dklen=key_length
        )
        
        derived_hash = derived_key.hex()
        
        if derived_hash == target_hash_lower:
            elapsed = time.time() - start_time
            print(f"\n[+] 找到 PIN 码: {pin}")
            print(f"[+] 对应日期: {current_date.strftime('%Y年%m月%d日')}")
            print(f"[+] 尝试次数: {total_attempts}")
            print(f"[+] 耗时: {elapsed:.2f} 秒")
            return pin
    
    elapsed = time.time() - start_time
    print(f"\n[-] 未找到匹配的 PIN 码")
    print(f"[-] 总尝试次数: {total_attempts}")
    print(f"[-] 总耗时: {elapsed:.2f} 秒")
    return None


if __name__ == "__main__":
    SALT = "JinriPIN_Salt_"
    ITERATIONS = 10000
    KEY_LENGTH = 32  # 256位 = 32字节
    TARGET_HASH = "7e881d49322271f3dd4fa24846a5cc53d1e0506b46007caa4b27f1416b27b54c"
    
    result = crack_pin_birthday_optimized(
        target_hash=TARGET_HASH,
        salt=SALT,
        iterations=ITERATIONS,
        key_length=KEY_LENGTH
    )

20150412

28. 分析林小婉手机检材,这个应用隐藏的数据中,每个标签数据里,notes字段表示多少?[答案格式:事项]

发现一个这个文件

让 ai 写一个解密脚本

import hashlib
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import PBKDF2
from Crypto.Hash import HMAC, SHA256

MASTER_SEED = "Jinritoutiao_Master_Key_2024_Secret"
PBKDF2_SALT = "JinriSalt_2024"
PBKDF2_ITERATIONS = 65536

def derive_key():
    key = PBKDF2(
        MASTER_SEED,
        PBKDF2_SALT.encode('utf-8'),
        dkLen=32,
        count=PBKDF2_ITERATIONS,
        hmac_hash_module=SHA256
    )
    return key

def decrypt_vault(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()

    print(f"文件大小: {len(data)} 字节")

    iv = data[6:18]
    hmac_start = len(data) - 32
    tag_start = hmac_start - 16
    tag = data[tag_start:hmac_start]
    ciphertext = data[18:tag_start]

    print(f"IV ({len(iv)} bytes): {iv.hex()}")
    print(f"密文 ({len(ciphertext)} bytes)")
    print(f"Tag ({len(tag)} bytes): {tag.hex()}")
    print(f"HMAC (32 bytes): {data[hmac_start:].hex()}")

    key = derive_key()
    print(f"派生密钥: {key.hex()}")

    aesgcm = AES.new(key, AES.MODE_GCM, nonce=iv)
    aesgcm.update(b"")

    plaintext = aesgcm.decrypt_and_verify(ciphertext, tag)

    return plaintext

if __name__ == "__main__":
    import sys
    sys.stdout.reconfigure(encoding='utf-8')
    file_path = r"c:\Users\78663\Desktop\新建文件夹\apk_extract\assets\vault_data.jth2"
    result = decrypt_vault(file_path)
    json_str = result.decode('utf-8')
    with open(r"c:\Users\78663\Desktop\新建文件夹\apk_extract\decrypted_output.json", 'w', encoding='utf-8') as f:
        f.write(json_str)
    print(f"\n解密成功,已保存到 decrypted_output.json")
    print(f"JSON长度: {len(json_str)} 字符")

得到一个密码和 ip

29. 分析林小婉手机检材,这个应用隐藏的数据中,文件备份服务器的IP地址是多少?[答案格式:192.168.1.1]

"192.168.1.200"见上题

30. 分析林小婉手机检材,发现内部通联中财神撤回了一条消息,这个消息的内容是?[答案格式:盘古石杯。]

这个题就很熟悉了,用密码解开数据库后,用户筛选一下财神,查看后面的列的值有哪个突出

发现是 state_bits 有个是 1

被加密了,查看 user 表,有加密的相关信息

{"enc_key": "kOpoJlwv0/HyhcJkNDUHxtABzZqAl6wjFXPUtzX9aZo=", "enc_iv": "zm0YA3yx57rHy2fYiQm0gg=="}

让 ai 写一个脚本,解密一下

from Crypto.Cipher import AES
from Crypto.Util.Padding import unpad
import base64

key = base64.b64decode("kOpoJlwv0/HyhcJkNDUHxtABzZqAl6wjFXPUtzX9aZo=")
iv  = base64.b64decode("zm0YA3yx57rHy2fYiQm0gg==")
ct  = base64.b64decode("yZkcJsou9vMkGQeq0fTAPrrW2Qrb/9d8IDVTQNYRbBUIB5xgKJ+73szpr/vFyA0aj34wPcH1yJ/+VtycHtc2Tw==")

cipher = AES.new(key, AES.MODE_CBC, iv)
plain = unpad(cipher.decrypt(ct), AES.block_size)
print(plain.decode())

把23年10月到24年6月的账本整理一下,发给我。

31. 分析林小婉手机检材,发现了账本,账本打开密码是什么?[答案格式:按实际填写

DragonTeng@2024#$

见 28 题

物联网取证

CAN ID 与 指令 的对应

正常需要DBC文件或CAN协议定义文件,但是检材里面都没有,所以只能猜测

CAN 总线日志

三个日志文件

powertrain_can.asc(动力总成 CAN)

主要负责发动机、变速箱、加速踏板等动力相关数据。虽然转向助力(EPS)有时会挂载在这里,但通常不是核心的转向控制指令发出地。

body_can.asc(车身 CAN)

负责车门、车窗、空调、灯光、雨刮等车身舒适与控制模块,一般不涉及转向控制。

adas_can.asc(高级驾驶辅助系统 CAN)

ADAS 负责车辆的辅助控制,包括车道保持、自动变道、转向干预等。非驾驶员意图的恶意转向注入,极大概率是通过劫持或伪造 ADAS 系统的指令来实现的

统计一下各个 ID 的频率来判断其指令是什么

CAN ID

对应指令/功能

确定依据

050

车速/电机转速

最高频率周期性广播, 字节值0-15符合速度/转速编码特征

0A0

刹车/油门/转向控制

DLT日志明确指出该ID 有CRC校验错误,属于控制消息

1F4

LKA车道保持/转向辅助

ADAS日志显示LKA请求 转向,1F4在ADAS网络中活跃

2B1

碰撞检测/安全气囊

DLT日志有碰撞检测事件,2B1在各网络均匀分布符合安全系统特征

3C2

雷达传感器数据

频率高且在ADAS网络中 活跃,符合传感器数据特征


交叉印证
050

在adas_can.asc(高级驾驶辅助系统 CAN)里面,后面都是这个,可以判断是必要基础功能,那就是车速之类的

0A0

1702654800.500 CGW ROUT ERR Invalid CRC on msg 0x0A0

这里显示CRC 校验一直不对,很可能是有两个发送源,证明这个很可能就是恶意指令,那根据后面的题目(恶意左转)可以看出来是 0A0 ——控制指令 (刹车/油门/转向等)

1F4

1702654500.221 ADAS CTRL WARN Override Active: LKA requested steer [-45deg]

ADAS 的横向控制请求被覆盖了,LKA 原本想打 -45° 的转向角,但没有被执行。

LKA,即车道保持辅助系统(Lane Keeping Assist),是智能驾驶辅助系统中的重要一员。 其核心作用是在车辆行驶过程中,自动检测车道标线,帮助驾驶员将车辆维持在规定的车道内行驶,避免车辆因驾驶员疏忽、疲劳或者其他原因偏离车道,从而降低因车道偏离而引发的交通事故风险。

在日志文件找一下相近的,ID 是 1F4,可以交叉印证

1. 分析黄志远car.E01检材,事故发生前车辆发生了非驾驶员意图的左转,找出控制车辆异常转向的恶意指令 ID。[答案格式:3B4]

第一个日志文件

先看这个文件,这行 1702655100.001 SYS SAFE FATL COLLISION_DETECTED!!

看起来像是碰撞那种产生的日志,搜一下是什么意思

FATL= Fatal,最高严重等级

COLLISION_DETECTED是车辆 安全系统(SYS / Safety / ACM 气囊控制模块) 产生的一条最高级别事件日志,意思是:车辆系统检测到发生碰撞(或接收到碰撞触发信号)

那就是 0A0

2. 分析黄志远car.E01检材,分析动力总成总线日志,判定驾驶员在碰撞发生前的最后 5 秒内,是否真正尝试了手动踩下制动踏板?若有,请说明判定依据;若无,请提交其加速踏板的百分比数值[答案格式:10%]

1F4(油门/制动信号)的数据载荷为 64 00 00 00 00 00 00 00 ,其中 0x64=100 表示油门踏板踩至100%,后面都是 050,没有任何制动信号 可以判断没有,百分比为 100%

3. 分析黄志远car.E01检材,攻击者通过同频注入压制了原车 ADAS 信号。请在日志中找出证明这是“人为注入攻击”而非“ECU原生故障”的报文频率特征描述。[答案格式:111msg]

4. 分析黄志远car.E01检材,分析动力总成总线日志,确定车辆由于碰撞导致轮速传感器信号彻底消失(归零)的确切时间点(秒)。[答案格式:1.1]

见第二题,120.0

5. 分析黄志远car.E01检材,基于安全通讯协议,部分关键报文需带有 MAC 认证。请找出恶意转向报文中,证明其为非法注入的最直接协议层安全缺陷项。[答案格式:1234]

6. 分析黄志远car.E01检材,逆向分析 ADAS 固件,指出其中隐藏的恶意控制代码被触发所需的最低车速阈值(单位:km/h)。[答案格式:100]

查看 ADAS bin 文件,可以得到 TRIGGER=SPEED>120

120km/h

7. 分析黄志远car.E01检材,事故车辆的发动机控制系统已被黑客篡改。请指出其为了获得超高速动力,在固件中非法解除了哪个速度限制相关的标志?[答案格式:LIVE_TEACH]

查看 engine bin 文件,VMAX_LIMIT:OFF,最大速度限制被 off 了

8. 分析黄志远car.E01检材,固件中存储了用于安全通讯的 Master Key Seed。请通过分析网关固件,提取该 16 位十六进制种子值。[答案格式:1234567890ABCDEF]

gateway bin 文件,MASTER_KEY_SEED:A9B8C7D6E5F40123

9. 分析黄志远car.E01检材,通过分析 BCM 模块导出数据中的 Crash Dump 碎片,还原碰撞发生瞬间,车辆大灯处于什么照明模式?[答案格式:LIVE_LIVE]

查看 BCM bin 文件,LIGHTS=HIGH_BEAM

10. 分析黄志远car.E01检材,取证人员在车机浏览器数据库中发现黑客曾访问一个特定的 GitHub 代码仓库地址。请提交该仓库的名称部分。[答案格式:cache_asdf_efg]

在历史数据库中找到了,staros_root_poc

11. 分析黄志远car.E01检材,T-BOX 系统配置文件已转换,需解密出被黑客覆写的关键远程代理地址的 IP 地址。[答案格式:1.1.1.1]

查看 t-box 配置文件,确实被加密了

不过之前在这里找到了 45.33.22.11

这里也可以找到

12. 分析黄志远car.E01检材,查看系统升级日志。黑客在强制刷入恶意固件时,使用了哪个完整的“强制忽略签名”参数标志?[答案格式:+d devicesid]

在 t-box 的日志文件 updata.log 里面,-f force

13. 分析黄志远car.E01检材,分析蓝牙连接历史,找出在碰撞前几分钟连接成功的可疑设备名称。[答案格式:Forensc_Live_KKK]

在蓝牙数据库文件里面, Diagnostic_Dongle_BLE

14. 分析黄志远car.E01检材,系统的后门程序伪装成系统组件以此维持权限。请填入该 ELF 攻击脚本在 T-BOX 上的完整绝对路径。[答案格式:/home/abc/adc.raw_adc]

根据文件内容,可以判断出是 ELF 文件且有 Connect back to 45.33.22.11 反向连接,不是正常的日志文件,确定是后门程序

/data/local/tmp/syslogd_update

15. 分析黄志远car.E01检材,从 EDR 采样记录中提取出车辆在碰撞瞬间(采样点 0)记录的纵向车速数值(单位:km/h)。[答案格式:100]

16. 分析黄志远car.E01检材,从碰撞前 5 秒采样点中恢复出的纵向车速是多少?[答案格式:100]

17. 分析黄志远car.E01检材,分析 OBD 诊断历史,提取出碰撞瞬时车辆自动记录的冻结帧(Freeze Frame)中的引擎 RPM 数值。[答案格式:100]

2000

18. 分析黄志远car.E01检材,分析 PKE 系统的 RF 日志,找出那把非法克隆生成的 NFC 卡片钥匙所对应的 ID,该 ID 在事发当晚被用于非法侵入。[答案格式:0xAB12]

查看 rf 日志文件

2025-12-15 23:31:05 | KEY_ID: 0x9F8E | ACTION: UNLOCK | METHOD: NFC_CARD | STATE: SUCCESS

0x9F8E

19. 分析黄志远car.E01检材,在行车记录仪元数据中记录了碰撞瞬间的加速度。请指出该元数据完整性校验的状态。[答案格式:TRUE]

FAILED

20 分析黄志远car.E01检材,综合分析所有证据,黑客最终通过哪种方式实现了对车辆 ADAS 固件的非法篡改?[答案格式:加油ABC]

OBD诊断服务接口

21. 分析黄志远car.E01检材,在遥感数据包流量中,黑客在回传 C2 服务器的数据中实时记录了车速。请找出 JSON 载荷中 `speed` 键对应的值。[答案格式:100]

180

22. 分析黄志远car.E01检材,为躲避 IDS 的监控,恶意流量通过 HTTP GET 请求伪装成媒体流请求。请找出该恶意回连所请求的伪装域名(Host)。[答案格式:bing.com]

打开流量包,可以获得如下信息

HOST:streaming.starway.com

指令:systemctl stop sec_monitor

`pkg` 键对应的完整 URL":http://45.33.22.11/malicious.bin

在 Shell 中执行的初始探测指令:id

UID 数值:0

23. 分析黄志远car.E01检材,黑客建立 Reverse Shell 后,执行了哪条指令来强行停止车机底层的安全监护进程?[答案格式:abc.def]

systemctl stop sec_monitor,见 22 题

24. 分析黄志远car.E01检材,黑客通过发送包含固件包地址的 API 请求来下载恶意代码。提交 JSON 载荷中 `pkg` 键对应的完整 URL。[答案格式:http://www.baidu.com/login.html]

http://45.33.22.11/malicious.bin,见 22 题

25. 分析黄志远car.E01检材,黑客为了提权并获取 Root 用户身份,在 Shell 中执行的初始探测指令是什么?[答案格式:kk]

id, 见 22 题

26. 分析黄志远car.E01检材,反向 Shell 成功建立后,返回的权限对应的 UID 数值是多少?[答案格式:100]

0, 见 22 题

27. 分析黄志远car.E01检材,黑客在其利用漏洞上传的 ELF 脚本中,使用了哪个特定的进程名称来伪装成系统日志服务?[答案格式:deadlive_solodata]

syslogd_update ,见 14 题

28. 分析林小碗手表,手表型号是?[答案格式:OPPO WATCH GT 4]

HUAWEI WATCH GT 5

直接用 010 打开就有

29. 分析林小碗手表,发现林小碗实际年龄是多少岁?[答案格式:18]

16,比赛回顾显示对的,但是有师傅解出来是 32

30. 分析林小碗手表,发现林小碗经常外出跑步,主要运动区域是?[答案格式:成都市武侯区]

31. 分析林小碗手表,发现林小碗经常外出跑步,平均跑步几公里?[答案格式:7]

32. 分析林小碗手表,分析林小碗高压力(>70)天数是多少天?[答案格式:10]

33. 分析林小碗手表,分析林小碗平均心率是多少?[答案格式:10]

34. 分析林小碗手表,分析林小碗2024年12月25日在哪里运动?[答案格式:填写室外或者室内]

室外(过程不会)

计算机取证

1. 分析刘洋liuyang_pc.E01检材,提取磁盘镜像SHA1值的前6位?[答案格式:字母小写]

注意题目要求的是磁盘镜像SHA1值,不是镜像文件本身。

源盘 hash5BC41890367E9C79C6B415C922E30BC994BFB351

5bc418

2. 分析刘洋liuyang_pc.E01检材,计算机系统Build版本为?[答案格式:19000]

26100

3. 分析刘洋liuyang_pc.E01检材,计算机最后一次正常关机的时间为?UTC +0[答案格式:2025-05-06-09:00:00]

检材时区是 UTC+8,所以找到的时间需要减去 8 小时

2026-04-21 00:25:35 转化为2026-04-20 16:25:35

4. 分析刘洋liuyang_pc.E01检材,计算机网卡的MAC地址为?[答案格式:00-0B-00-A0-00-00]

00-50-56-30-26-1C

5. 分析刘洋liuyang_pc.E01检材,分析机主是从那里下载的typora?[答案格式:阿里云]

浏览器记录里面,蓝奏云

6. 分析刘洋liuyang_pc.E01检材,刘洋在2026-04-19 13:46:01(UTC +0)曾访问过百度云盘,请给云盘的打开密码?[答案格式:11aa]

仿真一下,记得在这里把手动设置代理关了,自动检测开启,不然连不上网

然后时间要加 8 小时 21:46:01

在浏览器的历史记录里

看 url,48gy

7. 分析刘洋liuyang_pc.E01检材,请给出刘洋管理pve集群所用的端口号?[答案格式:8000]

8006

8. 分析刘洋liuyang_pc.E01检材,请给出刘洋登录理财网站所使用的密码?[答案格式:password]

admin123

9. 分析刘洋liuyang_pc.E01检材,请给出理财网站的IP地址?[答案格式:127.0.0.1]

在历史记录中没有,尝试搜一下 hosts 文件看有没有

192.168.0.70

10. 分析刘洋liuyang_pc.E01检材,请给出计算机内Bitlocker加密分区恢复密钥的前6位?[答案格式:6位数字]

原理:通过内存镜像来解密。

当 BitLocker 加密卷处于"已解锁/已挂载"状态时,解密所需的密钥——卷主密钥(VMK)或全卷加密密钥(FVEK)——会以明文或可直接使用的形式驻留在物理内存(RAM)中,而内存镜像正是把这段包含密钥的内存完整保存下来了。当系统启动完成、BitLocker 卷已解锁(操作系统内核必须将解密的 VMK(进而推导出 FVEK)保留在 RAM 中,否则无法对磁盘进行任何读写操作。

方法一:火眼

解密分区,选择内存镜像解密,上传内存镜像文件,即可解密成功

560615

方法二:EFDD

用 efdd 挂载 pc 镜像,选择被加密分区,内存镜像解密

几秒就好了

方法三:passware kit forensic

解密硬盘

bitlocker

点击解密

等待时间挺长的 19min

11. 分析刘洋liuyang_pc.E01检材,找出VC加密容器的密钥文件,给出该密钥文件的绝对路径?[答案格式:D:\ABC\123\测试.txt]

记得解密分区,在缩略图中可以找到提示

然后在仿真电脑中,解密分区里面有个百度网盘下载的图片,和上面的是一样的

D:\BaiduNetdiskDownload\无标题.png

12. 接上题,该VC加密容器的密钥文件的图像高度是多少像素?[答案格式:1345]

还是有截图提示,1080

13. 分析刘洋liuyang_pc.E01检材,请给出团队重要信息加密保存的软件名?[答案格式:abc123]

这个简单,很多地方都可以看到 1password,很明显是一个加密软件

14. 分析刘洋liuyang_pc.E01检材,该软件的保险库文件名为什么?[答案格式:abc.abc]

题目不是很理解,搜一下 1password 的保险库文件名是什么?

1Password 7 及更早,使用 OPVault 或早期的 Agile Keychain 格式,默认主保险库文件名通常为:

  • 1Password.opvault
  • 1Password.agilekeychain
  • 其他自定义名称的保险库会以你命名的名字 + .opvault.agilekeychain后缀出现

1Password 8

  • Windows%LOCALAPPDATA%\1Password\1password.sqlite
  • macOS~/Library/Group Containers/2BUA8C4S2C.com.1password/Library/Application Support/1Password/Data/1password.sqlite
  • Linux~/.config/1Password/1password.sqlite

貌似是上面那种,那就直接搜索opvault 先看看

找到了liuyang.opvault

或者可以另辟蹊径,看 ico 类型图片

ICO 文件.ico)是 Windows 图标文件格式,全称 Icon File Format,主要用于在 Windows 系统中显示程序图标、快捷方式图标或文件夹图标

直接可以找到保险库的图标

右键回到原始目录,即可

15. 分析刘洋liuyang_pc.E01检材,该软件的保险库文件打开密码是什么?[答案格式:124@password]

在下载记录里面打开压缩包,有注释提醒。密码格式为名字全拼@4位数字

打开下载记录的 1password

需要密码

用 passware kit

将 profile 文件上传,选择自定义密码设置

掩码攻击

开始攻击,成功 liuyang@6419

16. 分析刘洋liuyang_pc.E01检材,请给出用户刘洋的开机密码?[答案格式:p@ssw0rd123]

去仿真的电脑上用密码打开

6yang@2o26

17. 分析刘洋liuyang_pc.E01检材,请给出pve服务器的管理密码?[答案格式:p@ssw0rd123]

右键编辑 pve

pgscup2o@6

18. 分析刘洋liuyang_pc.E01检材,找出计算机内的脚本加密工具,给出该加密工具的SHA1的前6位?[答案格式:字母小写]

回收站里面有个 vc 加密容器的密码

百度网盘下载记录里有一个这个,文件很大,而且从网盘下载也是 vc 加密容器的普遍下载地方

密码 8687f7d845649e03d02d4ff1f36ec952,pim:2026 挂载一下发现并没有脚本加密工具,但有一个交易信息 rar

记得之前获得过一个 vc 密钥文件,卸载加上密钥文件挂载,挂载失败

只用密钥文件和 pim 试试,成功了

计算脚本文件哈希

certutil -hashfile "J:\encrypt_tool.py" SHA1

7860dc

19. 分析刘洋liuyang_pc.E01检材,该脚本加密工具在进行脚本加密时,最后一层是进行什么操作?[答案格式:字符替换]

看一下加密工具的代码,可以看到最后一层是 十六进制转换

20. 分析刘洋liuyang_pc.E01检材,请解密该脚本加密工具加密的文件database.php.obf,给出该文件内的数据库密码?[答案格式:p@ssw0rd123]

根据加密逻辑,让 ai 写一个解密脚本

python -c "
import base64

XOR_KEY = 0x5A
BASE64_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
CUSTOM_TABLE = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/'

with open(r'c:\Users\78663\Desktop\wenjian\database.php.obf', 'r', encoding='utf-8') as f:
    hex_data = f.read().strip()

# Step 1: Hex decode (reverse of step 4)
step3 = bytes.fromhex(hex_data).decode('utf-8')

# Step 2: Reverse char swap (CUSTOM_TABLE -> BASE64_TABLE)
trans = str.maketrans(CUSTOM_TABLE, BASE64_TABLE)
step2 = step3.translate(trans)

# Step 3: Base64 decode (reverse of step 2)
step1 = base64.b64decode(step2).decode('utf-8')

# Step 4: XOR decrypt (reverse of step 1) - XOR is symmetric
result = []
for i, c in enumerate(step1):
    result.append(chr(ord(c) ^ (XOR_KEY + i) % 256))
decrypted = ''.join(result)

print(decrypted)
"

得到密码pgscup@o26

21. 分析刘洋liuyang_pc.E01检材,找出刘洋计算机内的交易信息.rar,给出该文件的打开密码?[答案格式:p@ssw0rd123]

1password 有密码提示

pgscup@4位数字

在之前 vc 第一次挂载的里面有 交易信息.rar 文件

用 passware kit 爆破

pgscup@9541

22. 分析刘洋liuyang_pc.E01检材,找出刘洋计算机内刘桂荣的身份证号码?[答案格式:510657199808071131]

解密交易信息后,里面有很多表格,查看发现身份证信息在 user_real 文件里面

查找 刘桂荣

有三个...?

420100194707075594

420100200106295186

500000196606302245

23. 分析刘洋ly-memdump.mem镜像,给出用户刘洋的NT哈希值?[答案格式:数字字母组合,字母小写]

方法一:美亚的内存分析工具

876dfe7bd78730b7b0baaf451414de8e

部分工具(如 pwdump / SAMInside 离线解析)对 GBK 编码的中文用户名无法正常显示

\xc1\xf5\xd1\x正是"刘洋"二字的 GBK 十六进制

方法二:lovelymem

v3 的 hashdump

876dfe7bd78730b7b0baaf451414de8e

24. 分析刘洋ly-memdump.mem镜像,给出1Password密码管理器的数据库文件名?[答案格式:123ABc.abc]

这个其实,直接分析 pc 镜像也可以得出来1Password10.sqlite

根据大小来看,第一个最可能,第 3 个的名字就不像是。

点进去看一看第一个包含了很多的信息,所以可以确定第一个 db 文件就是。

25. 分析刘洋ly-memdump.mem镜像,1Password在VeraCrypt启动后约多少分钟启动?[答案格式:123]

相差 2 分 15 秒那就是 2 分钟

26. 分析黄志远PC.E01镜像,黄志远使用的ai agent的名称是什么?[答案格式:www]

文件系统直接搜索 agent,在 kali 里面使用了 hermes(知道的可能一眼就看出来)

27. 分析黄志远PC.E01镜像,黄志远使用的模型api后4位是什么?[答案格式:abcd]

题目应该问的是 api-key

在 kali 里的 Hermes的目录下找一找

在这里

数据库的连天记录中有 gioa

28. 请分析黄志远PC.E01镜像中的渗透.rar文件,分析黄志远PC.E01镜像,黄志远总共攻击了多少台主机?[答案格式:123]

打开文件需要密码,有渗透密码文件,里面是很多图片应该是让拼图

可以用拼图的工具,或者写一个脚本

from PIL import Image
import os

# 设置文件夹路径(请修改为你存放这些 patch 的实际路径)
folder_path = r'...\渗透密码' 

# 获取所有文件名并按名称排序(patch_000 到 patch_079)
files = sorted([f for f in os.listdir(folder_path) if f.startswith('patch_')])

if not files:
    print("文件夹里没找到 patch 开头的文件!")
else:
    # 读取第一张小图,获取单张图的宽和高
    first_img = Image.open(os.path.join(folder_path, files[0]))
    width, height = first_img.size
    
    # 计算原图的总尺寸
    # 从截图看是 9 列
    cols = 9 
    rows = len(files) // cols
    
    total_width = cols * width
    total_height = rows * height
    
    # 创建一个新的空白大图
    new_image = Image.new('RGB', (total_width, total_height))
    
    print(f"正在拼接 {len(files)} 张图片,预计尺寸: {total_width}x{total_height}...")
    
    # 逐个粘贴进去
    for index, filename in enumerate(files):
        try:
            img = Image.open(os.path.join(folder_path, filename))
            # 计算这张图应该贴在大图的哪个位置 (x, y)
            x = (index % cols) * width
            y = (index // cols) * height
            new_image.paste(img, (x, y))
        except Exception as e:
            print(f"处理 {filename} 时出错: {e}")
    
    # 保存结果
    new_image.save('restored_image.jpg')
    print("拼接完成!已保存为 restored_image.jpg")

得到图片(只截图一部分)

文字能看出来是"今晚去杀鬼"

解压文件,发现有 16 个 ip

29. 请分析黄志远PC.E01镜像中的渗透.rar文件,反编译exploit二进制文件发现其调用了setuid()、setgid()和system("/bin/bash"),该程序的源文件编译前名称是什么?[答案格式:xxx.c]

用 IDA 打开 exploit,查看反汇编

exploit.c

30. 请分析黄志远PC.E01镜像中的渗透.rar文件,Webshell 功能逻辑研判观察 file_shell.php 的源码,若攻击者请求 ?download=/etc/passwd,程序执行的核心函数是什么?[答案格式:func()]

查看源码

可以看到传入 download 时,会执行 readfile()

31. 请分析黄志远PC.E01镜像中的渗透.rar文件,Nikto扫描结果发现通过发送超长斜杠序列可以探测目录列举漏洞,该漏洞对应的CVE编号是什么?[答案格式:CVE-XXXX-XXXX]

打开第一个主机渗透报告,可以看到Nikto扫描结果保存的地方

查看一下,很明显在超长斜杠后面

CVE-2002-1078

32. 请分析黄志远PC.E01镜像中的渗透.rar文件,SQLite 数据库结构分析在 users 表的定义中,id 字段使用了 AUTOINCREMENT。这意味着什么?[答案格式:SQL_KEYWORD]

PRIMARY_KEY

SQLite 中,AUTOINCREMENT必须配合 PRIMARY_KEY使用,否则会报错。

因此 AUTOINCREMENT意味着 id是一个 PRIMARY_KEY,并且 SQLite 会保证新插入的值严格大于之前出现过的最大值,即使发生回滚也不会重用旧值。

但是答案是AUTOINCREMENT,不知道为什么

搜了一下 AUTOINCREMENT 是 SQLite 关键字,确保 id 自动递增,永不重用已删除的 ID, 与普通 PRIMARY KEY 不同

感觉还是题目描述的有点奇怪

33. 请分析黄志远PC.E01镜像中的渗透.rar文件,Webshell 命令执行参数若要利用 file_shell.php 获取当前系统的用户权限,正确的 URL 参数构造是什么?[答案格式:cmd=xxx]

cmd=id

展示当前 webshell 运行的 用户身份,权限级别(是否为 root / 普通用户)

34. 请分析黄志远PC.E01镜像中的渗透.rar文件,API 端口风险判定8000端口运行的技术组件是什么?[答案格式:XxxYyy]

FastAPI

35. 请分析黄志远PC.E01镜像中的渗透.rar文件,数据库存储安全性评估users 表的密码存储存在什么安全隐患?[答案格式:CVE-XXXX-XXXX]

CVE-2026-0005

36. 请分析黄志远PC.E01镜像中的渗透.rar文件,文件上传漏洞利用条件利用 upload.php 上传漏洞后,攻击者利用 Webshell 前最关键的一步是什么?[答案格式:xxx/]

uploads/

37. 请分析黄志远PC.E01镜像中的渗透.rar文件,根据通讯录管理系统漏洞清单,CVE-2026-0003(无限制文件上传漏洞)的CVSS评分是多少?[答案格式:1.2]

8.8

38. 请分析黄志远PC.E01镜像中的渗透.rar文件,根据file_shell.php源码,文件上传功能使用哪个PHP函数将临时文件移动到目标路径?[答案格式:php_func]

move_uploaded_file

39. 请分析黄志远PC.E01镜像中的渗透.rar文件,Web 目录遍历隐患uploads/ 目录启用目录列表功能通常由哪个组件控制?[答案格式:apache_opt]

在 Apache HTTP Server 中,目录浏览(目录列表/Directory Listing)功能主要由 mod_autoindex模块控制

40. 请分析黄志远PC.E01镜像中的渗透.rar文件,敏感凭据深度关联在 address_book.db 中,管理员密码 Str0ngP@ssw0rd2026! 是什么角色?[答案格式:SQL_DEFAULT]

不清楚问的是什么

表结构显示 role字段 默认值是 'user',那角色可能是 DEFAULT

41. 请分析黄志远PC.E01镜像中的渗透.rar文件,数据规模与风险评估遭受泄露的个人联系人信息条数大约为多少?[答案格式:12345]

15000

42. 请分析黄志远PC.E01镜像中的渗透.rar文件,系统运行权限分析Web服务器运行的用户身份是什么?[答案格式:xxx-xxx]

www-data

43. 请分析黄志远PC.E01镜像中的渗透.rar文件,命令行注入漏洞识别验证 tools.php 命令执行漏洞时,哪个命令返回了uid的值?[答案格式:cmd]

id

44. 请分析黄志远PC.E01镜像中的渗透.rar文件,数据库物理路径获取攻击者通过 generate_data.php 得知数据库在服务器上的绝对物理路径是什么?[答案格式:/xxx/xxx/xxx.db]

/var/www/html/address_book.db

45. 请分析黄志远PC.E01镜像中的渗透.rar文件,Webshell 下载参数逻辑源码中通过设置哪个 Header 实现浏览器自动弹出下载框?[答案格式:Content-xxx]

Content-Disposition

看文件或者报告

46. 请分析黄志远PC.E01镜像中的渗透.rar文件,身份验证策略评估系统中存在的弱密码策略漏洞不包括哪项?[答案格式:user/pass]

我的选项呢?

应该是看选项中哪个不是下图的默认凭证里面的。

答案可能是 admin/Str0ngP@ssw0rd2026!

47. 请分析黄志远PC.E01镜像中的渗透.rar文件,API 环境交互日志价值未授权访问8000端口日志接口,最可能导致哪类敏感信息泄露?[答案格式:/api/xxx]

/api/logs

48. 请分析黄志远PC.E01镜像中的渗透.rar文件,攻击路径逻辑推演攻击者获取持久访问权限的最典型方式是什么?[答案格式:xxx.php]

file_shell.php,感觉题目还是有点怪

49. 请分析黄志远PC.E01镜像中的渗透.rar文件,漏洞 CVE 编号识读被标识为未授权命令执行漏洞的虚拟CVE编号是什么?[答案格式:CVE-XXXX-XXXX]

CVE-2026-0002

50. 请分析黄志远PC.E01镜像中的渗透.rar文件,系统修复优先级研判24小时紧急加固中,哪项不属于立即修复级别?[答案格式:ABC]

依旧选项不知所踪。

不过根据后面的 1 周 1 月,猜测答案是 WAF,API

51. 请分析黄志远PC.E01镜像中的渗透.rar文件,管理员凭据有效性验证利用管理员密码,攻击者在哪个页面时才能生效?[答案格式:xxx.php]

tools.php

52. 请分析黄志远PC.E01镜像中的渗透.rar文件,本系统使用的后端数据库技术是什么?[答案格式:DB_name]

SQLite

53. 请分析黄志远PC.E01镜像中的渗透.rar文件,Webshell 目录处理逻辑文件上传功能中,源码将上传后的文件命名为什么?[答案格式:$_xxx]

$_FILES

54. 请分析黄志远PC.E01镜像中的渗透.rar文件,目标系统运行的 Apache 具体版本号是什么?[答案格式:x.x.xx]

2.4.66

55. 请分析黄志远PC.E01镜像中的渗透.rar文件,根据通讯录管理系统漏洞清单,CVE-2026-0001(敏感信息泄露漏洞)的CVSS评分是多少?[答案格式:1.2]

9.8

56. 请分析黄志远PC.E01镜像中的渗透.rar文件,攻击者最终获取了什么角色的权限?[答案格式:xxx-xxx]

www-data 见 42 题

移动介质取证

含义

偏移

长度

扇区字节数

0xOB

2 字节

每簇扇区数

0xOD

1字节

留扇区数

OxOE

2 字节

FAT表个数

0x10

1字节

艮目录项数(FAT16)

0x11

2字节

总扇区数(小)

0x13

2字节

每FAT扇区数

0x24

4字节(FAT32)

1. 分析方俊朗UDisk.img检材,第一个扇区前3字节的十六进制值是什么?[答案格式:AA-DD-WW]

用 winhex 打开,查看前三个字节 EB-3C-90

2. 分析方俊朗UDisk.img检材,每簇占多少个扇区?[答案格式:2]

每簇占用的扇区数 = 从 DBR 偏移 0x0D 处读取 1 字节(第 14 个字节,从 0 开始数)

常见值:

011 扇区/簇

088 扇区/簇

1016 扇区/簇

2032 扇区/簇

4064 扇区/簇

8 个

3. 分析方俊朗UDisk.img检材,FAT12/16兼容字段"根目录项数"是多少?[答案格式:100]

字段位置

位于 DBR 偏移 0x11–0x12(2 字节,小端存储)。

字段名:Root Entries(根目录项数)。

计算:0x0200=512。

4. 分析方俊朗UDisk.img检材,隐藏扇区数是多少?[答案格式:13]

在 FAT 文件系统(包括 FAT12/16/32)的 DBR(引导扇区)中,隐藏扇区数(Hidden Sectors) 位于偏移 0x1C~0x1F(共 4 个字节,小端序)。(第十四个字节)

Windows/x86 架构使用 小端序(Little Endian),即低位在前,高位在后

应该是 00 00 00 3f = 63

5. 分析方俊朗UDisk.img检材,BPB中声明的总扇区数是多少?[答案格式:100000]

BPB(BIOS Parameter Block,BIOS 参数块)

定位 BPB 位置:在 FAT32 文件系统中,分区的第一个扇区(引导扇区/DOS Boot Record)包含了 BPB 参数表。

找到总扇区数字段:根据 FAT32 规范,BPB 中“总扇区数(32位)”字段位于引导扇区的 偏移 0x20 至 0x23(即第 33 到 36 字节)。

小端序转换:磁盘存储通常采用小端序(Low-Endian),即低位字节在前,高位字节在后。因此需要将这 4 个字节倒序排列解析:

原始数据:80 F0 FA 02

倒序后:02 FA F0 80

转换为十进制:将十六进制 02FAF080转换为十进制数,计算结果正好是 50000000

所以,BPB 中声明的总扇区数就是 50000000。

6. 分析方俊朗UDisk.img检材,每张FAT表占多少个扇区?[答案格式:10000]

FAT32 文件系统中,每张 FAT 表占用的扇区数由 BPB 中的字段 BPB_FATSz32(偏移 0x24–0x27,4 字节) 给出

反转为大端序 00 00 75 30

十六进制转化十进制

28672 + 1280 + 48 = 30000

7. 分析方俊朗UDisk.img检材,真实的根目录起始簇应为多少?[答案格式:3]

主引导扇区(第1扇区)偏移 0x2C (第四十四个字节) 处的 BPB_RootClus值被伪造为 5

但真实的参数需要去备份引导扇区(通常在 LBA 6)中读取

直接跳到第 6 个逻辑扇区(从 0 开始数),然后把该扇区当作普通引导扇区来读字段即可。读 0x2C 处的 4 字节即可得到“真实的根目录起始簇”。

备份扇区里该字段的值为 2。同时按真实参数计算数据区起点后,在 2 号簇位置能正常读到根目录内容,因此真实值是 2

8. 分析方俊朗UDisk.img检材,FSInfo扇区号是多少?[答案格式:1]

DBR 偏移 0x30 ~ 0x31(2 字节,小端)FSInfo 结构所在的逻辑扇区号(LBA)

实际数值为 00 033 号

9. 分析方俊朗UDisk.img检材,备份扇区实际引导扇区号是?[答案格式:2]

在 FAT32 文件系统中,备份引导扇区(Backup Boot Sector)的扇区号由 DBR 偏移 0x32~0x33 处的字段 BPB_BkBootSec(Backup Boot Sector) 指定。

第 1 扇区里写的是 9,但是对比 1,9 显然不是,查看 6 是一样的。

转到 c00(LBA 6)

如何判断备份扇区

LBA 6 开头 EB 58 90 4D 53 44 4F 53 ...

和 LBA 0(主 DBR)完全一致

结尾是 55 AA

偏移 0x1FE

关键字段一致

  • 每扇区字节数
  • 每簇扇区数
  • FAT 表数量
  • 根目录起始簇(0x2C)

这些都和 LBA 0 一致,只是位置不同。

10. 分析方俊朗UDisk.img检材,卷序列号的十六进制值是多少?[答案格式:0x45463]

卷序列号(Volume Serial Number)在 FAT32 的 DBR(引导扇区,LBA 0)中,位于:

偏移:0x43 ~ 0x46(4 字节,小端)

0x12345678

11. 分析方俊朗UDisk.img检材中的视频,进入暗门的密码是多少?[答案格式:123]

11-14 题目都需要看电影(英雄本色)才知道,有些可以直接在网上搜到,或者让 ai 查询

747

看电影的出来

12. 分析方俊朗UDisk.img检材中的视频,主角第一次带货去的国家是?[答案格式:泰国]

印尼

元宝可以做出来

13. 分析方俊朗UDisk.img检材中的视频,阿成乘坐的奔驰车牌号是多少?[答案格式:京A-1234]

DF-8828

好像豆包可以给出来车的照片,根据照片识别出车牌号

14. 分析方俊朗UDisk.img检材中的视频,男主角弟弟上司总共戴过几款领带?[答案格式:5]

这个只能看电影了,3 次

15. 分析方俊朗UDisk.img检材中的表格,出现电话号码最多的后四位是?[答案格式:1234]

找到表格文件

发现数据特别多,用 ai 给的 powershell 脚本计算

$csv = Import-Csv -Path "xxxxxx\_00W.csv" -Encoding UTF8
$csv | Group-Object { $_.电话.Substring($_.电话.Length - 4) } | Sort-Object Count -Descending | Select-Object -First 10 -Property Count, Name

2133

不知道为什么当时 ai 都算错了,就 17 是对的......可能用的模型不一样?这种 ds 做得好

16. 分析方俊朗UDisk.img检材中的表格,平均资产最高的BIN码?[答案格式:123456]

脚本

$csv = Import-Csv -Path "xxxx\_00W.csv" -Encoding UTF8
$csv | Group-Object { $_.银行卡号.Substring(0, 6) } | ForEach-Object {
    [PSCustomObject]@{
        BIN = $_.Name
        Count = $_.Count
        AvgAsset = [Math]::Round(($_.Group | Measure-Object -Property "资产(人民币)" -Average).Average, 2)

622446

17. 分析方俊朗UDisk.img检材中的表格,邮箱字段中出现几种不同的域名?[答案格式:4]

3 个

example.com

example.net

example.org

$csv = Import-Csv -Path "xxxxx\_00W.csv" -Encoding UTF8; ($csv.邮箱 -replace '.*@','' | Sort-Object -Unique).Count

18. 分析方俊朗UDisk.img检材中的表格,男性比女性多出多少人?[答案格式:991]

354 人

$csv = Import-Csv -Path "xxxxxx\_00W.csv" -Encoding UTF8
$male = ($csv | Where-Object { $_.性别 -eq '男' }).Count
$female = ($csv | Where-Object { $_.性别 -eq '女' }).Count
$diff = $male - $female
Write-Host "男性: $male"
Write-Host "女性: $female"
Write-Host "男性比女性多出: $diff"

19. 接上题,按“最后登录时间”的月份(2024-01~2024-12)计算每月近90天活跃率,并给出其变异系数CV=标准差/均值。[答案格式:2.234565]

0.250003

$csv = Import-Csv -Path "xxxxxx\_00W.csv" -Encoding UTF8
$total = $csv.Count
$lastLoginTimes = $csv | ForEach-Object { [DateTime]::Parse($_.最后登录时间) }
$results = @()
for ($month = 1; $month -le 12; $month++) {
    $monthEnd = [DateTime]::Parse("2024-$month-01").AddMonths(1).AddDays(-1)
    $cutoff = $monthEnd.AddDays(-90)
    $active = ($lastLoginTimes | Where-Object { $_ -ge $cutoff -and $_ -le $monthEnd }).Count
    $rate = $active / $total
    $results += $rate
    Write-Host ("2024-{0:D2} 活跃率: {1}" -f $month, $rate)
}
$mean = ($results | Measure-Object -Average).Average
$std = [Math]::Sqrt((($results | ForEach-Object { [Math]::Pow($_ - $mean, 2) }) | Measure-Object -Average).Average)
$cv = $std / $mean
Write-Host ("均值: {0}" -f $mean)
Write-Host ("标准差: {0}" -f $std)
Write-Host ("变异系数CV: {0}" -f $cv)

20. 接上题,做反事实模拟:每位客户信用评分统一+20分(上限900)。统计“由非目标迁入目标”的人数,目标定义为 信用>=700 且 资产>=全体中位数。[答案格式:12345]

36636

$csv = Import-Csv -Path "xxxxxx\_00W.csv" -Encoding UTF8
$total = $csv.Count

$assets = $csv | ForEach-Object { [double]$_.'资产(人民币)' } | Sort-Object
$mid = [Math]::Floor($total / 2)
$medianAsset = if ($total % 2 -eq 0) { ($assets[$mid-1] + $assets[$mid]) / 2.0 } else { $assets[$mid] }

服务器取证

仿真

配置网络

先仿真,两个镜像一个虚拟机,记得选择 NAT 模式

ip a 查看网卡情况

发现 ens160 为 down,而且 vmbr0 也没有 up,不过刚好 子网 ip 对齐了--192.168.0.x

ip link set ens160 up  //启动ens160
dhclient ens160
brctl addif vmbr0 ens160 //将vmbr0绑定到真实网卡上

然后 ip a 再次查看,都 up 了

至此可以 ssh 连接了

ceph 集群

访问 pve web 管理界面 192.168.0.2:8006,发现 ceph 集群未启动

journalctl -u ceph-mon@$(hostname) -n 50 --no-pager

查看服务启动日志,ceph集群之间是用192.168.170.50-52相互访问的,但现在没有这些ip的网卡,所以未激活

最简单的办法就是给 vmbr0 加上这些 ip

# pve-node1 (170.50 → 0.50)
ip addr add192.168.170.50/24 dev vmbr0

# pve-node2 (170.51 → 0.51)
ip addr add192.168.170.51/24 dev vmbr0

# pve-node3 (170.52 → 0.52)
ip addr add192.168.170.52/24 dev vmbr0

查看 ip a,成功了

最后重启,mon 服务

# 在每个节点上启动
systemctl start ceph-mon@$(hostname)
systemctl status ceph-mon@$(hostname)

# 查看集群状态
ceph -s

报错(没有略过)

ceph -s 发现报错

nano /etc/ceph/ceph.conf

查看配置文件

public_network = 192.168.170.50/24

cluster_network = 192.168.170.50/24

改为

public_network = 192.168.170.0/24

cluster_network = 192.168.170.0/24

重启测试

systemctl restart ceph-mon@pve-node1.service && systemctl status ceph-mon@pve-node1.service

好了

其他节点也是要这样,不过我这 node2 与 3 配置没有问题,只有 node1 是这样

然后 ceph -s,成功恢复

VM 100

查看虚拟机的情况

导出虚拟机的存储盘 ,免去嵌套虚拟化以及其他问题

这里借鉴 xd 的 wp

rbd export Ceph_pgscup_pool/vm-100-disk-0 - | gzip > /root/vm-100-disk-0.raw.gz

wp 一句带过,但是我这里命令卡住了

ceph -s 查看情况

奇怪刚开始 osd 三个都 up ,但是一会又 down

组件

状态

说明

mon

正常

3个节点全部在quorum中

osd

不正常

0 up

mgr

未运行

no daemons active

时钟

偏差

clock skew detected on mon.pve-node2

启动 mgr

# 在 node1 上执行
systemctl start ceph-mgr@pve-node1.service
systemctl status ceph-mgr@pve-node1.service

时钟偏差

NTP 源列表是空的 — 没有任何 NTP 服务器在同步时间,这就是时钟偏差的根源。

# ===== 三台节点都执行 =====

# 1. 先关闭自动同步
timedatectl set-ntp false

# 2. 手动统一时间(三台设成一样)
timedatectl set-time "2026-06-03 22:25:00"

# 3. 确认时间一致
date

# 4. 重启 OSD
systemctl reset-failed ceph-osd@*.service 2>/dev/null; systemctl restart ceph-osd@0.service   # node1
systemctl reset-failed ceph-osd@1.service && systemctl restart ceph-osd@1.service           # node2
systemctl reset-failed ceph-osd@2.service && systemctl restart ceph-osd@2.service           # node3        # node3

ceph -s

可以看到degraded objects (18%) — OSD 刚恢复,数据正在自动恢复中

可以导出了

rbd export Ceph_pgscup_pool/vm-100-disk-0 - | gzip > /root/vm-100-disk-0.raw.gz

接下来就是弄出来压缩包

直接终端运行

scp root@192.168.170.50:/root/vm-100-disk-0.raw.gz 目标路径

或 winscp 连一下,直接拖出来

解压,仿真。

1. 分析pve集群,请给出pve主机版本号?[答案格式:1.2.3]

9.11

2. 分析pve集群,请给出pve主机内核版本?[答案格式:1.2.3-123-abc]

6.17.2-1-pve

3. 分析pve集群,请给出pve集群名?[答案格式:abc132]

pgscup2026

4. 分析pve集群,请给出加入集群所用指纹的前6位?[答案格式:AA:BB:CC]

查看集群的加入信息

FD:11:CE

5. 分析pve集群,请给出pve集群中主机所用的时间服务器地址?[答案格式:www.baidu.com]

cat /etc/chrony/chrony.conf

ntp.aliyun.com

6. 分析pve集群,请给Ceph存储的资源池名?[答案格式:Abc_def]

Ceph_pgscup_pool

7. 分析pve集群,请给出Ceph存储资源池的类别?[答案格式:ABC]

RBD

见上题

8. 分析pve集群,请给出Ceph集群的ID的前8位??[答案格式:a1b2c3d4]

ceph fsid

3f28d8bb

9. 分析pve集群,请给出Ceph存储设置的最小副本数?[答案格式:123]

2

ceph osd pool get Ceph_pgscup_pool min_size

10. 分析pve集群,请给出pve集群中虚拟机的快照创建时间?[答案格式:2025-01-11-11:01:01]

2026-04-16-15:05:19

11. 对集群内的服务器进行分析,提取该服务器使用的Linux内核完整版本号?[答案格式:1.2.3-123abc_123]

uname -a

3.10.0-957.el7.x86_64

12. 对集群内的服务器进行分析,提取该服务器SSH服务监听的TCP端口号?[答案格式:123]

22

见仿真

13. 对集群内的服务器进行分析,提取该服务器网卡的IP地址?[答案格式:127.0.0.1]

查看原来的 ip 配置文件

ls /etc/sysconfig/network-scripts

cat ifcfg-eth0

192.168.0.70

14. 对集群内的服务器进行分析,提取金麟资本理财网站对应的域名?[答案格式:baidu.com]

nginx 配置文件找到 jlzb.vip

15. 对集群内的服务器进行分析,服务器中有个加密工具,请给出该工具的名字?[答案格式:abc_def.sh]

encrypt_tool.py

16. 对集群内的服务器进行分析,服务器中加密工具在加密数据库备份文件时使用的密码是什么?[答案格式:ABC@123]

和计算机 19 题有点关系,先查看文件代码

大概意思是

  • 建立临时目录 ( mktemp ),权限设为 700 (仅所有者可访问)
  • 从自身第 44 行开始读取 ,用 gzip -cd 解压到临时文件
  • 执行解压后的内容
  • 5 秒后自动删除临时文件 ,抹去痕迹

那就写一个脚本,解压一下

python -c "
import gzip
with open(r'...\encrypt_tool.py', 'rb') as f:
    lines = f.readlines()
data = b''.join(lines[43:])
result = gzip.decompress(data)
print(result.decode('utf-8'))
"

查看解密文件,发现数据库明文密码 pgscup@o26

17. 对集群内的服务器进行分析,服务器中加密工具第1层加密的XOR密钥是什么?[答案格式:按实际填写]

0x5A

18. 对集群内的服务器进行分析,给出MySQL数据库root用户的密码?[答案格式:abc@123]

见 16,pgscup@o26

19. 对集群内的服务器进行分析,请给出网站后台数据库中存放聊天记录的数据表名字?[答案格式:adb_def]

根据解密后的内容,知道已经删库了,但是生成了备份文件在tmp/ 下

找到已解密的数据库文件backup decrypted

查看一下,是 mysql

导出,用弘连的数据库工具分析,选择 sql 文件

user_chat

20. 对集群内的服务器进行分析,分析网站后台用户密码加密算法中type=0时的初始盐值是什么[答案格式:ABC]

需要找到网站后台代码,可以看到目录/var/www/html/

找一下相关 php,js,py 等文件

ABCDEFG

21. 对集群内的服务器进行应用取证,提取该Laravel应用的APP_KEY值的后8位?[答案格式:英文数字混合字符串]

题目问 key,找一下加密配置文件.env,直接搜索

根据路径可以确定是这个,但是被加密了

看后缀是.obf,跟计算机取证 20 联系起来,解密脚本复用

python -c "
import base64

XOR_KEY = 0x5A
BASE64_TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
CUSTOM_TABLE = 'ZYXWVUTSRQPONMLKJIHGFEDCBAzyxwvutsrqponmlkjihgfedcba9876543210+/'

with open(r'.../.env.obf', 'r', encoding='utf-8') as f:
    hex_data = f.read().strip()

# Step 1: Hex decode (reverse of step 4)
step3 = bytes.fromhex(hex_data).decode('utf-8')

# Step 2: Reverse char swap (CUSTOM_TABLE -> BASE64_TABLE)
trans = str.maketrans(CUSTOM_TABLE, BASE64_TABLE)
step2 = step3.translate(trans)

# Step 3: Base64 decode (reverse of step 2)
step1 = base64.b64decode(step2).decode('utf-8')

# Step 4: XOR decrypt (reverse of step 1) - XOR is symmetric
result = []
for i, c in enumerate(step1):
    result.append(chr(ord(c) ^ (XOR_KEY + i) % 256))
decrypted = ''.join(result)

print(decrypted)
"

otS+rWI=

22. 对集群内的服务器进行取证分析,金麟资本理财网站后台有多少个机器人?[答案格式:123]

3 个

23. 对集群内的服务器进行资金流水取证,提取该平台数据库中聊天记录总数?[答案格式:123]

翻到最后 11494

24. 对集群内的服务器进行数据库取证,提取该平台数据库中注册用户总记录数?[答案格式:123]

21x1000+679=21679

25. 对集群内的服务器进行取证分析,提取平台内用户季丽华的身份证号?[答案格式:18位身份证]

选择数据分析,载入数据,新建查询

SELECT * FROM user_real WHERE name LIKE '%季丽华%';

370100196901274436

26. 对集群内的服务器进行资金流水取证,提取该平台数据库中钱包流水金额第二大的用户名字?[答案格式:张三]

SELECT ur.name, total_amount

FROM (SELECT w.user_id, SUM(w.change) AS total_amount FROM wallet_log w GROUP BY w.user_id) AS t

JOIN user_real ur ON t.user_id = ur.user_id

ORDER BY ABS(t.total_amount) DESC

LIMIT 2;

林斌

27. 对集群内的服务器进行数据库取证,提取该平台法币交易中交易笔数最多的卖家的交易笔数?[答案格式:123]

1727

SELECT seller_id, COUNT(*) as deal_count

FROM legal_deal

GROUP BY seller_id

ORDER BY deal_count DESC

LIMIT 1;

28. 对集群内的服务器进行资金流水取证,提取该平台已完成结算的杠杆交易中保证金总额最多的用户的保证金总额?[答案格式:100.00]

37240.76

SELECT SUM(l.caution_money) AS total_caution

FROM lever_transaction l

WHERE l.status = 3

GROUP BY l.user_id

ORDER BY total_caution DESC

LIMIT 1;

29. 对集群内的服务器进行资金流水取证,提取该平台商家中余额最小的商家的手机号?[答案格式:18036310808]

SELECT id, user_id, name, mobile, seller_balance

FROM seller

ORDER BY seller_balance ASC

LIMIT 1;

不知道为什么出不来。应该是 15860623709

30. 对集群内的服务器进行资金流水取证,提取该平台商家中余额最小的商家的余额?[答案格式:100.0]

10160.70000

SELECT MIN(seller_balance) as min_balance FROM seller;

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐