“冀信杯2026”学生组CTF题解"

admin 2026-10-16 09:48:46 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

“冀信杯2026”学生组 CTF 题解

赛查查

2026年9月23日 16:01
北京

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

以下文章来源于Joy-Forensics
,作者Joyooo

Joy-Forensics
.

取证小菜鸡学习中~
博客链接:https://joyooosama.github.io/blog/
博客园:https://www.cnblogs.com/Joyooo

写在前面
  • 题目总数:19%20关,覆盖%20MISC%20/%20WEB%20/%20CRYPTO%20/%20REVERSE%20/%20PWN
  • 结果:解出18%20题得分,11道有血,总分9235分,排名第二
  • 选手环境:纯AI解题,当是给DS-V4.1做一次实战测试。实测下来,只要搭配合适的skills,它就是简单题的抢血利器。

成绩总览
# 题目 类别 分值
1 webshell分析 MISC 500
2 game MISC 525
3 sqlite MISC 515
4 nologin WEB 525
5 某后台系统 WEB 525
6 始卒若环,莫得其伦 WEB 500
7 ez\_cry CRYPTO 525
8 国密算法 CRYPTO 525
9 parallax\_god CRYPTO 500
10 路由器流量分析 REVERSE 500
11 cache\_mirror REVERSE 525
12 Orbit%20VM REVERSE 525
13 simplev8 PWN 505
14 Memory%20Backdoor PWN 500
15 Trace%20VM PWN 500
16 latt1ce CRYPTO 500
17 勒索软件 REVERSE 515
18 Rust逆向分析 REVERSE 525

一、MISC 1.%20webshell分析(500%20分)

题目描述

攻入一个采用%20PHP%20搭建的%20Web%20网站,并植入了%20Webshell%20后门,请找到后门获取敏感信息。请将%20shell%20密码作为答案提交。

附件:webshell分析.zip(7.4%20MB)

考点

藏在压缩包里的 dotfile(点开头文件)。这类条目有个特性:很多解压工具、目录列举会直接跳过,肉眼翻目录根本翻不到。

解题过程

Step%201:解压

解压后是一套完整的 ECShop%20v2.7.3 商城源码:

python%20-c%20\"import%20zipfile;zipfile.ZipFile('webshell分析.zip').extractall('webshell_extract')\"

Step%202:走了一条弯路(值得记录)

第一反应是找“被改动过的文件”。包里正好有一份官方完整性清单 admin/ecshopfiles.md5,拿它比对发现一堆不匹配——但那是 CRLF%20换行导致的假阳性。清洗换行后仍然没有有效线索;又去拉官方源码做全量%20diff,结果代码与上游完全一致。

Step%203:换思路——从%20ZIP%20自身结构下手

既然文件内容干净,那问题只可能出在目录项本身。直接解析%20ZIP%20的本地文件头和中央目录,两边做差集:

import%20struct%20data%20=%20open(\"webshell.zip\",\"rb\").read()%20 locals%20=%20[]%20i%20=%200%20while%20True:%20 %20 %20i%20=%20data.find(b\"PK\\x03\\x04\",%20i)%20 %20 %20if%20i%20<%200:%20break%20 %20 %20sig,ver,flag,comp,t,d,crc,csize,usize,nlen,elen%20=%20struct.unpack_from(\"<IHHHHHIIIHH\",%20data,%20i)%20 %20 %20locals.append((i,%20data[i+30:i+30+nlen],%20csize,%20usize))%20 %20 %20i%20+=%204%20 centrals%20=%20[]%20i%20=%200%20while%20True:%20 %20 %20i%20=%20data.find(b\"PK\\x01\\x02\",%20i)%20 %20 %20if%20i%20<%200:%20break%20 %20 %20f%20=%20struct.unpack_from(\"<IHHHHHHIIIHHHHHII\",%20data,%20i)%20 %20 %20nlen%20=%20f[10]%20 %20 %20centrals.append(data[i+46:i+46+nlen])%20 %20 %20i%20+=%204%20 lnames%20=%20{x[1]%20for%20x%20in%20locals}%20cnames%20=%20set(centrals)%20print(\"local%20not%20in%20central:\",%20len(lnames%20-%20cnames))%20for%20x%20in%20list(lnames%20-%20cnames)[:50]:%20 %20 %20print(\"%20 \",%20x)

输出:

local%20headers:%202154%20central%20entries:%202154%20local%20not%20in%20central:%200%20central%20not%20in%20local:%200