Skip to content

Commit 185de76

Browse files
authored
Add Tokisakix's writeup (USTC-Hackergame#71)
* Create .gitkeep * Create README.md * Update README.md * Add files via upload * Update README.md * Update README.md
1 parent 23db33c commit 185de76

25 files changed

+364
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@
105105
| [ranwen](players/ranwen/README.md) | 一般通过 | Hackergame 启动、猫咪小测、更深更暗、旅行照片 3.0、赛博井字棋、奶奶的睡前 flag 故事、组委会模拟器、虫、JSON ⊂ YAML?、Git? Git!、HTTP 集邮册、Docker for Everyone、惜字如金 2.0、🪐 高频率星球、🪐 小型大语言模型星球、🪐 流式星球、🪐 低带宽星球(1)、Komm, süsser Flagge、异星歧途、为什么要打开 /flag 😡(1)、微积分计算小练习 2.0、O(1) 用户登录系统、链上猎手、小 Z 的谜题、黑客马拉松、不可加密的异世界 2 |
106106
| [Testla](players/Testla) | 总排名第 21 名 | Hackergame 启动、猫咪小测、更深更暗、旅行照片 3.0(1,2)、赛博井字棋、奶奶的睡前 flag 故事、组委会模拟器、虫、JSON ⊂ YAML?、Git? Git!、HTTP 集邮册、Docker for Everyone、惜字如金 2.0、🪐 高频率星球、🪐 小型大语言模型星球(1,2)、🪐 流式星球、🪐 低带宽星球(1)、Komm, süsser Flagge、为什么要打开 /flag 😡(seccomp 非预期解)、异星歧途、微积分计算小练习 2.0、O(1) 用户登录系统、小 Z 的谜题(1) |
107107
| [hzqmwne](players/hzqmwne/README.md) | 总排名第 10 名 | 补Hackergame2022:火眼金睛的小 E <br> Hackergame 启动、猫咪小测、更深更暗、旅行照片 3.0、赛博井字棋、奶奶的睡前 flag 故事、组委会模拟器、虫、JSON ⊂ YAML?、Git? Git!、HTTP 集邮册、Docker for Everyone、惜字如金 2.0、🪐 高频率星球、🪐 小型大语言模型星球 AI(You Are Smart、Accepted)、🪐 流式星球、🪐 低带宽星球(小试牛刀)、Komm, süsser Flagge(我的 POST、我的 P)、为什么要打开 /flag 😡、异星歧途、逆向工程不需要 F5、O(1) 用户登录系统、It's MyCalculator!!!!!、黑客马拉松(一発勝負)、不可加密的异世界 2 |
108+
| [Tokisakix](players/Tokisakix/README.md) | 总排名第81名 | Hackergame 启动、猫咪小测、更深更暗、旅行照片 3.0、赛博井字棋、奶奶的睡前 flag 故事、组委会模拟器、虫、JSON ⊂ YAML?、Git? Git!、HTTP 集邮册、Docker for Everyone、惜字如金 2.0、🪐 高频率星球、🪐 小型大语言模型星球(1,2)、🪐 流式星球、🪐 低带宽星球(1)、Komm, süsser Flagge(1,2)、为什么要打开 /flag 😡(1)、异星歧途 |
108109

109110
## 其他资源
110111

players/Tokisakix/.gitkeep

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

players/Tokisakix/README.md

Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
# 写在前面
2+
3+
**第一次参加 hackergame,好玩、爱玩、多玩!**
4+
5+
# 正文
6+
7+
## Hackergame 启动
8+
- > **flag{wE!cOmE-70-HaCKER9@M3-@ND-ENjoy-h@cK!ng-20Z3}**
9+
10+
在开发者工具可以发现,音频是在前端的 JS 代码中计算的,通过 URL 传参给后端判断
11+
12+
所以我们可以自己去设置 **similarity** 的值,拿到 flag,是一个很有趣的界面
13+
14+
![f1](f1.png)
15+
16+
## 猫咪小测
17+
- > **flag{w3LcOm3-to-47t3ND-tH3-nek0-3xaM-zOz3}**
18+
- > **flag{re4l-m@$73R-of-the-n3K0-3xam-iN-uS7c}**
19+
20+
四道搜索题,下列为各题解答方式:
21+
1. 这题有两种解法,第一种是去中科大的图书馆网站去搜索,第二种是穷举,最终答案是 **12**
22+
2. 这题可以直接去知乎搜索,有个帖子正好讲了这个论文,当然也可以选择穷举,最终答案是 **23**
23+
3. 这题可以去 ChatGPT 问,也可以去下载 linux kernel 然后全局搜索 BBR,最终答案是 **CONFIG_TCP_CONG_BBR**
24+
4. 这题让我很头大,最终在 Google 上以 "Python type infinite loop" 为关键词找到了答案 **ECOOP**
25+
26+
![f2](f2.png)
27+
28+
## 更深更暗
29+
- > **flag{T1t@n_e8afe7610a9adb33636834d4f668e5e0}**
30+
31+
这题很简单,开发者工具就能找到网页中的潜艇
32+
如果是一直往下翻的话,网页的 JS 脚本会不断地生成水域,很难找到
33+
34+
![f3](f3.png)
35+
36+
## 旅行照片 3.0
37+
- > **flag{how_I_wi5h_i_COulD_w1N_A_Nobe1_pri23_84805398a7}**
38+
- > **flag{PluM_w1NE_1S_rEa1LY_EXpen5iVE_794735bb60}**
39+
- > **flag{Un7I1_W3_M337_A64iN_6oODByE_S3n1OR_f3a1e3372c}**
40+
41+
六道搜索题,下列为各题解答方式:
42+
1. 根据第二张图,最左边那位学长肩旁的那一个 LOGO 我们可以找到该学术活动的官方网站 **https://statphys28.org/banquet.html** ,通篇看完题目,可以确定学长参加的学术会议就是这个活动,这个活动持续时间为2023年8月7日至2023年8月11日,结合后续的乘船环节,于是我们获得了第一个问题的答案,这一天是在 **8月10日**,学长的学校是 **东京大学**
43+
2. 上网查询可知,这个奖章是诺贝尔奖的背面。于是在 Google 上搜索东大展览中的诺贝尔获奖者清单 **https://www.s.u-tokyo.ac.jp/en/gallery/nobelprize** ,逐个排查后,找到年龄最小的获奖者是 **2015年获奖的梶田隆章(Takaaki Kajita)**,他在东京大学宇宙射线研究所(Institute for Cosmic Ray Research, ICRR)工作,故答案为 **ICRR**
44+
3. 已经得知当天时间为 **8月10日**,上 Twitter 并结合上野公园这个时间段,我们可以找到这个活动主办方 **https://twitter.com/umeshu_matsuri** ,8月10日他们在上野公园喷水池附近举办了梅酒活动 **https://twitter.com/umeshu_matsuri/status/1689516712818044928** ,找到志愿者报名表链接为 **https://ws.formzu.net/fgen/S495584522/** ,答案为 **S495584522**
45+
4. 找到东京国立博物馆的官网为 **https://www.tnm.jp/modules/r_free_page/index.php?id=113#access_01** ,大学生票价为免费,所以答案为 **0**
46+
5. 承接前文该学术活动的官方网站,可以发现 18:00 参与者要在 **Yasuda Auditorium** 附近集合坐船,翻译得到答案为 **安田讲堂**
47+
6. 直接以 **ボタン&カフリンクス** 为关键词,我们可以在 Twitter 上找到可能的帖子,发现动物为 **熊猫**;在互联网上搜索日本的马里奥世界,发现大阪有一个任天堂乐园,因为坐电车从东京到大阪就很不合理,排查后应该为涩谷站的任天堂旗舰店,再搜索可知这个 3D 动物品种为 **秋田犬**
48+
49+
![](f41.png)
50+
![](f42.png)
51+
![](f43.png)
52+
![](f44.png)
53+
![](f45.png)
54+
![](f4.png)
55+
56+
## 赛博井字棋
57+
- > **flag{I_can_eat_your_pieces_ca3a248208}**
58+
59+
不难发现,前端的数据通过 JS 代码里的 setMove(x, y) 函数来发送,于是我们可以发送假数据,最终获得 flag
60+
61+
![f5](f5.png)
62+
63+
## 奶奶的睡前 flag 故事
64+
- > **flag{sh1nj1ru_k0k0r0_4nata_m4h0}**
65+
66+
这是一道图片隐写的题目,发现题目中的加粗字体提到了 Google 和系统没升级等字样。推测应该是 Google 的某个牌子的手机在系统升级前存在漏洞。上网查询后得知确实如此(一个被称为**ACropalypse**的漏洞),去 github 查询相关的复原工具后,得到 flag
67+
68+
![f6](f6.png)
69+
70+
## 组委会模拟器
71+
72+
- > **flag{Web_pr0gra_mm1ng_be8ea63db5_15fun}**
73+
74+
去开发者工具查看网络情况可以发现,网页通过 **getMessage** 函数获取消息信息、**delete_message** 来撤回消息,**getFlag** 来获取 flag。在本地通过 python 脚本来模拟这个交互过程,需要注意的就是定时器的设置,一定要确保消息已经发送了再撤回(可以用 python 内置的 time 库)
75+
76+
```python
77+
import requests
78+
import json
79+
from time import perf_counter
80+
81+
headers = {
82+
"Cookie": "_ga=GA1.1.1982209457.1698511779; _ga_R1FN4KJKJH=GS1.1.1698557912.3.1.1698559589.0.0.0; session=eyJ0b2tlbiI6IjcyNDpNRVVDSVFEcXF0SUdUcFl4MnhQaVd5OThHb1hlUWRJRGFYbHR1YmhvR0Z6Q2FVUForUUlnZDA3OWcvbEkwUjVjckp6TFh1U1FlVERkSnVuN2d2Y3JjcTlCWUw4SXlKaz0ifQ.ZT9C6A.jvHCvdhPjUipRWBgY34OpJQpv3Q",
83+
"Host": "202.38.93.111:10021",
84+
"Content-Type": "application/json",
85+
"Origin": "http://202.38.93.111:10021",
86+
"Proxy-Connection": "keep-alive",
87+
"Referer": "http://202.38.93.111:10021/",
88+
}
89+
90+
request = requests.post(url="http://202.38.93.111:10021/api/getMessages", headers=headers)
91+
start = perf_counter()
92+
93+
messages = json.loads(request.content)["messages"]
94+
95+
for idx, message in enumerate(messages):
96+
delay = message["delay"]
97+
text = message["text"]
98+
if "这道题 flag 是hack[" in text:
99+
print(idx, delay, text)
100+
while perf_counter() < start + delay + 1:
101+
continue
102+
delete_message = requests.post(url="http://202.38.93.111:10021/api/deleteMessage", headers=headers, json={"id":idx})
103+
delete_message = json.loads(delete_message.content)
104+
print(delete_message)
105+
106+
flag = requests.post(url="http://202.38.93.111:10021/api/getflag", headers=headers)
107+
flag = json.loads(flag.content)
108+
print(flag)
109+
```
110+
111+
![f7](f7.png)
112+
113+
##
114+
115+
- > **flag{SSssTV_y0u_W4NNa_HaV3_4_trY}**
116+
117+
通过题目中的关键词可以查到一种通过高频波段来传输图片的方式,下载到对应的转译工具( **https://hamsoft.ca/pages/mmsstv.php** )后播放音乐,可以得到以下图像,拿到 flag
118+
119+
![f8](f8.png)
120+
121+
## JSON ⊂ YAML?
122+
123+
- > **flag{faf9facd7c9d64f74a4a746468400a50184f834122}**
124+
- > **flag{b1c73f14d04db546b7e7e24cf1cc72520023e1fbc0}**
125+
126+
主要是构造一个符合条件的 json,这道题解法非常多,在此给出一种,能同时获取两个 flag
127+
128+
```shell
129+
{"a":NaN, "a":NaN}
130+
```
131+
132+
![f9](f9.png)
133+
134+
## Git? Git!
135+
136+
- > **flag{TheRe5_@lwAy5_a_R3GreT_pi1l_1n_G1t}**
137+
138+
git 操作,主要是去查看 log 文件夹里的内容,用相关的指令就可以找到被撤销的 flag 了
139+
140+
```shell
141+
git show 505e1a3f446c23f31807a117e860f57cb5b5bb79
142+
```
143+
144+
![f10](f10.png)
145+
146+
## HTTP 集邮册
147+
148+
- > **flag{d1d you hear the HTTP packet from 1991?}**
149+
- > **flag{stacking_up_http_status_codes_is_fun_2e34303358}**
150+
- > **flag{I think that when many such status codes are accumulated dfa9d355c4 it becomes a lifetime}**
151+
152+
做题很简单,直接现场问GPT能不能构造
153+
154+
- **100**
155+
```HTTP
156+
GET / HTTP/1.1\r\n
157+
Host: yournginxserver.com\r\n
158+
Expect: 100-continue\r\n
159+
Content-Type: application/x-www-form-urlencoded\r\n
160+
Content-Length: 15\r\n\r\n
161+
```
162+
163+
- **200**
164+
```HTTP
165+
GET / HTTP/1.1\r\n
166+
Host: example.com\r\n\r\n
167+
```
168+
169+
- **206**
170+
```HTTP
171+
GET /index.html HTTP/1.1\r\n
172+
Host: example.com\r\n
173+
Range: bytes=0-3\r\n\r\n
174+
```
175+
176+
- **304**
177+
```HTTP
178+
GET /index.html HTTP/1.1\r\n
179+
Host: example.com\r\n
180+
If-Modified-Since: Tue, 15 Aug 2023 17:04:04 GMT\r\n\r\n
181+
```
182+
183+
- **400**
184+
```HTTP
185+
curl http://baidu.com
186+
```
187+
188+
- **404**
189+
```HTTP
190+
GET / HTTP/1.1\r\n
191+
Host: example.com\r\n\r\n
192+
```
193+
194+
- **405**
195+
```HTTP
196+
PUT / HTTP/1.1\r\n
197+
Host: example.com\r\n\r\n
198+
```
199+
200+
- **413**
201+
```HTTP
202+
POST / HTTP/1.1 \r\n
203+
Host: example.com \r\n
204+
Content-Type: application/x-www-form-urlencoded \r\n
205+
Content-Length: 13000000000 \r\n
206+
key=value&foo=bar\r\n\r\n
207+
```
208+
209+
- **414**
210+
```HTTP
211+
GET /?query=LONG_PARAMS HTTP/1.1\r\n
212+
Host: example.com\r\n\r\n
213+
```
214+
215+
- **416**
216+
```HTTP
217+
GET /index.html HTTP/1.1\r\n
218+
Host: example.com\r\n
219+
Range: bytes=200000-300000\r\n\r\n
220+
```
221+
222+
- **505**
223+
```HTTP
224+
GET /index.html HTTP/9.9\r\n
225+
Host: example.com\r\n\r\n
226+
```
227+
228+
- **412**
229+
```HTTP
230+
GET /index.html HTTP/1.1\r\n
231+
Host: yournginxserver.com\r\n
232+
If-Match: "67890"\r\n\r\n
233+
```
234+
235+
## Docker for Everyone
236+
237+
- > **flag{u5e_r00tless_contalner_7af00e24ac_plz!}**
238+
239+
考察 Docker 提权,参考文章链接为 **https://www.freebuf.com/articles/system/170783.html**
240+
241+
```shell
242+
docker run -it --rm -v /dev:/dev alpine
243+
cat /dev/shm/flag
244+
```
245+
246+
![f12](f12.png)
247+
248+
## 惜字如金 2.0
249+
250+
- > **flag{you-ve-r3cover3d-7he-an5w3r-r1ght?}**
251+
252+
读代码可以发现它的每一个cod_dict 都要判定长度是24,而数一下可以发现长度是23
253+
所以每个都要补全一个字母,通过固定位置必须是 flag{ 和 } 来推定位置
254+
255+
最终推导得到 code_dict 如下,**有二义的地方用 “|” 代替**
256+
```python
257+
code_dict = []
258+
code_dict += ['nymeh1niwemflcir}echaet|'] # 0 - 23
259+
code_dict += ['a3g7}kidgojernoetlsup?h|'] # 24 - 47
260+
code_dict += ['ulw!|f5soadrhwnrsnstnoeq'] # 48 - 71
261+
code_dict += ['ct|{l-findiehaai{oveatas'] # 72 - 95
262+
code_dict += ['ty9kxborszst|guyd?!blm-p'] # 96 - 119
263+
```
264+
265+
![f13](f13.png)
266+
267+
## 高频率星球
268+
269+
- > **flag{y0u_cAn_ReSTorE_C0de_fr0m_asc11nema_3db2da1063300e5dabf826e40ffd016101458df23a371}**
270+
271+
在 linux 上使用 asciinema,并把输出的内容重定向到一个文本文件中,把终端内容里的杂七杂八的字符过滤后得到一个两三万行的 JS 文件,在本地 node.js 环境运行后得到 flag
272+
273+
![f14](f14.png)
274+
275+
## 小型大语言模型星球
276+
277+
- > **flag{1-th!nk-Y0u-ARE-Re4llY-real!Y-Sm4Rt}**
278+
- > **flag{YOu-4re-@cCEPt3D-7o-c0ntINue-7He-G4ME}**
279+
280+
直接去 huggingface 找这个模型的训练集,网址链接如下 **https://huggingface.co/datasets/roneneldan/TinyStories/tree/main**,在里面我们可以找包含 **smart****accepted** 的字串,然后简单枚举得到 flag;后两个 flag 没在训练集里找到,也就没拿到
281+
282+
![f15](f15.png)
283+
284+
## 流式星球
285+
286+
- > **flag{it-could-be-easy-to-restore-video-with-haruhikage-even-without-metadata-0F7968CC}**
287+
288+
CV 题,主攻 AI 的如果连这题都没切那可真是太丢脸了(,通过 numpy 操作获取一张张视频帧,最后连成一个视频,很明显是 MyGO 的片段
289+
290+
![f16](f16.png)
291+
292+
## 低带宽星球
293+
294+
- > **flag{A1ot0f_t0015_is_available_to_compre55_PNG}**
295+
296+
随便找个压缩软件就能搞定第一问了,第二问不会,寄
297+
298+
## Komm, süsser Flagge
299+
300+
- > **flag{ea5Y_sPl1tt3r_466e82e14b}**
301+
- > **flag{r3s3rv3d_bYtes_998a1267be}**
302+
303+
逐个发送 TCP 的请求字符就可以了,第三问有思路,可惜没时间做了
304+
305+
```python
306+
import socket
307+
308+
def build_request(host, path, data):
309+
request = f"POST {path} HTTP/1.1\r\n"
310+
request += f"Host: {host}\r\n"
311+
request += "Content-Type: application/x-www-form-urlencoded\r\n"
312+
request += f"Content-Length: {len(data)}\r\n"
313+
request += "\r\n"
314+
request += data
315+
return request
316+
317+
def send_request(request, host, port):
318+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
319+
s.connect((host, port))
320+
for ch in request:
321+
s.sendall(ch.encode())
322+
response = s.recv(4096)
323+
324+
return response.decode()
325+
326+
# Replace with your server details
327+
host = "202.38.93.111"
328+
port = 18080
329+
path = "/"
330+
post_data = "724:MEUCIQDqqtIGTpYx2xPiWy98GoXeQdIDaXltubhoGFzCaUPZ+QIgd079g/lI0R5crJzLXuSQeTDdJun7gvcrcq9BYL8IyJk="
331+
332+
# Build and send the POST request
333+
post_request = build_request(host, path, post_data)
334+
response = send_request(post_request, host, port)
335+
336+
print(response)
337+
```
338+
339+
## 为什么要打开 /flag 😡
340+
341+
- > **flag{nande_ld_preload_yattano_3b9d39741f}**
342+
343+
这题只要用 gcc 的静态编译就可以阻止 LD_PRELAOD 了,第二问可以做可惜没时间看
344+
345+
![f19](f19.png)
346+
347+
## 异星歧途
348+
349+
- > **flag{B34WarE_0f_#xp1osi0N_ad18568e94}**
350+
351+
很好玩的游戏,真的,hackergame 过后我都迷上这款游戏了,**像素、策略、塔防、沙盒、城堡**,真的太戳我了!
352+
353+
这题主要注意这么几个东西:
354+
- **重要设备能否稳定运行**
355+
- **物品是如何流动的**
356+
- **微型处理器的逻辑**
357+
358+
最终合法序列是 **10100101110001001000110001110111**
359+
360+
![20](f20.png)
361+
362+
---

players/Tokisakix/f1.png

165 KB
Loading

players/Tokisakix/f10.png

96.2 KB
Loading

players/Tokisakix/f12.png

61.8 KB
Loading

players/Tokisakix/f13.png

197 KB
Loading

players/Tokisakix/f14.png

110 KB
Loading

players/Tokisakix/f15.png

247 KB
Loading

players/Tokisakix/f16.png

208 KB
Loading

0 commit comments

Comments
 (0)