RiK's Blog - 俱往矣
type: channel
link: https://pwnerik.cn/category/legacy/
description: The good old days...
items: Hackergame 2023 Writeup
items: 一些早期作品

Hackergame 2023 Writeup
type: item
date: 2023-11-05T04:02:00+00:00
description: 作者: RiK (3050/223)第一次参加 HG，明显感受到出题质量很高，做起来整体感觉很爽！（后面好难，一个都不会呃呃）取部分解出题目写一篇 WP。新人实力有限，有误望指正。1. 赛博井字棋打开题目玩了几局后发现不可能以正常方式解题。而后尝试伪造 POST 请求，发现比较复杂（作为备选方案）。打开浏览器开发人员工具 (F12) 注意到以下代码：// static/script.js async function setMove(x, y) { if (board\[x\]\[y\] != 0) { return; } if (frozen) { return; } let url = window.location.href; // 获取当前 URL let data = { x: x, y: y }; // 设置要发送的数据 return fetch(url, { method: "POST", // 设置方法为 POST headers: { "Content-Type": "application/json", // 设置内容类型为 JSON }, body: JSON.stringify(data), // 将数据转换为 JSON 格式 }).catch(errorHandler); }于是通过 Console 重新定义（覆盖）该函数并将前两个 if 语句删除，Restart，强制占用对手棋子位置，获胜得到 flag：flag{I_can_eat_your_pieces_53f95d1546}2. 组委会模拟器打开题目尝试手动撤回，不出意料消息发送过快，人工撤回不可能，于是编写 Python脚本自动撤回。（其实用 JS 直接监听更方便）import requests, re, json, asyncio async def send_delete(delay: float, id: int): await asyncio.sleep(delay) res = requests.post( "http://202.38.93.111:10021/api/deleteMessage", json={"id": id}, cookies={ "session": "[token]" }, headers={"Content-Type": "application/json"}, ) print(res.text) res = requests.post( "http://202.38.93.111:10021/api/getMessages", cookies={ "session": "[token]" }, headers={"Content-Type": "application/json"}, ) data = json.loads(res.text) illegal_req = [] id = 0 for msg in data["messages"]: if re.findall(r"hack\[[a-z]+\]", msg["text"]): illegal_req.append(send_delete(msg["delay"], id)) id += 1 await asyncio.gather(\*illegal_req) res = requests.post( "http://202.38.93.111:10021/api/getflag", cookies={ "session": "[token]" }, headers={"Content-Type": "application/json"}, ) print(res.text)由于单纯地 sleep() 后 requests.get() 的执行时间会因网络延时不断偏移预定值，可通过测量请求时间相减抵消，此处选用 asyncio 库并发解决。最后得到 flag：flag{Web_pr0gra_mm1ng_36a712733a_15fun}3. 虫由于以前玩过业余无限电，一看到这题当场乐了，使用安卓手机软件 Robot36，外录音频后自动解码 SSTV 图像结果如下：于是得到 flag：flag{SSssTV_y0u_W4NNa_HaV3_4_trY}4. Git? Git!一开始使用 git log 找了个遍发现根本没有包含 flag 的 commit，后来索性对所有文件暴力搜索关键词 "flag" 没有结果，后来意识到是它可能是以二进制形式存储。本想放弃，网上搜索发现 git reflog 可以显示存储在本地的更详细的操作历史：ea49f0c (HEAD -\> main) HEAD@{0}: commit: Trim trailing s…

一些早期作品
type: item
date: 2023-06-08T16:00:00+00:00
description: 本文发布于 2026 年 3 月。想要搭建一个博客的想法从高中就有了，不过一直没有足够的动力完成这件事。直到后来在大学接触到 CTF 才重拾搭建个人网站的兴趣。在高中那段时间的一些简陋的小玩意就全都放在这里啦。（留作回忆）Minecraft Bukkit 声明式命令框架高中时（2021）和一个同班同学琢磨着开一个 Minecraft 插件服务器骗钱，在那段时间写了很多服务器插件。（记得当时经常需要逆向分析一些付费的闭源插件。）最终整个项目（PolarLand）因长期没有进展一直在折腾一些底层的架构而永久搁置。如果那时候有现在这样的 Agentic Coding 的话大概不会放弃吧。其中一个插件是将原本重复繁琐的处理玩家命令的功能写成一个声明式框架。说实话，里面有一些想法直到今天的我看来也是十分 hack (nerd) 的。比如为了将玩家传入的 x y z 坐标自动实例化为 Location 于是在运行时编译一个 Java 类来实现；还有一个 Array 转数组的魔法操作 parsedArgs.add(parsedArray.toArray((Object[]) Array.newInstance(type.getComponentType(), 0)))；以及后面的 tab 键补全嵌套的命令参数（参数的类型是命令）功能。核心源码：/* * Copyright 2022 pwnerik.cn * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.polarmc.bukkitplugin.poleax.kit.command.parser; import com.itranswarp.compiler.JavaStringCompiler; import net.polarmc.bukkitplugin.poleax.kit.command.CommandModel; import net.polarmc.bukkitplugin.poleax.kit.command.NoSuchCommandException; import net.polarmc.bukkitplugin.poleax.kit.command.annotation.Optional; import net.polarmc.bukkitplugin.poleax.kit.command.annotation.*; import net.polarmc.bukkitplugin.poleax.kit.command.util.Util; import net.polarmc.bukkitplugin.poleax.utils.MessageUtil; import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.command.PluginCommand; import org.bukkit.command.TabExecutor; import org.bukkit.entity.Player; import org.bukkit.help.HelpTopic; im…