|
| 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 | + |
| 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 | + |
| 27 | + |
| 28 | +## 更深更暗 |
| 29 | +- > **flag{T1t@n_e8afe7610a9adb33636834d4f668e5e0}** |
| 30 | +
|
| 31 | +这题很简单,开发者工具就能找到网页中的潜艇 |
| 32 | +如果是一直往下翻的话,网页的 JS 脚本会不断地生成水域,很难找到 |
| 33 | + |
| 34 | + |
| 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 | + |
| 50 | + |
| 51 | + |
| 52 | + |
| 53 | + |
| 54 | + |
| 55 | + |
| 56 | +## 赛博井字棋 |
| 57 | +- > **flag{I_can_eat_your_pieces_ca3a248208}** |
| 58 | +
|
| 59 | +不难发现,前端的数据通过 JS 代码里的 setMove(x, y) 函数来发送,于是我们可以发送假数据,最终获得 flag |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +## 奶奶的睡前 flag 故事 |
| 64 | +- > **flag{sh1nj1ru_k0k0r0_4nata_m4h0}** |
| 65 | +
|
| 66 | +这是一道图片隐写的题目,发现题目中的加粗字体提到了 Google 和系统没升级等字样。推测应该是 Google 的某个牌子的手机在系统升级前存在漏洞。上网查询后得知确实如此(一个被称为**ACropalypse**的漏洞),去 github 查询相关的复原工具后,得到 flag |
| 67 | + |
| 68 | + |
| 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 | + |
| 112 | + |
| 113 | +## 虫 |
| 114 | + |
| 115 | +- > **flag{SSssTV_y0u_W4NNa_HaV3_4_trY}** |
| 116 | +
|
| 117 | +通过题目中的关键词可以查到一种通过高频波段来传输图片的方式,下载到对应的转译工具( **https://hamsoft.ca/pages/mmsstv.php** )后播放音乐,可以得到以下图像,拿到 flag |
| 118 | + |
| 119 | + |
| 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 | + |
| 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 | + |
| 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 | + |
| 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 | + |
| 266 | + |
| 267 | +## 高频率星球 |
| 268 | + |
| 269 | +- > **flag{y0u_cAn_ReSTorE_C0de_fr0m_asc11nema_3db2da1063300e5dabf826e40ffd016101458df23a371}** |
| 270 | +
|
| 271 | +在 linux 上使用 asciinema,并把输出的内容重定向到一个文本文件中,把终端内容里的杂七杂八的字符过滤后得到一个两三万行的 JS 文件,在本地 node.js 环境运行后得到 flag |
| 272 | + |
| 273 | + |
| 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 | + |
| 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 | + |
| 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 | + |
| 346 | + |
| 347 | +## 异星歧途 |
| 348 | + |
| 349 | +- > **flag{B34WarE_0f_#xp1osi0N_ad18568e94}** |
| 350 | +
|
| 351 | +很好玩的游戏,真的,hackergame 过后我都迷上这款游戏了,**像素、策略、塔防、沙盒、城堡**,真的太戳我了! |
| 352 | + |
| 353 | +这题主要注意这么几个东西: |
| 354 | +- **重要设备能否稳定运行** |
| 355 | +- **物品是如何流动的** |
| 356 | +- **微型处理器的逻辑** |
| 357 | + |
| 358 | +最终合法序列是 **10100101110001001000110001110111** |
| 359 | + |
| 360 | + |
| 361 | + |
| 362 | +--- |
0 commit comments