2026黄河流域公安院校-电子物证单项赛(程序逆向分析+服务器取证)

案件介绍

复制代码
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

看看这个容器的配置文件,找一下接口地址

所以答案是http://172.17.0.1:6699

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}')
相关推荐
北斗落凡尘1 小时前
LangGraph 入门实战(4)
python·langchain
liwulin05061 小时前
【PYTHON】使用Selenium + ChromeDriver以及XPATH语法
开发语言·python·selenium
copyer_xyf1 小时前
Agentic RAG 实战:PostgreSQL + LangGraph 一条链路
python·postgresql·agent
动力 continue1 小时前
Python 元类与异常类:类的“制造工厂”与“报错定制师”
开发语言·python·制造
147API1 小时前
Python批量生成蒸馏数据,并发、重试、幂等和断点续跑
开发语言·jvm·python
青 春 记 忆1 小时前
零基础入门python04:用注册校验理解字典、集合和条件判断
开发语言·vscode·python·python3.11
kels88992 小时前
实战排坑:黄金实时API开发,XAUUSD Tick报文异常处理实践
开发语言·python·websocket·网络协议·信息可视化
FBI HackerHarry浩2 小时前
Pandas 库中用于分类变量独热编码(One-Hot Encoding)的函数 pd.get_dummies() 函数
开发语言·人工智能·python·pandas
赵民勇2 小时前
systemd-cgtop命令详解
linux·运维