题目列表与官方题解

Hackergame 启动

检查可得,相似度获取是GET,直接修改url的参数即可
虽然我一开始网页缩放问题没看见,尝试了把上传音频文件直接替换为检测目标文件,感觉应该也可以

鉴定为不太行,波形图由Canvas绘制,相似度比较代码如下

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
const getImageData = (canvas) => {
const ctx = canvas.getContext("2d");
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
return imageData;
}

const computeSimilarity = (imageData1, imageData2) => {
const data1 = imageData1.data;
const data2 = imageData2.data;
const len = data1.length;
let diff = 0;
for (let i = 0; i < len; i += 1) {
diff += Math.abs(data1[i] - data2[i]) / 255;
}
return 1 - diff / (len / 4);
}

const getCurrentSimilarity = () => {
const c1 = getCanvasByContainer(document.querySelector('#ref-wave'));
const c2 = getCanvasByContainer(document.querySelector('#record-wave'));

if (c1 === null || c2 === null) {
return 0;
}

const imageData1 = getImageData(c1);
const imageData2 = getImageData(c2);

const similarity = computeSimilarity(imageData1, imageData2);
return similarity;
}

直接比较波形图,但之前Canvas绘制时选择了不同的颜色

猫咪小测

图书馆找书

直接进入中科大的图书馆系统,发现这本书已经干上今日热搜了: ) ,获得了索书号,虽然没什么用,因为还是不知道在几楼.

giao,光标放到馆藏地上直接就会显示西区图书馆12楼

最终通过中科大图书馆馆藏分布得到西区外文书库在12
当然,这道题也可以直接暴力

可观测宇宙中的鸡的密度上限

既然题干说了是在arXiv上,那就直接找到Nuggets of Wisdom: Determining an Upper Limit on the Number Density of Chickens in the Universe
当然,依然有人直接暴力说的就是你gxk : )

编译Linux内核

我也不太懂,但是ChatGPT直接告诉了我答案

mypy死循环

Google还是好用的,很快就找到了文章
可惜我瞎了,一直在纠结网站的DROPS,就是没看见ECOOP

更深更暗

还没来得及看代码,滚轮往下滚的时候直接看到了flag,遂直接截图然后手打flag

oh原来chromium是可以暂停js脚本的啊,一直都是在Firefox里禁用的

旅行照片 3.0

真没想到哦,题前舷窗图上竟然还能看到去年的千叶海洋球场

神秘奖牌

照片似乎被前端加水印处理了,exif无法获得数据,于是日期直接用的爆破
奖牌就直接先访问东京大学诺贝尔奖展览馆,找到最年轻的梶田隆章,甚至下面直接贴心的给出了東京大学宇宙線研究所

这是什么活动?

误入歧途最久的题目
中午吃饭的拉面馆很快就在Google地图上找到了,就在东京大学西边对街,然后就开始在边上寻找那个广场与喷泉.因为题干特意强调饭后步行,致使我的搜索范围一直用街景在周围转来转去主要也是第一次发现一米长的带鱼屏看街景这么带感,于是开始Tokyo Tour😇,直到看了看第三题的上野站,才终于发现了让我漫步一下午都没找到的上野公园喷泉,结果发现其实步行也不远,主要还是被东京密集的建筑影响,导致距离感出现了偏差

啊啊啊我是哈批,鉴定为GeoGusser玩多了,连图片搜索都不会了

找到了上野公园,很快就把题做出来了,检索Tokyo 2023.08.10 上野公園,很快就找到了活动全国梅酒节,再搜索一下日语志愿者ボランティア,就找到了募集宣传页
街对面的博物馆,大名鼎鼎的东京国立博物馆下午Tokyo Tour我怎么没想到来这看看,淦,访问官网得知门票1000円,大学生500円,不过这不过是一般的大学生,对于合作的教育校园成员免费,所以最终答案是0

后会有期,学长!

一觉醒来,一血被抢了,破大防,到时候再做

漏掉了关键细节,脖子上挂绳的STATPHYS28,当时注意到了,不过以为是个相机挂绳 : (
于是可以找到官网晚上活动,
Meeting Point
6:00pm, August 10th (Thursday) all the participants must gather on time South side of Yasuda Auditorium (see the map below)

上野站门口的「ボタン&カフリンクス」倒是搜到了,也就是Buttons & Cofflinks,但是没有搜索出进一步的信息,现在看题解,为什么不用Google Japan呐,哎
不过和题解不一样,我复现时找到了一篇Instagram,是一家面包店做的活动限定熊猫面包
贴一下上野站的官方活动宣传图吧
img

Nintendo Tokyo倒是找到了,但一直没有看到相似的外橱窗一直不敢确认,总之没有找错

于是可以知道在涩谷站出站,但凡看过忠犬八公物语,就知道秋田犬在涩谷的地位,虽然复现的时候并不能很好地得到信息,不过确实找到了个展示视频
video

赛博井字棋

放在旅行照片后面没想到这么简单.giao
想多了,以为需要在bp里修改发送数据,能够一次下多步,于是发现cookie一直在变,尝试找了找规律,无果
然后开摆,用bp尝试覆盖对面下的位置,就tm成功了emm

奶奶的睡前flag故事

题干特意加粗,Pixel手机,老系统,截图.看图可以分辨率是1080*1068,发现照片被裁切了.立刻想起之前上课摸鱼看过的文章提到过这个0day漏洞,CVE-2023-21036,acropalypse,然后甚至直接发现了复现网站

组委会模拟器

抓包,获取/api/getMessages,可以看到生成的消息,于是写个小脚本处理一下
用C++写实在是太麻烦了,可是Python总是写不好,太烦恼了
不行,得好好把Python系统学一学

23.11.01 电脑装系统去了,比赛开摆 : (

题解采用了JavaScript的脚本,看是能看懂一些,让我写目前还是真写不出来.先贴一下,到时候再自己补一下注释

1
2
3
4
5
setInterval(() =>
Array.from(document.querySelectorAll(".fakeqq-message__bubble"))
.filter((element) => element.innerHTML.indexOf("hack[") != -1)
.forEach((element) => element.click())
, 100)

还有gxk的Python来模拟请求

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import requests
import re
import time

# 定义基本的 URL 和请求头
BASE_URL = "http://202.38.93.111:10021"
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.121 Safari/537.36",
"Content-Type": "application/json",
"Origin": "http://202.38.93.111:10021",
"Referer": "http://202.38.93.111:10021/",
"Cookie": "session=eyJ0b2tlbiI6IjQ1MzpNRVVDSUJ3ZE1jd1RURkR2RlZwSGFRcXE0Tm94bzBSdnVGRDZzdExFNTJHOU42NlNBaUVBOEdXWGRXY1orN2pIeXFneUxxQTIyWDZDc2RoY3ZLblVPNjNjemFLMy8xUT0ifQ.ZTz5oQ.59uj_HyyOdElcS6oMKyqOq2koDo"
} #gxk的cookie

# 获取消息
def get_messages():
response = requests.post(f"{BASE_URL}/api/getMessages", headers=HEADERS)
if response.status_code == 200:
return response.json()
return []

# 删除消息
def delete_message(message_id):
payload = {"id": message_id}
response = requests.post(f"{BASE_URL}/api/deleteMessage", headers=HEADERS, json=payload)
if response.status_code == 200:
print("delete message: ",message_id,' ', response.text,'\n')

def get_flag():
response = requests.post(f"{BASE_URL}/api/getflag", headers=HEADERS)
if response.status_code == 200:
return response.text
return None
# 主执行逻辑
start_time = time.time()
messages = get_messages()
print(messages)
i = 0
lastmessage = ''
for message in messages['messages']:
match = re.search(r'hack\[[a-z]+\]', message['text'])

if match:
while(1):
# print(i)
end_time = time.time()
if end_time - start_time > message['delay'] :
delete_message(i) # 这里假设每个消息还有一个'id'字段。如果没有,你需要根据实际情况进行调整。
break
print(' ',message,'\n')
i = i + 1
lastmessage=message
time.sleep(7)
flag = get_flag()
print("Received flag:", flag)

业余无线电SSTV,以前玩无线电那会还是高中的时候
直接下载RX-SSTV,因为串流的原因,能一边监听信号,另一边软件也在解码了
SSTV
好多高中的爱好到了大学反而没再继续研究了,很是可惜

JSON ⊂ YAML?

只是理解了一下代码,但JSONYAML之间的关系没有深究
不过题目应该还是考察了Python库解析的问题

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
# pip install PyYAML==6.0.1 ruamel.yaml==0.17.40 ruamel.yaml.clib==0.2.8
import json
import yaml
import ruamel.yaml

s = input('Input your JSON: ')

# 作为 JSON 读取
as_json = json.loads(s)
print('As JSON:', repr(as_json))

# 作为 YAML 1.1 读取,如果和作为 JSON 读取的结果不同,即可获得 flag1
as_yaml_1_1 = yaml.safe_load(s)
print('As YAML 1.1:', repr(as_yaml_1_1))

if as_json != as_yaml_1_1:
print('Flag1:', open('flag1').read())
else:
print('No flag1')

# 作为 YAML 1.2 读取,如果出现异常,即可获得 flag2
try:
ruamel.yaml.safe_load(s)
except Exception:
print('Flag2:', open('flag2').read())
else:
print('No flag2')

JSON ⊄ YAML 1.1

让输入的JSON不能被YAML 1.1解析就行

JSON ⊄ YAML 1.2

让输入的JSON能被YAML 1.1解析,但不能被YAML 1.2解析就行

Git? Git!

把文件下载到本地,直接用TortoiseGit查看
出于Git还是不太熟练,一开始一直在Log tree里查看,但其实不包括已经被删除的commit记录和 reset 的操作,正确方法应该是查看RefLog tree

个人再理解,RefLog会在进行上述操作时,完整备份操作树,便于本地回退

HTTP 集邮册

本题旨在构造HTTP请求,来获得不同响应的HTTP 状态码 | 菜鸟教程
构造方式可参照HTTP 响应状态码 - HTTP | MDN (mozilla.org)
还有taoky的题解确实写得很详细

Docker for Everyone

Docker用户组提权,具体得还得再琢磨一下,做题应该够了

惜字如金 2.0

一道非常适合暴力的题目
为什么我不会Python

高频率星球

本质上是从文本中还原代码
题解脚本

1
2
3
4
5
6
7
8
9
import json
rec = open("asciinema_restore.rec").read().splitlines()
f = ''
for l in rec[38:]:
s = json.loads(l)[-1]
if ':\x1b[K' in s:
s = s[:s.index(':\x1b[K')]
f += s.replace('\x1b[K','').replace('~\x08~','').replace('6\x086','').replace('ESC\x08\x08\x08ESC[\x08[','')
open('flag.js','w').write(f)

为什么我还是不会Python

小型大语言模型星球

第一次碰到这种题型,有点懵
不过尝试可以发现不是像GPT那样的回答响应模型,更像是顺着提问的一种故事补全

You Are Smart