ZeroG新神赛WP
最近比较忙,这比赛连打好几天,最高第四,结束后总排名第九,混了个三等奖
一共写了18道题,现在开始补wp
【Stage1—米米的奇幻之旅】

这题非常基础,firefox秒了
第一关get请求,第二关有一个基础的字符串替换作为过滤,没什么用 修改参数为 fflaglag即可
第三关


右键重发请求后
X-Forwarded-For 修改这个头即可
….

反正最后firefox 一把梭 (最爱火狐 可惜性能不行 现在只有CTF用了)
Stage1 - Orbital Suply

这道题第一反应是sql注入 ,我用wappalyzer看了一下技术栈,发现后端是Python flask,果断测试SSTI注入。

最后从环境变量中读到flag
StrangeJPG

这题是MISC,binwalk或者foremost 分离出来有一本龙族(出题人夹带私货)和一个base64编码
解码后拿到flag
Stage1—你胆子真是肥嘟嘟的

点击按钮访问路由:/admin
json编辑器这里
利用链:$user->class->is_admin === true
1 | {"__class__": |
比赛后复盘发现考点是递归合并键问题,用户输入顺进了共享的类级状态
污染成功后顺利进入admin得到flag
Stage1 — NmapLog

直接wireshark打开

打开看包,大部分都是192.168.1.100向10.0.0.50发的
后续扫描发送RST 未完成握手判断
判断扫描方式为namp的半开扫描 -sS 因此tcp握手不会全握,卡在第二步
过滤语句tcp.flags.syn == 1 && tcp.flags.ack==1
原因:
tcp.flags.syn == 1:SYN 标志位置位,表示同步序列号。tcp.flags.ack == 1:ACK 标志位置位,表示确认号有效
因此,过滤出了这种包:服务端 → 客户端:**SYN, ACK,回应连接请求。← 过滤出的通常是这种包**
最后得到flag
ZeroGflag{192.168.1.100_10.0.0.50_22_80_443_sS}
Stage2—碰星喵的奇妙冒险
解压!

一路下去

发现base64后的二进制数据
可以看到无敌的我当时写了个python脚本

但是压缩包是损坏的!有额外数据段损坏,题目也提示了
这里我投机取巧找了个在线网站

修完了解压就拿到flag了
Stage2-夜班值守
进去之后下载题目,原网页有提示,这里懒得截了

access.log
总之使用我强大的python脚本编写技术秒了
1 | with open("access.log") as f: |
注意一点就是 存在没用的首字符 我写的代码的问题 手工丢弃后即可拿到flag
Stage2-ZeroG_2026
这题一打开我就发现,和极客大挑战2023_easy_php 好像啊,然后我就去看原题wp了

虽说如此,还是被卡了许久,太久没打ctf导致的

这题payload找不到了,我先复现下
1 | POST /?zero=ZeroG%202026!%0A&xp=1e9 HTTP/1.1 |
一共三关
| 1 | zero=ZeroG%202026!%0A |
PCRE 的 $(无 D 修饰符)匹配结尾换行之前的位置,所以 "ZeroG 2026!\n" 能被正则命中,但 !== 'ZeroG 2026!' 成立(多了一个 \n) |
|---|---|---|
| 2 | xp=1e9 |
intval("1e9") 只取整数前缀 = 1(< 2026),而 "1e9" + 4 按科学计数法算 = 1000000004(> 2030) |
| 3 | Welcome[_ctf.2026=240610708 + mm=QNKCDZO |
MD5 魔术哈希,两个 0e 纯数字串松散比较相等;$a !== $b 成立因为明文不同 |
印象里比较深的就是 [ 会被解析为[ 然后什么会被解析成.我忘了,等题目复现了,和本地复现情况不太一样
大致和极客大挑战的大差不差。
Stage2一史迪仔的文件预览器


这题目一眼目录跨越,但是还是试了很久


通过原代码和URL收集到几个关键信息
试过伪协议,还有普通的文件跨越都不行../../../../

测试发现是单趟字符串替换,过滤器大概模样是:
1 | $file = str_replace('../', '', $_GET['file']); |

根据这个也是成功读到了源码

后面想起来读这个文件,找到了flag的位置

Pwn01 — 胖!什么是胖?
课业繁忙,出于时间原因 pwn只做了两道,下次比赛务必努力
这道题纯签到,没什么好说的

Stage1 — FlaskLogin

这题目先直接通过首页给的账户密码登录
然后注意这个🔑ctf2026 这个就是secret
Flask 会话签名是双层 HMAC——先用 SECRET_KEY 派生出签名密钥
1 | import base64, hashlib, hmac, json, time, struct |
验签通过后得到flag
flag{fl4sk_s3ss10n_1s_n07_s3cur3}
RE07 — 诶,捡到了一部野生手机耶
这题直接拿到一血,证明实力
安装apk发现有个秘密频道


解锁这个页面
尊贵的MT管理器会员直接去改smali




直接写死返回true就行了,没什么难度
stage 3 幽灵提交 Ghost Commit
首先下载题目

在悬空提交这里找到一条记录 直接读取
1 | git fsck |

拿到密文
1 | YlBEViV+WFFfTgcJVQ1WVQ9RG1pSClIdDANTAE8BUQIBGA4AWwEFBV0FAAtaWUk= |
也是给提示了,直接脚本还原即可
1 | import base64 |
ZeroGFlag{1075be7d-c02f-46e9-9e29-899915e0628a}
Pwn02 — ELF?这茂密能吃吗?

这题目更是跟着GUIDE宝宝级教程往后做就行了
1 | from pwn import * |
Stage3—重生之我在零重力屋顶当“卷王”


这题目直接修改成绩 向api发包就能拿到flag
游戏源码都是明文的,发包的成绩是base64 拦截发送即可
Stage1—小小的e
经典RSA
1 | # RSA 的加密公式是 c = me mod n。先看看 e 有多“小”。 |
RE01 — 藏了,但没完全藏
首先Hxd16进制查看文件拿到密文

然后发现是凯撒加密 但是注意数字也要位移


Stage2 — MagicInvoker
这题秒的太快了,录屏没录上,是不是PHP魔术方法+POP 链条执行
想起来了,题目给了四个魔术方法,直接反序列化调用RCE读取flag就行
本文作者 Allureluoli
文字版权归作者所有,转载请注明出处;商业用途请先联系二月。