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
最后更新于 2026 年 2 月 2 日 21:39