案件介绍
2026年3月,受害人张某在某短视频平台看到一则"兼职刷单、日赚千元"的广告,下载了一款名为"拓鑫任务"的刷单返利APP。电诈分子以"小额返利获取信任、大额任务连环诈骗"的方式,骗取张某共计人民币15万元。案发后,公安机关对张某手机进行电子数据勘验,提取了涉案APP安装包、聊天记录、转账截图及服务器域名等关键证据,研判追踪后锁定该诈骗团伙藏匿于境外某地。经国际警务协作,当地警方对该窝点实施收网行动,抓获多名涉案人员并启动遣返程序。根据双边执法合作协议,我方需派出专家组前往该窝点开展现场勘查、电子证据固定及取证工作。请根据获取的电子物证还原案件发展经过。
三、程序逆向分析
1、该刷单APP的包名是什么?(答案格式:com.example.app)

程序逆向分析给了俩压缩包,明显一个apk一个exe,问我们app所以我们就先看这个apk

直接放到雷电APP智能分析即可
得到包名com.tuoxin.task
2、该刷单APP从设备通讯录中窃取数据后,将数据写入哪个本地 JSON 文件?(答案格式:含扩展名,如abc_123.json)
说了是json文件,我们jadx打开来搜一下有没有什么跟".json"有关的逻辑

发现和写入以及.json相关的只有这一条

看了一下发现和题意一致
都是读取通讯录,提取信息,格式化数据后加密保存到这个contacts_bak.json文件中
符合题意,所以本题答案为contacts_bak.json
3、分析该刷单APP的 assets/cfg.bin文件,以下说法正确的是?(多选题)
A. cfg.bin 经过Base32编码
B. cfg.bin 经过 Base64 编码
C. cfg.bin 使用 AES-256-CBC 加密
D. cfg.bin 使用 AES-512-CBC 加密
E. cfg.bin 的 IV 来源于该文件自身偏移 8-23 字节
F. cfg.bin 的 IV 来源于独立的 assets/iv.bin
那就先定位这个cfg.bin文件

只出现在这里

一个个查看逻辑

首先是代码明确写了cfg.bin是经过了Base64编码,所以A错误、B正确
而CD的AES没有直接看见

发现这这边还导入了这个库

双击跳转过去发现是加载的txcore这个native库
所以我们还要去看看native层
改文件后缀名为zip,打开

我们可以很容易在lib文件夹下找到这个so文件
接着就要IDA进行分析了,最好选9.0以上的,低版本的反编译不了

肯定是看和加解密有关的函数

过来看看,不难发现中间这一条即为加密的函数

可以看到这边的核心调用
这边的32和初始化定义的v102其实都已经说明了密钥长32字节,强烈暗示是AES-256

那如果我们继续去看sub_14CC就会发现是一个标准的AES-256-CBC加密
所以刚刚的调用其实是
v5 = sub_14CC(
a1, // 加密数据
a2, // 加密数据长度
v10, // 密钥(32字节)
32, // 密钥长度
&v9, // IV/Nonce(16字节)
a3, // 输出缓冲区
&v8 // 输出长度
);
所以本题CD里边选C
最后是E和F

既然已经明确了这个sub_14CC是标准的AES-256-CBC加密
所以v9即为IV

v9是固定的明文,因此和文件无关,不选E,去看也会发现不一样

对照后发现确实是来源于独立的asset/iv.bin,与其内容一致
所以本题EF选F
综合选BCF
4、分析该刷单APP的 assets/cfg.bin文件,解密key是多少?(答案格式:按实际填写,如123abc)

密钥我们分析过了是v10

注意最后应该是0x07和0x00
所以合在一起,解密key就是47f32b6c3c50f7474f3a14787ef790f46d326e7a33a758d0c7e452cb120e0700
5、分析该刷单APP的assets/cfg.bin文件,其中记录的备份IP地址及端口是多少?(答案格式:192.168.1.1:8080)

最后我们就要开始解密这个cfg.bin了
刚刚已经说的很清楚了
读取 assets/cfg.bin
Base64 解码
跳过前 24 字节
取剩余部分作为 AES-CBC 密文
使用 native 中的 32 字节 key 和 16 字节 IV 解密

成功解码即可得到最后的备份ip和端口
121.43.187.92:8080
6、分析提取的HuangHe2026.exe,根据 DIE(Detect-It-Easy)识别结果,该 PE 文件使用的编译器及版本是?(单选题)
A. Microsoft Visual C++ 6.0
B. Borland Delphi 6
C. MinGW GCC 4.x
D. Microsoft Visual Basic 6.0
E. Borland C++ Builder 6

说的也太直接了,那我们就听他的用DIE就好了,打开发现编译器是Borland Delphi 6
选B
7、分析提取的HuangHe2026.exe,该 PE 文件包含多少个节区(Section)?(答案格式:1)

直接就能看见PE文件包含了8个节区
8、分析提取的HuangHe2026.exe,该 PE 文件入口点(Entry Point)的虚拟地址(VA)是多少?(答案格式:0x123456)

直接就能看见了其实

当然也可以在PE文件内部看,发现了PE的入口点RVA是0x92040
又因为ImageBase是0x400000
所以虚拟地址VA是0x400000+0x92040 = 0x492040
9、分析提取的HuangHe2026.exe,程序读取/写入的注册表值(Value Name)名是?(答案格式:Abcde)

用IDA打开查看字符串,发现很多跟USB有关的字符串,程序很有可能在操作USB存储驱动和INF驱动
我们选中SYSTEM\\CurrentControlSet\\Services\\UsbStor交叉引用过去看看

发现属于这个sub_491714函数

发现了核心逻辑是这边,这边在设置注册表操作的根键
0x80000002是Windows的预定义句柄常量HKEY_LOCAL_MACHINE

联系后边这边主要是打开了注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\UsbStor
再读取了值看看读到的值是否等于4

读取的是Start的值,所以本题答案为Start
10、分析提取的HuangHe2026.exe,该应用的主要功能是什么?(单选题)
A. 对插入的 USB 存储设备进行全盘加密,未授权设备无法读取数据
B. 完全卸载 Windows 系统中的所有 USB 主机控制器驱动程序,永久移除 USB 端口功能
C. 监控 USB 设备插拔事件并记录日志到本地文件,供管理员审计使用
D. 启用/禁用 Windows 系统的 USB 大容量存储设备(U 盘/移动硬盘等),通过修改注册表和重命名驱动 INF 文件实现
E. 通过 USB HID 接口模拟键盘输入,实现自动化测试或攻击载荷投递
这需要我们对这个程序的主要功能完全理解一遍
我们知道这个是一个exe,所以可以想到去看看有没有什么Apply按钮逻辑

在函数栏可以搜到这两个函数

发现主要功能在Button1,2没啥,进去看Button1,发现调用了sub_491844函数那边

我们跟过来看看,发现了大量逻辑内容

首先是这边在创建并打开注册表
而且操作的是0x80000002 ,即HKEY_LOCAL_MACHINE

紧接的这个可以基本确定了我们打开的是HKLM\SYSTEM\CurrentControlSet\Services\USBSTOR

再后边开始判断了,主要就是某个控件的状态回决定True还是False吧
如果是True

那么进入这个分支,其中最重要的就是最后一句了
把注册表里的Start赋值为了3
注意这边Windows服务的Start有这样子5个值
0 = Boot
1 = System
2 = Automatic
3 = Manual / Demand Start
4 = Disabled
所以3也就是开启,即USBSTOR没被禁

但如果是False,那么就是4,也就是禁用了USB
而且可以看到,不管是True还是False都是调用了通过修改注册表和重命名驱动INF文件实现的,分别启用和禁用了USB大容量存储设备
所以本题选D
四、服务器取证
1、该服务器的操作系统名称和版本是什么?(单选题)
A. CentOS 7.9 x86_64
B. Ubuntu 22.04 aarch64
C. openEuler 24.03 x86_64
D. Debian 12 x86_64

直接在火眼的系统信息看即可,选C
2、该服务器根分区 `/` 的 UUID 是什么?
A. e8650b2c-938c-4063-bb04-d91bb6fc4ef2
B. 7ca80e58-3dae-4109-8c6c-21c706950d52
C. d7f7ecef-6f94-40fa-8532-85218c1358d8
D. 6B09-FE8F
这种肯定是仿真比较方便看,我们直接仿真
平时仿真其实我习惯会增加内存和cpu核数,不过这边最好不要,因为后边有一题会有问题(虽然可能是题目的问题

为了方便输入命令,我们在启动后可以优先连接ssh

先登录

ssh开着,但是输入ifconfig发现没有ip


dhclient -v ens33
手动用DHCP分配一下ip

得到了ip,我们ssh连接


成功ssh连接上
直接输入命令
lsblk -o UUID,MOUNTPOINT
blkid /dev/mapper/openeuler-root
二选一即可,都能看

所以本题选B
3、该服务器根分区 `/` 的文件系统是什么?(答案格式:小写英文,如fat32)

在火眼详细信息往下划可以直接看见
文件系统是ext4
4、关于该服务器配置的网卡描述正确的有哪些?(多选题)
A. 网卡名称为ens33
B. IPv4默认网关为192.168.77.1
C. IPv4地址为192.168.77.130
D. UUID为707bf904-5157-4606-b7fe-aa403b6e0481



在火眼查看原来的网络配置就会发现网卡名称是ens160
然后ipv4地址是192.168.77.130,UUID也是对的,但是默认网关应该是192.168.77.2,不是B
所以应该是CD
5、宝塔面板的访问端口和登录安全入口是什么?(多选题)
A. 36912
B. 38497
C. /7921b4a7
D. /7c09f4b5

直接去宝塔面板的账号信息科即可
直接就能看出是BD
6、宝塔面板的登录账号是什么?(答案格式:以实际为准,如123abc)

登录账号就是用户名啊
火眼也能直接看
所以是eswr2ymq

在日志也能看见这个就是账号
7、宝塔面板配置的公网服务器IP是多少?(答案格式:192.168.1.1)
直接在火眼似乎看不见,我们只能去网站里边看看了
我们知道了账号是eswr2ymq,但不知道密码,所以我们需要bt 5来修改一下密码

直接修改即可
之后就是登录网站了

可以bt 14来看看详细信息

直接利用内网面板地址来登录即可
用户名我们知道,密码刚刚设置

我们可以在网站左上角直接看见外网ip
也可以在设置-面板设置里边看见服务器的外网ip
所以本题答案为180.111.28.195
8、涉案服务器在2026-07-06 15:32:47之前存在的提权漏洞编号是什么?(答案格式:CVE-2026-1234)

可以看到这边日志检测到了之前存在polkit漏洞
所以编号是CVE-2021-4034
9、宝塔面板中配置的MySQL数据库root密码是什么?(答案格式:以实际为准,如123abc)

点到数据库直接点root密码
即可看见数据库密码
fb5a2ab4f542f486
10、分析该服务器中部署的MySQL数据库,其中共包含多少条邮件收发记录?(答案格式:2)
上一题都拿到数据库root密码了
直接登录看看

打开直接自动帮忙统计了有52行
即52条收发记录
11、Redis 服务器的访问密码是什么?Redis 中共缓存了多少个 key?(答案格式:密码、数量,如password、3)
访问密码是什么,这就要看配置文件了

来文件看看,可以看到redis文件夹下在redis.conf配置文件

直接把密码写在最后了
TuoxinRedis2026

至于共缓存了多少个 key,直接在数据库找就好了
发现帮忙直接统计好了是66个
所以这题答案是TuoxinRedis2026、66
12、服务器中部署的网站"拓鑫商城"使用了什么 Web 框架?(单选题)
A. Laravel
B. Django
C. ThinkPHP
D. Spring Boot
我们直接去查看网站的配置文件即可

打开www/wwwroot/tuoxin.com/composer.json即可发现应该是C
13、该服务器中部署的网站"拓鑫商城",上次手动备份的日期时间是什么?(单选题)
A. 2026-03-06 14:30:15
B. 2026-03-07 14:30:15
C. 2026-07-06 14:30:15
D. 2026-07-07 14:30:15

直接点一下备份就会跳出备份的详细信息了
可以看见应该是D
14、关于"拓鑫商城"使用的数据库描述正确的是?(多选题)
A. 使用MySQL数据库
B. 使用的MySQL数据库端口为3306
C. 使用PostgreSQL数据库
D. 使用的PostgreSQL数据库端口为5432
问拓鑫商城相关内容
肯定是去看拓鑫里边的数据库配置情况

在.env.bak即可看见数据库的配置情况
发现是PostgreSQL数据库
端口是5432
所以本题答案是CD
15、"拓鑫商城"使用的数据库密码是多少?(答案格式:以实际为准,如123Abc)

同一个地方就能看见密码是
Tuoxin@2026_DB
当然也可以连一下验证看看
16、管理员赵天龙(admin)的密码明文是什么?(答案格式:以实际为准,如123Abc)
当然需要我们把数据库连上

建立ssh隧道比较好,发现这边ssh隧道是正常的

但是到了连接数据库就报错了
从报错可以看到我们其实是连到服务器了,但是服务器在处理请求的时候连接突然被服务器给主动断了
开始排查一下问题
ss -lntp | grep 5432
ps aux | grep postgres
/www/server/pgsql/bin/psql -h 127.0.0.1 -p 5432 -U tuoxin -d tuoxin_mall

检测端口进程并测试后发现本地开启psql完全没有问题
所以我们可以缩小到问题只是Navicat的SSH隧道这一层

(那我不用SSH隧道不就好了)
当然这样子也可以啦,不过我们还是深挖一下为什么ssh隧道不可以
问题很明确是ssh到数据库这段路,我们怀疑的第一个就是是不是ssh不允许tcp转发
sshd -T | grep -Ei 'allowtcpforwarding|disableforwarding|permitopen'

啊就是这个问题,给关掉了
grep -RniE '^[[:space:]]*AllowTcpForwarding|^[[:space:]]*DisableForwarding|^[[:space:]]*PermitOpen' \
/etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null
看看是哪一个文件关掉的

在这边啊,我们去打开就好了

改成yes
重新reload一下ssh
systemctl reload sshd


这下子用ssh隧道去访问也通了

去user表看看赵天龙这个人啊

不用找,就是第一个
这边有密码的hash和legacy_passwd,至于如何利用还是要看密码加密存储的手法
毕竟只给了hash,只有靠碰撞
我们最后可以在app/controller/Auth.php找到密码的存储方式

可以看到新用户注册是使用的PHP的password_hash函数在进行Bcrypt加密

如果是旧用户,也有对密码进行加密后存到legacy_password的
验证是先新后旧,所以我们其实可以两边都能解
先看旧的
这边说的很清楚了,在\app\lib\CryptoHelper有legacyDecrypt函数

先解Base64,然后再Reverse了一下,最后异或了Tuoxin@2026!Legacy即可
那我们也这样子来一趟

得到密码Passw0rd
或者去爆破Bcrypt
hashcat -a 0 -m 3200 '$2y$10$2bnI84AWNzL6HwSPWcT3Qeugd0bodY/UAVyBvBY6Fp.y.8ycou60W' rockyou.txt -w 3

但是Bcrypt不好爆
所以本题的密码为Passw0rd
17、"拓鑫商城"的刷单任务大厅中,当前显示正在进行中的刷单任务有多少个?(答案格式:1)

直接在数据库查看tasks这个表
可以看见open的是10条在进行的刷单任务
答案是10
打开网站看也一样
18、登录"拓鑫商城"的后台管理页面,受害人卫永峰在2025-12-29 ~ 2026-03-29购买了多少份智能合约产品"鲨鱼鳍结构化"(答案格式:1)
要登录后台了,我们仿真网站
直接访问网站发现404,应该是反向代理有问题,我们查看网站配置文件
/www/server/nginx/conf/nginx.conf

可以看到宝塔经典结构,但是这边写的其实有问题
平时其实是没啥问题的,但是在这个地方不止一个文件在listen 80,而且在tuoxin.com.conf前还有文件在listen 80
于是Nginx会把第一个出现的当作默认server,导致了这边一直404
我们只要在tuoxin.com.conf强调一下listen 80 default_server;
再把我们的ip加到server_name即可

nginx -t && systemctl restart nginx
重启一下nginx

即可成功访问网站了

直接登录admin,密码解过了是Passw0rd

成功登录后台

直接去合约管理的认购记录即可看见购买了5份
19、接上题,"鲨鱼鳍结构化"的合约地址是多少?(答案格式:以实际为准,如0Xabc123XXXX)

在合约管理的合约产品没看见合约地址
去数据库找一下

在contract_products可以看到合约地址0xAC785C81EB039C101B4175BB5BB66F8CA08B6A3C
20、"拓鑫商城"数据库中的用户手机号使用加密算法加密,加密密钥是什么?(答案格式:以实际为准,如123_Abc)

确实加密了,就叫phone,我们看看phone怎么加密的
先是依旧看一下Auth.php

发现调用的是/app/lib/CryptoHelper.php的encryptPhone加密方法

直接就能看见密码是TJ_huanghe_2026
21、"拓鑫商城"管理后台中的"合约投资交流群"的群主用户名是什么?(答案格式:abc)

说了是管理后台,这边可以看见群聊

点进去就能看见群主是杨红

但是有俩杨红
还是去数据库看

可以看到created_by 22
所以是id 22的杨红,用户名是dengchao
22、"拓鑫商城"启动了以下哪些网站防护规则?(多选题)
A. SQL注入防御
B. XSS防御
C. 恶意文件上传防御
D. 恶意爬虫防御

直接去宝塔的WAF看
发现ABCD全开着,全选即可
23、服务器上正在运行(重启策略为:停止后马上重启)的 AI 推理Docker容器名称是什么?(答案格式:以实际为准,如abc-def)

打开Docker栏目看看
明显是中间这一个

所以名称为alpine-llama-cpp-server

重启策略都符合
24、接上题,该AI 推理Docker容器中部署加载的大语言模型参数量是多少?(答案格式:35B)

这边直接能看见是0.8B的
或者我们也可以访问一下,说了端口是6699

访问6699端口即可看见确实是0.8B
25、接上题,上述部署加载的模型,设置的上下文长度是多少tokens?(答案格式:无标点符号,如123456)

这边直接写了是117760tokens,答案也确实是117760tokens,但是这边其实考的有问题
下边是范叔指出的问题
因为在这边作者启动的时候并没有指认传递上下文长度的参数进去,即启动就没有传递--ctx-size参数来设置上下文长度
所以llama.cpp就自动根据宿主机的内存大小来设置上下文了。
我们的火眼默认仿真是4G内存,所以标准答案以及大多数人做的答案就都是117760
但如果你开8g,llama.cpp会自动开满262k上下文导致你这边显示的是262k
如果设置的内存是2G,又会导致上下文显示是117760的减半
26、服务器上已停止(重启策略为:不重启)的Docker容器,使用的镜像ID是多少?(答案格式:以实际为准,如123abc)

依旧是Docker这边写的,已停止的就一个,所以容器就是这个

我们再看他的镜像id
可以看到应该是4a01b014fae7
27、接上题,启动该容器,访问相应服务地址,其中配置的大模型接口地址为?(答案格式:http://192.168.1.1:1234)
题目说了启动该容器,那我们就启动一下

直接启动即可

开在3000端口,访问一下
docker inspect nextchat
看看这个容器的配置文件,找一下接口地址

28、该服务器中部署的FileBrowser默认管理员密码是什么?(答案格式:以实际为准,如123Abc)

FileBrowser的端口在8081

找一下密码

发现这个容器的日志里边藏着呢,FCHZTo0mAYzxRxka,我们可以尝试下能否打开

成功了,所以密码就是FCHZTo0mAYzxRxka
29、分析嫌疑人存储在服务器中的"料子",其中城市为南京的受害人有多少个?(答案格式:10)

找到料子的表格文件,下载下来

import openpyxl
file_path = '我的料子.xlsx'
wb = openpyxl.load_workbook(file_path)
nj_count = 0
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
for row in sheet.iter_rows(min_row=2, values_only=True):
if row[2] == '南京':
nj_count += 1
print(f'南京人数: {nj_count}')

所以是84个人
30、分析嫌疑人存储在服务器中的所有月工资表,杨红的全部实发工资是多少?(答案格式:123456)

月工资表,全部下下来
import openpyxl
import zipfile
import os
zip_path = '月工资表.zip'
folder_path = '月工资表'
with zipfile.ZipFile(zip_path, 'r') as z:
z.extractall(folder_path)
total = 0
for file_name in os.listdir(folder_path):
if file_name.endswith('.xlsx'):
file_path = os.path.join(folder_path, file_name)
wb = openpyxl.load_workbook(file_path)
for sheet_name in wb.sheetnames:
sheet = wb[sheet_name]
for row in sheet.iter_rows(min_row=2, values_only=True):
if row[0] == '杨红':
total += row[3]
print(f'杨红全部实发工资: {total}')
