USTC Hackergame 2023 个人 Writeup

HG 虐我千百遍,我待 HG 如初恋。

*小菜鸡一个,写不了几道题,单纯记录一下。所有题目版权归 USTCLUG 所有。

Hackergame 启动

初见题目,还以为是把相似度 POST 到服务器上,正准备 curl 一把梭,直到我点了一下提交。

好家伙,地址栏出现了一个 param,原来是个 GET,直接把 similarity 改为 114514,结束战斗。

感觉发现规律了,签到题经常出现改改地址栏就能解决的题目……

猫咪小测

今年的猫咪问答变简单了,感觉难度是逐年递减的亚子。再也没有 20/21 两年的压迫感了。

想要借阅世界图书出版公司出版的《A Classical Introduction To Modern Number Theory 2nd ed.》,应当前往中国科学技术大学西区图书馆的哪一层?

Google 到中科大图书馆网站,搜索馆藏,很容易找到在西区外文书库。回到网站首页找到馆藏分布,得外文书库在第 12 层。

今年 arXiv 网站的天体物理版块上有人发表了一篇关于「可观测宇宙中的鸡的密度上限」的论文,请问论文中作者计算出的鸡密度函数的上限为 10 的多少次方每立方秒差距?

在 arxiv.org 的 advanced search 上选择天体物理(astro-ph),搜索“density of chicken”,只有一个候选结果。

我也不知道什么叫每立方秒差距,但 abstract 有一句:

We find the most restrictive upper limit from the domains considered to be $10^{23}\ pc^{−3}$, which ruffles the feathers of long-standing astrophysics theory.

看来这 abstract 还真是简明扼要,答案就是 23

为了支持 TCP BBR 拥塞控制算法,在编译 Linux 内核时应该配置好哪一条内核选项?

Google “linux tcp bbr option”,得到答案为 CONFIG_TCP_CONG_BBR

这个题目问 GPT 也能得到很好的效果。

🥒🥒🥒:「我……从没觉得写类型标注有意思过」。在一篇论文中,作者给出了能够让 Python 的类型检查器 MyPY mypy 陷入死循环的代码,并证明 Python 的类型检查和停机问题一样困难。请问这篇论文发表在今年的哪个学术会议上?

不知道有没有人注意到“发表在今年的哪个学术会议上”这个很别扭的讲法,但题目从来没说是今年写的论文。在 Google Scholar 搜索“python type”,筛选今年的文章,然后……逐篇枚举。于是找到了答案 Python Type Hints Are Turing Complete,发表在 ECOOP 2023 上。

题目的迷惑性还是很大的,一方面 Google Scholars 并不能搜到 ECOOP 上的内容(而是标注为 drops.dagstuhl.de),另一方面仅靠标题和 abstract 并不能很容易对应题目的意思,甚至这篇文章也不是今年写的(2022 年就挂在了 arXiv 上)。

更深更暗

简单划了一下,看样子是个无限往下滑的网页,网页的长度会越来越长。直接打开开发者模式,搜索 flag,解决。

是我眼花了吗?我刚刚有一瞬间好像在残骸上看到了一个 flag?

或许也可以找一台足够低配的电脑,一直往下滑,生成跟不上滑动会卡,就能看到潜水艇字符画了

旅行照片 3.0

看样子旅行照片会比去年难一点儿,但不至于像 21 年一样没什么头绪。难点反而加在了日语上面。拜托组委会下次能不能找个英语系国家的地点……

1、你还记得与学长见面这天是哪一天吗?(格式:yyyy-mm-dd)

2、在学校该展厅展示的所有同种金色奖牌的得主中,出生最晚者获奖时所在的研究所缩写是什么?

直接找到“学长”脖子上挂的牌子,STATPHYS 28,得到地址为东京大学附近,23 年 8 月 7-11 日左右。打开 Google Maps,在东京大学附近找喷泉和博物馆,很容易找到上野公園和東京国立博物館(实际上附近博物馆很多)。

上野公園
上野公園

打开街景一看,完全一样有没有。这条信息先放下。

搜索奖牌上的名字 M. Kosiba(小柴昌俊),得到他确实在东京大学任职过。MMII 指 2002 年,他在 2002 年获得了帕诺夫斯基实验粒子物理学奖,以及诺贝尔物理学奖,查了一下,奖牌是诺奖的样式。

Google 搜索 “tokyo university nobel prize”(typo 应该为 university of tokyo),找到了东京大学理学部的 Science Gallery,确实是个展厅。在这个展厅中展出了三个诺贝尔物理学奖奖牌,分别为:

  • 小柴昌俊,2002,出生于 1926/09/19
  • 梶田隆章,2015,出生于 1959/03/09
  • 真锅淑郎,2021,出生于 1931/09/21

经过一点对最小的梶田隆章的搜索:

He became director of the Center for Cosmic Neutrinos at the Institute for Cosmic Ray Research (ICRR) in 1999. As of 2017, he is a Principal Investigator at the Institute for the Physics and Mathematics of the Universe in Tokyo, and Director of ICRR.

得到他在 2015 年位于 ICRR。回到题目,第一个问题直接在日期范围内进行暴力枚举,得到 2023-08-10

3、帐篷中活动招募志愿者时用于收集报名信息的在线问卷的编号(以字母 S 开头后接数字)是多少?

4、学长购买自己的博物馆门票时,花费了多少日元?

Google 筛选含有“上野公園 大噴水”、2023 年 8 月 1-10 日的网站,用日期反推这一日发生的活动,得到在举行“全国梅酒まつりin東京2023”,而且似乎确实在帐篷里,15 时开始也符合信息。搜索“全国梅酒まつりin東京2023 ボランティア”(2023 年东京全国梅酒节 志愿者),很容易找到招募志愿者的网站(ボランティアSTAFF大募集!!第6回「全国梅酒まつりin東京2023」),得到问卷编号 S495584522

根据“马路对面的喷泉”这一信息,确定了博物馆指的是东京国立博物馆(Tokyo National Museum)。答案是 0,不知道为什么。

5、学长当天晚上需要在哪栋标志性建筑物的附近集合呢?(请用简体中文回答,四个汉字)

6、进站时,你在 JR 上野站中央检票口外看到「ボタン&カフリンクス」活动正在销售动物周边商品,该活动张贴的粉色背景海报上是什么动物(记作 A,两个汉字)? 在出站处附近建筑的屋顶广告牌上,每小时都会顽皮出现的那只 3D 动物是什么品种?(记作 B,三个汉字)?(格式:A-B)

在 STATPHYS 28 网站上并没有找到 10 日晚上有什么活动,但 on-site plenary and special session 都在 Yasuda Auditorium(安田讲堂)。蒙对了。

搜索“ボタン&カフリンクス JR上野”,点进第一个结果,是熊猫(如下图)。

摊位的照片(图源上面的网站)
摊位的照片(图源上面的网站)

马里奥世界指的显然是 Nintendo Tokyo,谷歌地图指示在渋谷駅(涩谷站)下车,按照“渋谷駅 3D 看板”搜索,很容易得到秋田犬

赛博井字棋

众所周知,只要两边水平 够高 都不是那么菜,那么井字棋就只能下平局。但是,如果能“吃掉”别人的棋子呢……?

通过分析网络请求很容易看出,每次点击棋盘上没下的位置,都会发送一个形如 {"x":"0","y":"0"} 的 JSON 到服务器上,而服务器会返回一个描述棋盘的二维数组,还会有一个 Set-Cookie。看起来每个棋盘状态都会有一个对应的 Cookie。比如:

bash
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ curl -v -XPOST -H 'Cookie: session=eyJib2FyZCI6W1sxLDAsMF0sWzAsLTEsMF0sWzAsMCwtMV1dLCJ0b2tlbiI6Im1hc2tlZCJ9.ZTz-wA.fN5F9EKrWxW87_WtN-noABlu2_U; HttpOnly; Path=/' -H "Content-type: application/json" -d '{"x":"1","y":"1"}' 'http://202.38.93.111:10077/'
Note: Unnecessary use of -X or --request, POST is already inferred.
*   Trying 202.38.93.111:10077...
* Connected to 202.38.93.111 (202.38.93.111) port 10077
> POST / HTTP/1.1
> Host: 202.38.93.111:10077
> User-Agent: curl/8.4.0
> Accept: */*
> Cookie: session=eyJib2FyZCI6W1sxLDAsMF0sWzAsLTEsMF0sWzAsMCwtMV1dLCJ0b2tlbiI6Im1hc2tlZCJ9.ZTz-wA.fN5F9EKrWxW87_WtN-noABlu2_U; HttpOnly; Path=/
> Content-type: application/json
> Content-Length: 17
>
< HTTP/1.1 200 OK
< Server: nginx/1.23.2
< Date: Sat, 28 Oct 2023 12:33:57 GMT
< Content-Type: application/json
< Content-Length: 38
< Connection: keep-alive
< Vary: Cookie
< Set-Cookie: session=eyJib2FyZCI6W1sxLDAsMF0sWzAsLTEsMF0sWzAsMCwtMV1dLCJ0b2tlbiI6Im1hc2tlZCJ9.ZTz_tQ.cxnMFfNUi4gSU6CECDbO8E4evjw; HttpOnly; Path=/
<
{"board":[[1,0,0],[0,-1,0],[0,0,-1]]}

既然点击浏览器中已经有棋子的位置没有反应,那么就可以使用 curl 模拟请求,像上面这样。只需要在浏览器中随便点击一个棋子,然后复制 Set-Cookie 值,再把请求体设为刚刚电脑选择的位置,就可以吃掉电脑的棋子了。终于有三个棋子连起来的时候,服务器的 response 里面就会带 flag。

PS:状态信息似乎并不存在于服务器中,而是直接编码于 cookie 中。在 session 的值中,英文句号之前的位置就是 base64 编码的棋盘状态和做题者的 token(上面的 token 我都处理啦,不要解码了)。

组委会模拟器

这道题的核心在于如何快速找到对应的元素并模拟点击。靠人手点肯定不行的,但丰富的 刷网课 冲浪经验告诉我,可以使用用户脚本来自动扫描符合正则的元素。把它加载到对应的插件上(比如 Violentmonkey),就可以自动运行了。

我一行代码都没写,全靠 GPT。对于写简单的代码,GPT 已经完全可用了。附上完整对话

javascript
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// ==UserScript==
// @name        Hackergame Auto Withdraw
// @namespace   Violentmonkey Scripts
// @match       http://202.38.93.111:10021/
// @grant       none
// @version     1.0
// @author      cyp0633 (with GPT-3)
// @description 2023/10/30 16:06:16
// ==/UserScript==


(function() {
    'use strict';

    // Regular expression to match "hack[...]" with any text inside "[...]"
    const regex = /hack\[[^\]]+\]/;

    // Function to detect and click on elements matching the regular expression
    function autoClickHackContent() {
        const elements = document.querySelectorAll('*'); // Select all elements on the page (you can narrow this down if needed)

        for (const element of elements) {
            if (regex.test(element.textContent)) {
                element.click();
            }
        }
    }

    // Run the detection function every 1 second
    setInterval(autoClickHackContent, 1000);
})();

这段代码每秒钟遍历一次网页上的元素,遇到匹配 flag 正则的内容就点击它。在 MBP13 2020 上,使用 Firefox,速度完全可以跟上撤回消息。

许可证:CC BY-SA 4.0
最后更新于 2023 年 11 月 4 日 12:55