🏆 2026第四届黄河流域公安院校电子物证个人赛 — 服务器取证 Writeup
💡 报告元数据
首席取证官: yagami任务目录: /mnt/d/文档/hermes-work/2026第四届黄河流域公安院校电子物证个人赛/服务器取证/生成时间:2026-08-04 20:45 生成模式:完整型取证交付 Writeup
🛠️ 工具链与环境底座
1. 算力与架构
| 自动化编排 | |
| 基座大模型 | |
| 运行架构 |
2. 任务信息
| 赛事名称 | |
| 检材类型 | |
| 镜像路径 | /mnt/z/2026第四届黄河流域公安院校电子物证个人赛检材/4.第四部分:服务器取证/web_dev_nvme0n1.E01 |
| 挂载路径 | /mnt/h |
| SSH连接 | |
| 操作系统 | |
| 题目总数 | |
| 已验证 |
📊 考题最终答案汇总看板
⚔️ 深度取证与解题全链路复盘
第一阶段:系统环境与网络配置取证 (Q1-Q4)
🧩 Q1 该服务器的操作系统名称和版本是什么?
标准答案:C. openEuler 24.03 x86_64 状态等级:🟢 已验证 / L1 解题主线:通过SSH连接目标服务器,读取 /etc/os-release获取系统版本信息。💡 关键证据: PRETTY_NAME="openEuler 24.03 (LTS-SP3)"— 确认操作系统为 openEuler 24.03 LTS-SP3 版本,架构 x86_64。🛠️ 核心命令:
ounter(lineounter(linecat /etc/os-release | grep PRETTY_NAME# → PRETTY_NAME="openEuler 24.03 (LTS-SP3)"
🧩 Q2 该服务器根分区 / 的 UUID 是什么?
标准答案:B. 7ca80e58-3dae-4109-8c6c-21c706950d52 状态等级:🟢 已验证 / L1 解题主线:使用 blkid查询根分区UUID,df -T /确认挂载点。💡 关键证据: /dev/mapper/openeuler-root: UUID="7ca80e58-3dae-4109-8c6c-21c706950d52" TYPE="ext4",df -T /确认该设备挂载点为/。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineblkid /dev/mapper/openeuler-root# → UUID="7ca80e58-3dae-4109-8c6c-21c706950d52" TYPE="ext4"df -T /# → /dev/mapper/openeuler-root ext4
🧩 Q3 该服务器根分区 / 的文件系统是什么?
标准答案:ext4 状态等级:🟢 已验证 / L1 解题主线: blkid直接显示 TYPE="ext4",df -T /交叉确认。💡 关键证据: blkid→ TYPE="ext4";df -T /→ ext4。🛠️ 核心命令:
ounter(lineounter(lineblkid | grep openeuler-root# → TYPE="ext4"
🧩 Q4 关于该服务器配置的网卡描述正确的有哪些?
标准答案:C, D 状态等级:🟢 已验证 / L1 解题主线:从镜像静态解析 ifcfg-ens160获取原始网卡配置。SSH动态显示ens33是仿真环境加入的网卡,答案以实际配置文件为准。💡 关键证据:NAME=ens160(A错误), UUID=707bf904-5157-4606-b7fe-aa403b6e0481(D正确), IPADDR=192.168.77.130(C正确), GATEWAY=192.168.77.2(B错误) 🛠️ 核心命令:
ounter(lineounter(linecat /mnt/h/root/etc/sysconfig/network-scripts/ifcfg-ens160 | grep -E '^(NAME|UUID|IPADDR|GATEWAY)='# → NAME=ens160, UUID=707bf904-5157-4606-b7fe-aa403b6e0481, IPADDR=192.168.77.130, GATEWAY=192.168.77.2
⚠️ 修正复盘:SSH动态运行态显示ens33网卡(仿真环境加入),但题目问"配置的网卡",应从镜像静态配置文件获取。这是静态配置 vs 动态运行态的经典陷阱。
第二阶段:宝塔面板取证 (Q5-Q9)
🧩 Q5 宝塔面板的访问端口和登录安全入口是什么?
标准答案:B, D 状态等级:🟢 已验证 / L1 解题主线:静态解析宝塔面板配置文件获取端口和安全入口。 💡 关键证据: port.pl→ 38497(B正确);admin_path.pl→ /7c09f4b5(D正确)。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linecat /mnt/h/root/www/server/panel/data/port.pl# → 38497cat /mnt/h/root/www/server/panel/data/admin_path.pl# → /7c09f4b5
🧩 Q6 宝塔面板的登录账号是什么?
标准答案:eswr2ymq 状态等级:🟢 已验证 / L1 解题主线:宝塔面板存在两个SQLite数据库—— default.db(初始默认配置)和panel.db(生产加密配置)。实际登录账号以panel.db为准。💡 关键证据: panel.dbusers表 → username=eswr2ymq;而default.db中 username=admin 是初始默认值,不是实际账号。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linesqlite3 /mnt/h/root/www/server/panel/data/db/panel.db "SELECT * FROM users;"# → username=eswr2ymq (生产配置)sqlite3 /mnt/h/root/www/server/panel/data/default.db "SELECT * FROM users;"# → username=admin (初始默认值,陷阱)
⚠️ 修正复盘:经典陷阱—— default.db中 admin 是初始默认值,实际生产账号在panel.db中。
🧩 Q7 宝塔面板配置的公网服务器IP是多少?
标准答案:180.111.28.195 状态等级:🟢 已验证 / L1 解题主线:读取宝塔面板 iplist.txt获取配置的公网IP。💡 关键证据: /www/server/panel/data/iplist.txt→ 180.111.28.195🛠️ 核心命令:
ounter(lineounter(linecat /mnt/h/root/www/server/panel/data/iplist.txt# → 180.111.28.195
🧩 Q8 涉案服务器在2026-07-06 15:32:47之前存在的提权漏洞编号是什么?
标准答案:CVE-2021-4034 状态等级:🟢 已验证 / L1 解题主线:解析宝塔面板 log.db日志表,提取漏洞修复记录。💡 关键证据:log.db logs表第一条: type='漏洞修复', log='检测到您的系统中存在polkit(CVE-2021-4034)提权漏洞,已为您修复!', addtime='2026-07-06 15:32:47'。 🛠️ 核心命令:
ounter(lineounter(linesqlite3 /mnt/h/root/www/server/panel/data/db/log.db "SELECT * FROM logs ORDER BY id LIMIT 1;"# → (1, '漏洞修复', '检测到您的系统中存在polkit(CVE-2021-4034)提权漏洞,已为您修复!', '2026-07-06 15:32:47', ...)
🧩 Q9 宝塔面板中配置的MySQL数据库root密码是什么?
标准答案:fb5a2ab4f542f486 状态等级:🟢 已验证 / L2 解题主线:从 panel.dbconfig表提取加密的mysql_root字段(BT-0x:前缀),使用宝塔PluginLoader.py中的AES解密逻辑解密,再用MySQL动态登录验证。💡 关键证据: panel.db config表: mysql_root = BT-0x:t2UpDw7vR5VjXlan0WCaDx150cBgfLlVPxRMe7Vbb1o= AES解密参数: Key=3P+_lN3+jPW6Kgt#, IV从div.pl读取MD5前16字节 解密结果: fb5a2ab4f542f486 MySQL登录验证: mysql -u root -p'fb5a2ab4f542f486' -e 'SELECT VERSION();'→ 5.7.44-log ✓🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# AES解密(Python)python3 -c "from Crypto.Cipher import AES; import base64, hashlibkey = '3P+_lN3+jPW6Kgt#'iv = hashlib.md5(open('/www/server/panel/data/div.pl').read().encode()).digest()[:16]enc = base64.b64decode('t2UpDw7vR5VjXlan0WCaDx150cBgfLlVPxRMe7Vbb1o=')pwd = AES.new(key.encode(), AES.MODE_CBC, iv).decrypt(enc).rstrip(b'\\0').decode()print(pwd) # → fb5a2ab4f542f486"# 动态验证mysql -u root -p'fb5a2ab4f542f486' -e 'SELECT VERSION();'# → 5.7.44-log ✓
⚠️ 修正复盘: default.db中 mysql_root 为明文 admin(初始值),实际密码在panel.db中以 BT-0x: 格式加密存储。
第三阶段:数据库与缓存取证 (Q10-Q11)
🧩 Q10 MySQL数据库中邮件收发记录数
标准答案:52 状态等级:🟢 已验证 / L1 解题主线:使用Q9解密的MySQL root密码连接jelly数据库,查询email_records表记录数。 💡 关键证据: SELECT COUNT(*) FROM email_records;→ 52🛠️ 核心命令:
ounter(lineounter(linemysql -u root -p'fb5a2ab4f542f486' jelly -e 'SELECT COUNT(*) FROM email_records;'# → 52
🧩 Q11 Redis密码与key数量
标准答案:TuoxinRedis2026、66 状态等级:🟢 已验证 / L2 解题主线:从Redis配置文件提取密码,再用redis-cli动态查询DBSIZE。 💡 关键证据: /www/server/redis/redis.conf→ requirepass TuoxinRedis2026;redis-cli -a TuoxinRedis2026 DBSIZE→ 66🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linegrep requirepass /www/server/redis/redis.conf# → requirepass TuoxinRedis2026redis-cli -a TuoxinRedis2026 DBSIZE# → 66
第四阶段:Web应用取证 (Q12-Q16)
🧩 Q12 拓鑫商城使用的Web框架
标准答案:C. ThinkPHP 状态等级:🟢 已验证 / L1 解题主线:查看网站目录 composer.json 确认框架依赖。 💡 关键证据: composer.json→ require topthink/framework ^8.0, name=tuoxin/mall, description=拓鑫商城🛠️ 核心命令:
ounter(lineounter(linegrep topthink /www/wwwroot/tuoxin.com/composer.json# → "topthink/framework": "^8.0"
🧩 Q13 网站上次手动备份日期
标准答案:D. 2026-07-07 14:30:15 状态等级:🟢 已验证 / L1 解题主线:查看备份目录中的文件。 💡 关键证据: /www/backup/site/tuoxin.com/tuoxin.com_20260707_143015.tar.gz,文件修改时间 Jul 7 14:30。🛠️ 核心命令:
ounter(lineounter(linels -la /www/backup/site/tuoxin.com/# → tuoxin.com_20260707_143015.tar.gz (Jul 7 14:30)
🧩 Q14 拓鑫商城使用的数据库
标准答案:C, D 状态等级:🟢 已验证 / L1 解题主线:读取应用 database.php 配置文件。 💡 关键证据:database.php → default=pgsql(C正确), hostport=5432(D正确)。 🛠️ 核心命令:
ounter(lineounter(linegrep -E '(default|hostport)' /www/wwwroot/tuoxin.com/config/database.php# → 'default' => 'pgsql', 'hostport' => '5432'
🧩 Q15 拓鑫商城数据库密码
标准答案:Tuoxin@2026_DB 状态等级:🟢 已验证 / L2 解题主线:从database.php提取密码,用PostgreSQL动态登录验证。 💡 关键证据:database.php password=Tuoxin@2026_DB; PGPASSWORD='Tuoxin@2026_DB' psql登录成功。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linegrep password /www/wwwroot/tuoxin.com/config/database.php# → 'password' => 'Tuoxin@2026_DB'PGPASSWORD='Tuoxin@2026_DB' /www/server/pgsql/bin/psql -h 127.0.0.1 -U tuoxin -d tuoxin_mall -c "SELECT 1;"# → (1 row) ✓
🧩 Q16 管理员赵天龙(admin)的密码明文
标准答案:Passw0rd 状态等级:🟢 已验证 / L2 解题主线:从PostgreSQL users表提取legacy_password字段,使用CryptoHelper.php中的legacyDecrypt算法解密(base64→strrev→XOR),再用bcrypt双重验证。 💡 关键证据: users表: username=admin, nickname=赵天龙, legacy_password=VjJeHgscFAQ= CryptoHelper.php: legacyDecrypt = base64→strrev→XOR with 'Tuoxin@2026!Legacy' 解密结果: Passw0rd bcrypt验证: bcrypt.checkpw('Passw0rd', hash)→ True ✓🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line# legacy_decrypt Python复现python3 -c "import base64enc = 'VjJeHgscFAQ='decoded = base64.b64decode(enc).decode()reversed_s = decoded[::-1]key = 'Tuoxin@2026!Legacy'result = ''.join(chr(ord(c) ^ ord(key[i % len(key)])) for i, c in enumerate(reversed_s))print(result) # → Passw0rd"# bcrypt双重验证python3 -c "import bcrypthash_val = '\$2y\$10\$2bnI84AWNzL6HwSPWcT3Qeugd0bodY/UAVyBvBY6Fg.y.8ycou60W'print(bcrypt.checkpw(b'Passw0rd', hash_val.encode())) # → True"
第五阶段:业务数据取证 (Q17-Q22)
🧩 Q17 刷单任务大厅中正在进行中的任务数
标准答案:10 状态等级:🟢 已验证 / L1 解题主线:PostgreSQL tasks表查询 status='open' 的记录数。 💡 关键证据: SELECT COUNT(*) FROM tasks WHERE status='open';→ 10🛠️ 核心命令:
ounter(lineounter(lineounter(linePGPASSWORD='Tuoxin@2026_DB' /www/server/pgsql/bin/psql -h 127.0.0.1 -U tuoxin -d tuoxin_mall \-c "SELECT COUNT(*) FROM tasks WHERE status='open';"# → 10
🧩 Q18 卫永峰购买鲨鱼鳍结构化合约数量
标准答案:5 状态等级:🟢 已验证 / L2 解题主线:user_contracts表JOIN contract_products和users表,筛选卫永峰在指定时间范围内的鲨鱼鳍结构化购买记录。注意外键字段是 contract_id(非直觉的contract_product_id)。💡 关键证据:查询结果 → user00092/卫永峰, shares=5 🛠️ 核心命令:
ounter(lineounter(lineounter(linePGPASSWORD='Tuoxin@2026_DB' /www/server/pgsql/bin/psql -h 127.0.0.1 -U tuoxin -d tuoxin_mall \-c "SELECT uc.shares FROM user_contracts uc JOIN contract_products cp ON uc.contract_id = cp.id JOIN users u ON uc.user_id = u.id WHERE cp.name='鲨鱼鳍结构化' AND u.nickname='卫永峰' AND uc.start_date >= '2025-12-29' AND uc.start_date <= '2026-03-29';"# → shares=5
⚠️ 修正复盘:外键字段名需从 \d user_contracts确认为contract_id,不是直觉上的contract_product_id。
🧩 Q19 鲨鱼鳍结构化的合约地址
标准答案:0xAC785C81EB039C101B4175BB5BB66F8CA08B6A3C 状态等级:🟢 已验证 / L1 解题主线:contract_products表直接查询。 💡 关键证据: SELECT contract_address FROM contract_products WHERE name='鲨鱼鳍结构化';→ 0xAC785C81EB039C101B4175BB5BB66F8CA08B6A3C🛠️ 核心命令:
ounter(lineounter(lineounter(linePGPASSWORD='Tuoxin@2026_DB' /www/server/pgsql/bin/psql -h 127.0.0.1 -U tuoxin -d tuoxin_mall \-c "SELECT contract_address FROM contract_products WHERE name='鲨鱼鳍结构化';"# → 0xAC785C81EB039C101B4175BB5BB66F8CA08B6A3C
🧩 Q20 手机号加密密钥
标准答案:TJ_huanghe_2026 状态等级:🟢 已验证 / L1 解题主线:从CryptoHelper.php源码提取手机号加密AES-256-CBC密钥。 💡 关键证据: private static $key = 'TJ_huanghe_2026';— AES-256-CBC加密算法。🛠️ 核心命令:
ounter(lineounter(linegrep -A5 'private static \$key' /www/wwwroot/tuoxin.com/app/lib/CryptoHelper.php# → private static \$key = 'TJ_huanghe_2026';
🧩 Q21 合约投资交流群群主用户名
标准答案:dengchao 状态等级:🟢 已验证 / L2 解题主线:groups_表(注意下划线后缀)JOIN users表,通过created_by关联。Chat.php代码确认JOIN逻辑。 💡 关键证据:groups_ id=4(合约投资交流群) created_by=22 → users id=22 username=dengchao;Chat.php: JOIN users u ON g.created_by = u.id。🛠️ 核心命令:
ounter(lineounter(lineounter(linePGPASSWORD='Tuoxin@2026_DB' /www/server/pgsql/bin/psql -h 127.0.0.1 -U tuoxin -d tuoxin_mall \-c "SELECT g.id, g.name, u.username FROM groups_ g JOIN users u ON g.created_by = u.id WHERE g.name='合约投资交流群';"# → id=4, name=合约投资交流群, username=dengchao
🧩 Q22 拓鑫商城启动的网站防护规则
标准答案:A, B, C, D 状态等级:🟢 已验证 / L1 解题主线:解析 /www/server/btwaf/site.json中tuoxin.com的防护配置。💡 关键证据:sql_injection.open=true(A✓), xss_injection.open=true(B✓), file_upload.open=true(C✓), not_spider=true+spider配置存在(D✓) 🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linecat /www/server/btwaf/site.json | python3 -c "import sys,json; d=json.load(sys.stdin); c=d['tuoxin.com']print('sql:', c.get('sql_injection',{}).get('open'))print('xss:', c.get('xss_injection',{}).get('open'))print('upload:', c.get('file_upload',{}).get('open'))print('spider:', c.get('not_spider'))"# → sql: True, xss: True, upload: True, spider: True
第六阶段:Docker容器取证 (Q23-Q28)
🧩 Q23 AI推理Docker容器名称
标准答案:alpine-llama-cpp-server 状态等级:🟢 已验证 / L1 解题主线:docker ps查看运行中的容器,确认重启策略为always(停止后马上重启)。 💡 关键证据: docker ps→ alpine-llama-cpp-server 运行中, RestartPolicy=always。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linedocker ps -a# → alpine-llama-cpp-server | samueltallet/alpine-llama-cpp-server | Up (always)docker inspect alpine-llama-cpp-server --format '{{json .HostConfig.RestartPolicy}}'# → {"Name":"always","MaximumRetryCount":0}
🧩 Q24 AI模型参数量
标准答案:0.8B 状态等级:🟢 已验证 / L2 解题主线:从模型文件名和API返回双重确认。 💡 关键证据:模型文件 Qwen3.5-0.8B.Q8_0.gguf;API返回 n_params=752393024(约0.8B参数)。 🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linecurl -s http://localhost:6699/v1/models | python3 -c "import sys,json; d=json.load(sys.stdin); m=d['data'][0]print('n_params:', m['meta']['n_params']) # → 752393024 (约0.8B)"
🧩 Q25 模型上下文长度
标准答案:117760 状态等级:🟢 已验证 / L1 解题主线:API直接返回 n_ctx=117760。 💡 关键证据: curl http://localhost:6699/v1/models→ "n_ctx": 117760, "n_ctx_train": 262144🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linecurl -s http://localhost:6699/v1/models | python3 -c "import sys,json; d=json.load(sys.stdin); print(d['data'][0]['meta']['n_ctx'])"# → 117760
🛑 备注:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linerunlike -p 7ddocker run --name=alpine-llama-cpp-server \--hostname=7da252c95337 \--mac-address=02:42:ac:11:00:02 \--entrypoint /opt/llama.cpp/llama-server \--volume /root/model:/models \--network=bridge \--workdir=/opt/llama.cpp \-p 6699:8080 \--restart=always \--runtime=runc \--detach=true \samueltallet/alpine-llama-cpp-server \--host 0.0.0.0 -m /models/Qwen3.5-0.8B-Claude-4.6-Opus-Reasoning-Distilled-GGUF/Qwen3.5-0.8B.Q8_0.gguf
可以看到此llama.cpp的docker容器启动是没有传递--ctx-size参数,所以llama.cpp会根据宿主机的内存大小来决定上下文长度,一般仿真软件默认的设置是4G,做出来的答案就是117760,所以仿真时给予不同的内存会做出不同的答案。 8G内存就开满了qwen的262k上下文
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(linefree -mtotal used free shared buff/cache availableMem: 7431 4585 210 60 3009 2845Swap: 2047 0 2047curl http://localhost:6699/v1/models{"models":[{"name":"/models/Qwen3.5-0.8B-Claude-4.6-Opus-Reasoning-Distilled-GGUF/Qwen3.5-0.8B.Q8_0.gguf","model":"/models/Qwen3.5-0.8B-Claude-4.6-Opus-Reasoning-Distilled-GGUF/Qwen3.5-0.8B.Q8_0.gguf","modified_at":"","size":"","digest":"","type":"model","description":"","tags":[""],"capabilities":["completion"],"parameters":"","details":{"parent_model":"","format":"gguf","family":"","families":[""],"parameter_size":"","quantization_level":""}}],"object":"list","data":[{"id":"/models/Qwen3.5-0.8B-Claude-4.6-Opus-Reasoning-Distilled-GGUF/Qwen3.5-0.8B.Q8_0.gguf","aliases":["/models/Qwen3.5-0.8B-Claude-4.6-Opus-Reasoning-Distilled-GGUF/Qwen3.5-0.8B.Q8_0.gguf"],"tags":[],"object":"model","created":1785849342,"owned_by":"llamacpp","meta":{"vocab_type":2,"n_vocab":248320,"n_ctx":262144,"n_ctx_train":262144,"n_embd":1024,"n_params":752393024,"size":800881920,"ftype":"Q8_0"}}]}
🧩 Q26 已停止容器镜像ID
标准答案:4a01b014fae7 状态等级:🟢 已验证 / L1 解题主线:docker images查看已停止容器使用的镜像ID(短ID)。 💡 关键证据: docker images yidadaa/chatgpt-next-web→ ID=4a01b014fae7;对应已停止容器nextchat,RestartPolicy=no。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(linedocker images yidadaa/chatgpt-next-web --format '{{.ID}}'# → 4a01b014fae7docker inspect nextchat --format '{{json .HostConfig.RestartPolicy}}'# → {"Name":"no","MaximumRetryCount":0}
🧩 Q27 启动容器后配置的大模型接口地址
标准答案:http://172.17.0.1:6699 状态等级:🟢 已验证 / L2 解题主线:启动已停止的nextchat容器,从环境变量提取BASE_URL,curl验证API可达。 💡 关键证据: docker inspect nextchat Config.Env→ BASE_URL=http://172.17.0.1:6699;curl http://172.17.0.1:6699/v1/models返回模型列表 ✓🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linedocker start nextchat && sleep 5docker inspect nextchat --format '{{json .Config.Env}}' | python3 -c "import sys,json; env=json.load(sys.stdin)[e for e in env if 'BASE_URL' in e]"# → BASE_URL=http://172.17.0.1:6699curl -s http://172.17.0.1:6699/v1/models | python3 -c "import sys,json; print(json.load(sys.stdin)['object'])"# → list ✓
🧩 Q28 FileBrowser默认管理员密码
标准答案:FCHZTo0mAYzxRxka 状态等级:🟢 已验证 / L1 解题主线:从容器日志提取首次启动时生成的随机密码。 💡 关键证据: docker logs tuoxin_filebrowser→ "User 'admin' initialized with randomly generated password: FCHZTo0mAYzxRxka"🛠️ 核心命令:
ounter(lineounter(linedocker logs tuoxin_filebrowser 2>&1 | grep 'password'# → User 'admin' initialized with randomly generated password: FCHZTo0mAYzxRxka
第七阶段:Excel文件取证 (Q29-Q30)
🧩 Q29 "料子"中城市为南京的受害人数量
标准答案:84 状态等级:🟢 已验证 / L1 解题主线:使用openpyxl遍历"我的料子.xlsx"全部66个sheet,统计城市列为"南京"的记录数。 💡 关键证据:文件位置 /www/wwwroot/tuoxin.com/public/uploads/data/料子/我的料子.xlsx,共66个sheet(名单1-名单66),每个含姓名/手机号/城市/职业四列。遍历所有记录统计城市='南京' → 84条。🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linepip install openpyxl -qpython3 -c "import openpyxlwb = openpyxl.load_workbook('/www/wwwroot/tuoxin.com/public/uploads/data/料子/我的料子.xlsx')nj = sum(1 for sn in wb.sheetnames for row in wb[sn].iter_rows(min_row=2, values_only=True) if row[2] == '南京')print(f'南京人数: {nj}') # → 84"
🧩 Q30 杨红的全部实发工资
标准答案:1180380 状态等级:🟢 已验证 / L1 解题主线:遍历月工资表目录下102个Excel文件(2017年10月至2026年3月),查找杨红的实发工资列并求和。 💡 关键证据:102个工资表文件中,杨红在每月均有记录(共102条),实发工资列求和 = 1180380。 🛠️ 核心命令:
ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(linepython3 -c "import openpyxl, ostotal = 0; count = 0for fn in sorted(os.listdir('/www/wwwroot/tuoxin.com/public/uploads/data/月工资表/')):if not fn.endswith('.xlsx'): continuewb = openpyxl.load_workbook(f'/www/wwwroot/tuoxin.com/public/uploads/data/月工资表/{fn}', data_only=True)for sn in wb.sheetnames:for row in wb[sn].iter_rows(min_row=2, values_only=True):if row[0] == '杨红':total += row[3]; count += 1print(f'记录数: {count}, 总计: {total}') # → 记录数: 102, 总计: 1180380"
🛑 未完成或不可提交题目审计
全量收敛:30/30题全部已验证,无未完成或不可提交题目。
📂 附录:自动化取证证据大索引
FINDING 证据索引
CMD 命令索引
- 全链路取证闭环完成 -