2026fic

检材密码

FIC-{e404d6e66586e9460c23755afab5a872bcf78ab4}

参考wp

  1. https://www.yuque.com/heguozi-u1swv/fmcbd7/gzzhzhwxnz7z3hnx?singleDoc#juzo2
  2. https://www.cnblogs.com/lyydbk/p/20042661#_label0

计算机

1. 分析计算机检材,操作系统版本号为

答案:23.1

2. 分析计算机检材,李安弘曾收到一份免费领取token的邮件的疑似钓鱼邮件,其发送用户邮箱为

路径:<font style="color:rgba(0, 0, 0, 0.87);">/home/lha/.local/share/deepin/deepin-mail/imap.163.com/lihongan19851024@163.com/imap/42e7eeb9-3108-4536-999d-fb0d42a8b569/mail.eml</font>

答案: hf13338261292@outlook.com

3. 分析计算机检材,李安弘电脑中记录的黄金换现金的商家联系方式

从启动器看,有一个语音记事本

从文件系统看,这应该是系统自带的,所以他的包名有deepin,要到home目录下去找,因为登录的时候是lha用户,而不是root,路径:<font style="color:rgba(0, 0, 0, 0.87);">/home/lha/.local/share/deepin/deepin-voice-note/deepin-voice-note1.0.db</font>

答案:13612817854

4. 分析计算机检材,推广设计图中的apk下载链接为

从邮件里可以直接看到与推广设计有关的邮件

可以看到是有三个附件的

看html文件关于RSA解密,刚好最近密码学课有在学这个,解密脚本是要n和d,看public.txt

通过文件来看,前三行应该是n,最后一行是e

RSA加密算法里,n=p*q,结合github里的加密源码得到q=p+2,让ai写脚本

解密的n和d塞进去解密图片,再扫码下载即可

答案:https://drive.google.com/file/d/1z3aRS-lkaJYKm7Cp1XjtUmVPsOEVW2fV/view?usp=sharing

5. 分析计算机检材,李安弘电脑vpn软件开放的代理端口为

启动应用里看到***,查看***信息得到端口

答案:9527

6. 分析计算机检材,李安弘电脑中AI软件当前使用的模型类型为

仿真在任务栏里看到UOS AI,查看设置就可以知道使用的ai模型

答案:OpenRouter

7. 分析计算机检材,李安弘电脑中AI软件当前使用的模型apiKey为

详细信息里看到apikey并不完整,看对应的数据库,路径:\home\lha\.local\share\deepin\uos-ai-assistant\db\basic

答案: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

8. 分析计算机检材,李安弘电脑中勒索软件提供的解密服务联系方式为

手机的便签里有vc密码9ed2@99y8.com.cn,用这个密码解密pc中的加密分区

解密分区里看到get_token_linux推测这应该是勒索凭证

ida看main_main函数

答案:beijixin996@tutanota.com

9. 分析计算机检材,李安弘电脑中记录的存放黄金的保险柜编号是

在hideen里看到202603121310.mp4,推测这个视频是加密过的

解密脚本

import struct
import sys
import os

KEY = 0x539  # 1337
MARKER = b"stco"


def decrypt_file(input_path: str, output_path: str) -> bool:
    with open(input_path, "rb") as f:
        data = bytearray(f.read())

    found_any = False
    search_start = 0

    while True:
        pos = data.find(MARKER, search_start)
        if pos == -1:
            break

        if pos + 16 > len(data):
            search_start = pos + 4
            continue

        # Read entry count at stco+0x08 (big-endian, NOT encrypted)
        count = struct.unpack(">I", data[pos + 8 : pos + 12])[0]

        # Sanity check: a typical MP4 stco chunk has at most ~100000 entries
        if count == 0 or count > 500000:
            search_start = pos + 4
            continue

        entry_base = pos + 0x0C
        entries_end = entry_base + count * 4

        if entries_end > len(data):
            search_start = pos + 4
            continue

        print(f"[+] Found 'stco' at offset 0x{pos:X}, entry count: {count}")

        for i in range(count):
            offset = entry_base + i * 4
            encrypted = struct.unpack(">I", data[offset : offset + 4])[0]
            decrypted = (encrypted - KEY) & 0xFFFFFFFF
            data[offset : offset + 4] = struct.pack(">I", decrypted)

            if i < 3 or i >= count - 3:
                print(f"    [{i:4d}] offset=0x{offset:X}  enc=0x{encrypted:08X}  dec=0x{decrypted:08X}")

        if count > 6:
            print(f"    ... ({count - 6} entries omitted)")

        found_any = True
        search_start = pos + 4

    if not found_any:
        print(f"[-] No valid 'stco' marker found in {input_path}")
        return False

    with open(output_path, "wb") as f:
        f.write(data)

    print(f"[+] Decrypted file saved to: {output_path}")
    return True


if __name__ == "__main__":
    if len(sys.argv) < 2:
        print(f"Usage: {sys.argv[0]} <encrypted.mp4> [output.mp4]")
        sys.exit(1)

    inpath = sys.argv[1]
    outpath = sys.argv[2] if len(sys.argv) > 2 else inpath + ".decrypted.mp4"

    if not os.path.exists(inpath):
        print(f"[-] File not found: {inpath}")
        sys.exit(1)

    success = decrypt_file(inpath, outpath)
    sys.exit(0 if success else 1)

答案:997546

10. 分析计算机检材,李安弘电脑中记录的保险柜密码是

在zhongyao文件夹下找到et文件保险箱的秘密,另外几个文件均是表格有很多点,推测可能是一种加密

<font style="color:rgba(0, 0, 0, 0.87);">/home/lha/tool</font>下找到execelcrypt.txt,代码扔给ai解释,发现就是加密成点阵

这个et文件是WPS 的 OLE + BIFF + Escher + 内嵌 OOXML 混合结构,让ai读取生成脚本

  解析步骤:
  1. 用 olefile 打开 OLE 容器,读取 Workbook 流
  2. 收集 BIFF MSODRAWING (0x00EC) 记录
  3. 从 Escher 二进制中定位 0xF122 记录,提取内嵌 ZIP 中的 descr 值
  4. 逆向公式:x = (val/1000 XOR 85) - 100, y = (val%1000 XOR 85) - 100
  5. 按 x/25 分组,每组查表匹配字符,拼接成明文
#!/usr/bin/env python3
"""Decrypt .et file steganography - extract hidden text from shape AlternativeText."""

import olefile
import struct
import zipfile
import io
import re
import sys

FONT = {
    '0': [(1,0),(2,0),(0,1),(3,1),(0,2),(3,2),(0,3),(3,3),(1,4),(2,4)],
    '1': [(2,0),(1,1),(2,1),(2,2),(2,3),(1,4),(2,4),(3,4)],
    '2': [(1,0),(2,0),(0,1),(3,1),(2,2),(1,3),(0,4),(1,4),(2,4),(3,4)],
    '3': [(0,0),(1,0),(2,0),(3,1),(1,2),(2,2),(3,3),(0,4),(1,4),(2,4)],
    '4': [(3,0),(2,1),(3,1),(1,2),(3,2),(0,3),(1,3),(2,3),(3,3),(4,3),(3,4)],
    '5': [(0,0),(1,0),(2,0),(0,1),(0,2),(1,2),(2,2),(3,3),(0,4),(1,4),(2,4)],
    '6': [(1,0),(2,0),(0,1),(0,2),(1,2),(2,2),(0,3),(3,3),(1,4),(2,4)],
    '7': [(0,0),(1,0),(2,0),(3,0),(3,1),(2,2),(1,3),(1,4)],
    '8': [(1,0),(2,0),(0,1),(3,1),(1,2),(2,2),(0,3),(3,3),(1,4),(2,4)],
    '9': [(1,0),(2,0),(0,1),(3,1),(1,2),(2,2),(3,2),(3,3),(2,4)],
    'a': [(1,2),(2,2),(3,2),(0,3),(3,3),(1,4),(2,4),(3,4)],
    'b': [(0,0),(0,1),(0,2),(1,2),(2,2),(0,3),(3,3),(0,4),(1,4),(2,4)],
    'c': [(1,0),(2,0),(3,0),(0,1),(0,2),(0,3),(1,4),(2,4),(3,4)],
    'd': [(3,0),(3,1),(1,2),(2,2),(3,2),(0,3),(3,3),(1,4),(2,4),(3,4)],
    'e': [(1,0),(2,0),(0,1),(0,2),(1,2),(2,2),(0,3),(1,4),(2,4)],
    'f': [(1,0),(2,0),(1,1),(0,2),(1,2),(2,2),(1,3),(1,4)],
    'g': [(1,2),(2,2),(3,2),(0,3),(3,3),(1,4),(2,4),(3,4),(3,5),(1,6),(2,6)],
    'h': [(0,0),(0,1),(0,2),(1,2),(2,2),(0,3),(3,3),(0,4),(3,4)],
    'i': [(1,0),(1,2),(1,3),(1,4)],
    'j': [(2,0),(2,2),(2,3),(2,4),(2,5),(1,6),(0,5)],
    'k': [(0,0),(0,1),(0,2),(0,3),(0,4),(2,2),(1,3),(3,3),(2,4)],
    'l': [(1,0),(1,1),(1,2),(1,3),(1,4)],
    'm': [(0,1),(1,1),(2,1),(3,1),(4,1),(0,2),(2,2),(4,2),(0,3),(4,3)],
    'n': [(0,1),(1,0),(2,0),(0,2),(3,2),(0,3),(3,3),(0,4),(3,4)],
    'o': [(1,1),(2,1),(0,2),(3,2),(1,3),(2,3)],
    'p': [(0,2),(1,2),(2,2),(0,3),(3,3),(0,4),(1,4),(2,4),(0,5),(0,6)],
    'q': [(1,2),(2,2),(0,3),(3,2),(3,3),(3,4),(3,5),(4,5)],
    'r': [(0,2),(0,3),(0,4),(1,2),(2,2)],
    's': [(1,0),(2,0),(3,0),(0,1),(1,2),(2,2),(3,3),(0,4),(1,4),(2,4)],
    't': [(1,0),(1,1),(1,2),(1,3),(1,4),(0,2),(2,2)],
    'u': [(0,2),(0,3),(3,2),(3,3),(1,4),(2,4),(3,4)],
    'v': [(0,0),(4,0),(1,2),(3,2),(2,4)],
    'w': [(0,2),(0,3),(1,4),(2,3),(3,4),(4,2),(4,3)],
    'x': [(0,0),(4,0),(1,1),(3,1),(2,2),(1,3),(3,3),(0,4),(4,4)],
    'y': [(0,0),(4,0),(1,1),(3,1),(2,2),(2,3),(1,4)],
    'z': [(0,0),(1,0),(2,0),(3,0),(2,1),(1,2),(0,3),(0,4),(1,4),(2,4),(3,4)],
    ':': [(1,1),(1,3)],
    '@': [(1,0),(2,0),(0,1),(3,1),(0,2),(2,2),(3,2),(0,3),(1,4),(2,4)],
    '.': [(1,4)],
}


def decrypt_et(filepath: str) -> str:
    ole = olefile.OleFileIO(filepath)
    wb = ole.openstream("Workbook").read()

    # Collect MSODRAWING records
    msodata = bytearray()
    pos = 0
    while pos < len(wb) - 4:
        rec_type, rec_size = struct.unpack("<HH", wb[pos : pos + 4])
        if rec_type == 0x00EC:
            msodata.extend(wb[pos + 4 : pos + 4 + rec_size])
        if rec_size > 10000:
            break
        pos += 4 + rec_size

    # Extract descr values from embedded DrawingML XML
    descrs = set()
    offset = 0
    while offset < len(msodata) - 8:
        if msodata[offset + 2 : offset + 4] == b"\x22\xf1":
            dsize = struct.unpack("<I", msodata[offset + 4 : offset + 8])[0]
            if (
                struct.unpack("<H", msodata[offset + 2 : offset + 4])[0] == 0xF122
                and dsize > 1000
            ):
                data = bytes(msodata[offset + 8 : offset + 8 + dsize])
                pk = data.find(b"PK\x03\x04")
                if pk >= 0:
                    try:
                        zf = zipfile.ZipFile(io.BytesIO(data[pk:]))
                        xml = zf.read("drs/shapexml.xml").decode("utf-8", errors="replace")
                        m = re.search(r'descr="(\d+)"', xml)
                        if m:
                            descrs.add(int(m.group(1)))
                    except Exception:
                        pass
        offset += 1

    # Decode: alt_text = ((x+100)^85)*1000 + ((y+100)^85)
    dots = []
    for val in descrs:
        ex = val // 1000
        ey = val % 1000
        x = (ex ^ 85) - 100
        y = (ey ^ 85) - 100
        dots.append((x, y))

    # Group by character index
    chars = {}
    for x, y in dots:
        ci = x // 25
        dx = (x % 25) // 4
        dy = y // 4
        chars.setdefault(ci, set()).add((dx, dy))

    # Match each character
    result = ""
    for ci in sorted(chars.keys()):
        dots_set = chars[ci]
        best_ch, best_diff = "?", 999
        for ch, pattern in FONT.items():
            pset = set(pattern)
            diff = len(dots_set - pset) + len(pset - dots_set)
            if diff < best_diff:
                best_diff, best_ch = diff, ch
        result += best_ch

    return result


def main():
    if len(sys.argv) < 2:
        print(f"Usage: python3 {sys.argv[0]} <file.et>")
        sys.exit(1)
    result = decrypt_et(sys.argv[1])
    print(result)


if __name__ == "__main__":
    main()

答案:583985

手机

1. 分析手机检材,该手机型号为

看雷电手机提取的总结文件

答案:Redmi Note 7 Pro

2. 分析手机检材,李安弘手机计划前往迪拜的日期是

在小米的记事本里,路径:\data\user\0\com.miui.notes\databases\todo.db

答案:20260606

3. 分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app安装日期为

data目录里看到talk,推测是聊天软件

搜索发现是uutalk

确定包名之后,到packages.xml找安装时间ft

答案:20260414

4. 分析手机检材,李安弘手机中与网站搭建人员沟通所使用的app,存放聊天数据的数据库为

db有两个数据库文件,一个可以打开里面并没有聊天信息,另一个可以打开,但是有加密,结合ai分析apk。发现数据库的文件名是wk_+uid的格式,apk要到下载路径去找<font style="color:rgba(0, 0, 0, 0.87);">/storage/emulated/0/Android/data/com.talk.uabchat/files/Download/</font>

同时看到数据库密码是uid

由此解密数据库

答案:wk_9628874a3c6b403593766496fa985893.db

5. 分析手机检材,存放聊天数据的数据库的解密密码为

见上题

答案:9628874a3c6b403593766496fa985893

6. 分析手机检材,李安弘购买云服务器商家的收款备用钱包地址为

在channel表里看到了大日云服务器,再看message发现可以通过channel-id进行筛选

答案:TN8vQzB3n7W5wVca9W4kL2wP7xY9zM5nU1

7. 分析手机检材,李安弘手机中给网站搭建人员第一次转账的交易hash前6位为

聊天记录紧接着的下一条就是图片,顺着路径就是交易图片

答案:26226f

8. 分析手机检材,手机中使用的AI软件李安弘主动向AI提问了几次

应用列表过滤ai得到包名

\com.pocketpalai\pocketpalai.db即可

答案:5

9. 分析手机检材,李安弘手机使用的AI软件调用本地AI模型及版本为

在model文件夹下可以看到

答案:Qwen3.5

10. 分析手机检材,李安弘曾使用无人机航拍,分析其飞行轨迹,其在哪个县进行飞行

11. 分析手机检材,李安弘最近安装了一个视频类APP,该APP声明了多个敏感权限用于收集用户隐私。请选择其中涉及用户隐私的敏感权限。

A. READ_CONTACTS

B. READ_SMS

C. RECEIVE_BOOT_COMPLETED

D. READ_CALL_LOG

E. SEND_SMS

data目录下看到一个有video的包名,app目录下没找到apk文件,联系到上面的aapk是下载下来的,去download里看

答案:ABD

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

结合ai静态分析apk

答案: file:///android_asset/www/index.html

13. 上述APP将非法收集的用户隐私数据上传至远程服务器。上传地址在代码中经过编码处理。请找出编码方式,还原出完整的上传服务器URL

看到上传第一想法就是搜索upload,看到主函数下有,优先看主函数下的

看到contact,userdata解密一下,得到网址发现与上传隐私有关

答案:https://api.sp-live88.com/collect/userdata

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

搜索.db找到对应的文件

看到代码里有sql语句,sql语句创建了user_collection表里面全是用户信息

答案:user_collection

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

搜索config.dat,直接查找到对应的代码,s方法提到对config_seed进行了aes加密,t方法是如何aes加密的详细过程

看到getstring和string知道要到资源文件里去找config_seed,得到config_seed为 hotclub_2026_sec

分析t方法先进行了md5加密,转变为utf-8编码,再取前十六位

答案:TXqH7sVn8bR4kL2mN9pW6xJ3cY5dF1gA

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

看index.html,看到有个contact判断这是获取通讯录

答案:getContactsList()

17. 当主上传服务器不可达时,APP会获取备用服务器地址。请分析备用服务器的完整域名和端口

答案:backup.sp-live88.xyz:8443

服务器

仿真之后进入的是docker,要终端进root,systemctl apt install openssh-server安装ssh,再重启网络服务,修改网卡配置文件,具体细节看上面的参考wp

1.该服务器主机操作系统版本为

cat /etc/os-release

答案:Debian GNU/Linux 13 (trixie)

2.该服务器根分区硬盘的uuid号为

findmnt -no UUID /

答案:3231e52f-5e15-44c4-b224-e29cb4201c0e

3.该服务器中最新的docker镜像创建时间为

先查看所有的docker<font style="color:rgb(96, 98, 102);">docker images -a</font>,发现u22最近创建的,再查看详细信息

答案:2026-04-16T07:15:50.535713491Z

4.该服务器根分区快照路径为

这里问的应该是网站的快照,因为参考wp给的都是/root/history,这是系统的快照。标答应该是网站的快照,路径是/var/www/html/maccms10

如果问的是系统的该怎么做?
1.先df -T / 查看文件系统
2.如果是btrfs,则btrfs subvolume list /
3.zfs则zfs list -t snapshot 
4.ext4/xfs 则看lvs 或 lvdisplay,有 LVM则看lvs(看 origin 列非空就是快照),无 LVM则无原生快照,直接跳到查 Web 路径

答案:/var/www/html/maccms10

5.该网站后台管理入口对应的文件名为

grep查看涉及到后台的文件,发现user.php很可疑,访问发现为登录管理系统的入口

答案:user.php

6.该网站设置的icp备案号为

访问网站即可看到

或者直接grep也可以

答案:icp1919810

7. 该网站设置的主域名为

直接看index.html

答案:www.2026fic.forensix

8.该网站分类3中,视频的拼音为

在database.php里找到连接数据库的对应信息,配置连接信息,通过ssh隧道连接,在mac_vod表里可以看到

答案:sipaanshe

9.该站点设置页面中,被使用的前端模板来自于哪个源文件?

从主配置文件maccms.php 中找到当前启用的模板,发现来自于template/001tep,而001tep下的info.ini文件有着配置的源信息,同时也介绍了这个模板里底是一个什么样到的格式

答案:info.ini

10.该网站的伪静态规则配置文件sm3值为

在说明文档里,看到rewrite说明文件,该服务器使用的是nginx,因此对应的配置文件就是maccms.conf,但是在网站文件目录里并没有这个文件,联想到这是nginx,nginx中 <font style="color:rgb(96, 98, 102);">/etc/nginx/sites-enabled/</font>存放真正的网站启用配置

在该目录下,发现了说明文档给的示例maccms.conf的同样代码,确定这就是配置文件

答案:e73407468e6f52af54c7b14632eeeb9be25b05106d06c4c3085fc843c223793f

11.该网站关联的数据库的ip地址为

在database.php里找到了数据库的配置文件,但是只有名字没有ip,到hosts文件里找

答案:10.0.3.100

12.该网站数据库使用了哪一类容器技术

根据上一题的ip推测可能是LXC,因为10.0.3.0/24 是很多 LXC/LXD 环境的默认私有网段,由 lxdbr0 网桥分配。<font style="color:rgb(96, 98, 102);">ip route</font>查看路由,发现确实是通过lxcbr0分配的,另外两个一个走的网卡,一个走的docker都不是题目所说的数据库

答案:LXC

13.运行在4000端口的备份数据库版本号为

根据数据库配置文件推测是tidb,<font style="color:rgb(96, 98, 102);">mysql -h 10.0.3.100 -P 4000 -u aa -p'123456' --skip-ssl -e "SELECT VERSION();"</font>,注意用tcp直接连接

答案:8.0.11

14.新注册用户数量最多的日期为

SELECT
    FROM_UNIXTIME(user_reg_time, '%Y-%m-%d') AS reg_date,
    COUNT(*) AS user_count
FROM mac_user
WHERE user_reg_time > 0
GROUP BY reg_date
ORDER BY user_count DESC
LIMIT 1;

答案:2026-04-15

15.马慧美最后一次登录该网站的ip为

SELECT
    user_name,
    user_last_login_ip
FROM mac_user
WHERE user_name = 'Ma Hui Mei';

答案:51.43.21.163

16.以下哪个文件系统未被使用

答案:ntfs

17.该服务器安装了以下那些数据库服务

通过进程看是mysql,tidb,postgresql

答案:ACD

互联网

1. 售卖卡密的公开群组ID为

看苹果CMS网站的主配值文件/var/www/html/maccms10/application/extra/maccms.php

答案:FIC_2026

2. 备份数据库中视频图片的文件名为

前面提到备份数据库的端口是4000,所以切换端口尝试连接,连接成功,在mac_vod表里找到视频图片名

答案:7b3fdd9d464ce48e7f20cd45f918c9a6.jpg

3. ngrok提供的域名为

命令<font style="color:rgb(96, 98, 102);">ngrok http 80</font>即可获取,不过报错了,尝试了wp的方法仍然报错,就这样把

答案:blemish-junior-unengaged.ngrok-free.dev

二进制

1. 分析u盘检材,找到其中保存的加密程序SampleVC.exe,请给出这个exe程序的md5值


答案:764789dd9c095d74b6b258cf0f7568b2

2. 分析SampleVC.exe,该程序编译的日期可能是什么?

答案:2026-04-17

3. 分析SampleVC.exe,正确的密码是什么?

在WinMain里看到窗口收到信息,进行处理时会调用sub_1400024A0函数进行处理

在sub_1400024A0函数看到档值为0x2711u,会触发sub_140002200函数,而其他值并没有出现这种情况,很可疑,顺着这个函数往下看

在sub_140002200函数里,看到调用了sub_140001230,其中v6是用户输入的值,v8的值为<font style="color:rgb(31, 31, 31);">01 23 45 67 89 AB CD EF 01 23 45 67 89 AB CD EF</font>,后面还将str1和str2进行了比较,判断str1应该是密文

  lpMultiByteStr = (CHAR *)operator new(0x10u);
  WideCharToMultiByte(0xFDE9u, 0, (LPCWCH)lParam_, -1, lpMultiByteStr, 16, 0, 0);
  *(_QWORD *)&v8 = 0xEFCDAB8967452301uLL;
  v25 = 0;
  *(_OWORD *)Str2 = 0;
  *((_QWORD *)&v8 + 1) = 0xEFCDAB8967452301uLL;
  v20 = 0;
  v21 = 0;
  v9 = 0;
  v22 = 0;
  v23 = 0;
  v24 = 0;
  v6 = (char *)operator new(0x11u);
  *(_OWORD *)v6 = *(_OWORD *)lpMultiByteStr;
  sub_140001230(Str2, v6, &v8);
  *(_DWORD *)Str1 = 0xAC77B9AF;
  n215362084 = 0xCD62A24;
  v12 = 0xAD6124F4;
  n1230097010 = 0x4951CA72;
  v14 = 0;
  if ( !strncmp(Str1, Str2, 0x10u) )
  {
    if ( (unsigned int)sub_140001CF0(lParam, (__int64)lpMultiByteStr) == 1 )
      MessageBoxW(0, &Text, &Caption, 0);
    else
      MessageBoxW(0, &lpText_, &Caption, 0);
  }
  else
  {
    MessageBoxW(0, &lpText__0, &lpCaption_, 0);
  }

结合sub_140001230整体思路是先对输入限制为16字节,再异或,最后aes-128加密,让ai写解密脚本

import struct
from Crypto.Cipher import AES

def solve_new_password():
    # 1. 填入你修改后的四个十六进制硬编码参数
    dw1 = 0xAC77B9AF
    dw2 = 0x0CD62124 # 注意:你给出的第二项少了最高位,这里根据标准Dword或原题补全
    dw2_modified = 0x0CD62A24 # 采用你给出的新值
    dw3 = 0xAD6124F4
    dw4 = 0x4951CA72
    
    # 2. 拼接为小端序二进制流 (最终目标密文 Y)
    target_ciphertext = struct.pack('<IIII', dw1, dw2_modified, dw3, dw4)
    print(f"[*] 当前新目标密文 (Str1): {target_ciphertext.hex().upper()}")

    # 3. 准备 AES-128 密钥 (v8)
    aes_key = struct.pack('<QQ', 0xEFCDAB8967452301, 0xEFCDAB8967452301)

    # 4. 逆向第一步:标准 AES-128 ECB 解密得到中间体 M
    cipher = AES.new(aes_key, AES.MODE_ECB)
    middle_m = cipher.decrypt(target_ciphertext)
    print(f"[*] 当前解密后的中间体 (M): {middle_m.hex().upper()}")

    # 5. 逆向第二步:剥离前置混淆层 (M[i] ^ (3 * i + 127))
    real_password = ""
    for i in range(16):
        magic_byte = (3 * i + 127) & 0xFF
        real_char = middle_m[i] ^ magic_byte
        real_password += chr(real_char)

    print("-" * 50)
    print(f"[+] 针对新代码推导出的正确密码为: {real_password}")
    print("-" * 50)

if __name__ == "__main__":
    solve_new_password()

答案:PleaseRunAsAdmin

4. 分析u盘检材,利用SampleVC.exe解密U盘中被加密的文件,解密后的文件的后缀是什么?

在sub_140001CF0函数里可以看到加密文件后缀为vhd

答案:vhd

5. 分析u盘检材,找到被加密的交易记录,统计李安弘虚拟币收款地址钱包总收款金额为

解密脚本

import os
import sys
from Crypto.Cipher import ARC4

def decrypt_evidence_file():
    # =================【用户配置区】=================
    # 1. 题目给你的那个“加密文件”的真实名称(请根据实际情况修改)
    encrypted_filename = "source_file" 
    
    # 2. 解密后输出的标准 VHD 虚拟磁盘文件名
    output_filename = "extracted_evidence.vhd"
    
    # 3. 我们在前面静态分析推导出的核心明文密钥
    # (如果是你后面修改过的十六进制版本,请在此替换为计算出的对应新密码)
    key = b"PleaseRunAsAdmin"
    # ===============================================

    # 检查加密源文件是否存在
    if not os.path.exists(encrypted_filename):
        print(f"[-] 错误:在当前目录下未找到加密文件 '{encrypted_filename}'!")
        print("[*] 请修改脚本中的 'encrypted_filename' 变量为你的真实文件名。")
        return

    file_size = os.path.getsize(encrypted_filename)
    print(f"[*] 成功锁定加密文件: {encrypted_filename} ({file_size / (1024*1024):.2f} MB)")
    print(f"[*] 正在初始化 RC4 解密引擎,使用密钥: {key.decode('utf-8', errors='ignore')}")
    print(f"[*] 对应解密逻辑:对应 exe 内部的 sub_140001CF0 函数流程")
    print("-" * 60)

    try:
        # 初始化标准 RC4(即 ARC4)解密器
        cipher = ARC4.new(key)
        
        # 采用分块读取机制(每次 4096 字节,完美同步 C++ 代码中的 fread(Buffer, 1u, 0x1000u, Stream))
        chunk_size = 4096
        bytes_processed = 0

        with open(encrypted_filename, "rb") as f_in, open(output_filename, "wb") as f_out:
            while True:
                chunk = f_in.read(chunk_size)
                if not chunk:
                    break
                
                # 执行逐块流解密
                decrypted_chunk = cipher.decrypt(chunk)
                f_out.write(decrypted_chunk)
                
                # 打印简易进度条
                bytes_processed += len(chunk)
                progress = (bytes_processed / file_size) * 100
                sys.stdout.write(f"\r[+] 正在解密: [{int(progress/2)*'='}{(50-int(progress/2))*' '}] {progress:.2f}%")
                sys.stdout.flush()

        print("\n" + "-" * 60)
        print(f"[▓▓▓] 解密百分之百完成!")
        print(f"[+] 成功生成标准虚拟磁盘文件: {os.path.abspath(output_filename)}")
        print("[*] 后续取证指南:")
        print("    1. 在 Windows 10/11 系统中,直接【双击】该 .vhd 文件即可将其作为盘符挂载。")
        print("    2. 你也可以直接使用 FTK Imager、Autopsy 或 7-Zip 直接打开该 vhd 获取内部的 Flag 电子证据。")

    except Exception as e:
        print(f"\n[-] 解密过程中发生未预料的错误: {e}")

if __name__ == "__main__":
    decrypt_evidence_file()

解密得到vhd后,挂载即可看到xlsx文件,从手机第7题可以看到地址为T9y开头,筛选再求和即可

答案:186948.09

posted @ 2026-06-03 16:43  Desk10086  阅读(7)  评论(0)    收藏  举报