CTF - Hackergame 2023 WriteUp
写在前面
第一次参加 hackergame,好玩、爱玩、多玩!
正文
Hackergame 启动
flag{wE!cOmE-70-HaCKER9@M3-@ND-ENjoy-h@cK!ng-20Z3}
在开发者工具可以发现,音频是在前端的 JS 代码中计算的,通过 URL 传参给后端判断
所以我们可以自己去设置 similarity 的值,拿到 flag,是一个很有趣的界面
猫咪小测
flag{w3LcOm3-to-47t3ND-tH3-nek0-3xaM-zOz3}
flag{re4l-m@$73R-of-the-n3K0-3xam-iN-uS7c}
四道搜索题,下列为各题解答方式:
- 这题有两种解法,第一种是去中科大的图书馆网站去搜索,第二种是穷举,最终答案是 12
- 这题可以直接去知乎搜索,有个帖子正好讲了这个论文,当然也可以选择穷举,最终答案是 23
- 这题可以去 ChatGPT 问,也可以去下载 linux kernel 然后全局搜索 BBR,最终答案是 CONFIG_TCP_CONG_BBR
- 这题让我很头大,最终在 Google 上以 “Python type infinite loop” 为关键词找到了答案 ECOOP
更深更暗
flag{T1t@n_e8afe7610a9adb33636834d4f668e5e0}
这题很简单,开发者工具就能找到网页中的潜艇
如果是一直往下翻的话,网页的 JS 脚本会不断地生成水域,很难找到
旅行照片 3.0
flag{how_I_wi5h_i_COulD_w1N_A_Nobe1_pri23_84805398a7}
flag{PluM_w1NE_1S_rEa1LY_EXpen5iVE_794735bb60}
flag{Un7I1_W3_M337_A64iN_6oODByE_S3n1OR_f3a1e3372c}
六道搜索题,下列为各题解答方式:
- 根据第二张图,最左边那位学长肩旁的那一个 ** ** 我们可以找到该学术活动的官方网站 https://statphys28.org/banquet.html,通篇看完题目,可以确定学长参加的学术会议就是这个活动,这个活动持续时间为2023年8月7日至2023年8月11日,结合后续的乘船环节,于是我们获得了第一个问题的答案,这一天是在 8月10日,学长的学校是 东京大学
- 上网查询可知,这个奖章是诺贝尔奖的背面。于是在 Google 上搜索东大展览中的诺贝尔获奖者清单 https://www.s.u-tokyo.ac.jp/en/gallery/nobelprize,逐个排查后,找到年龄最小的获奖者是 **2015年获奖的梶田隆章(Takaaki Kajita)**,他在东京大学宇宙射线研究所(Institute for Cosmic Ray Research, ICRR)工作,故答案为 ICRR
- 已经得知当天时间为 8月10日,上 Twitter 并结合上野公园这个时间段,我们可以找到这个活动主办方 https://twitter.com/umeshu_matsuri,8月10日他们在上野公园喷水池附近举办了梅酒活动 https://twitter.com/umeshu_matsuri/status/1689516712818044928,找到志愿者报名表链接为 https://ws.formzu.net/fgen/S495584522/ ,答案为 S495584522
- 找到东京国立博物馆的官网为 https://www.tnm.jp/modules/r_free_page/index.php?id=113#access_01,大学生票价为免费,所以答案为 0
- 承接前文该学术活动的官方网站,可以发现 18:00 参与者要在 Yasuda Auditorium 附近集合坐船,翻译得到答案为 安田讲堂
- 直接以 ボタン&カフリンクス 为关键词,我们可以在 Twitter 上找到可能的帖子,发现动物为 熊猫;在互联网上搜索日本的马里奥世界,发现大阪有一个任天堂乐园,因为坐电车从东京到大阪就很不合理,排查后应该为涩谷站的任天堂旗舰店,再搜索可知这个 3D 动物品种为 秋田犬
赛博井字棋
flag{I_can_eat_your_pieces_ca3a248208}
不难发现,前端的数据通过 JS 代码里的 setMove(x, y) 函数来发送,于是我们可以发送假数据,最终获得 flag
奶奶的睡前 flag 故事
flag{sh1nj1ru_k0k0r0_4nata_m4h0}
这是一道图片隐写的题目,发现题目中的加粗字体提到了 Google 和系统没升级等字样。推测应该是 Google 的某个牌子的手机在系统升级前存在漏洞。上网查询后得知确实如此(一个被称为ACropalypse的漏洞),去 github 查询相关的复原工具后,得到 flag
组委会模拟器
flag{Web_pr0gra_mm1ng_be8ea63db5_15fun}
去开发者工具查看网络情况可以发现,网页通过 getMessage 函数获取消息信息、delete_message 来撤回消息,getFlag 来获取 flag。在本地通过 python 脚本来模拟这个交互过程,需要注意的就是定时器的设置,一定要确保消息已经发送了再撤回(可以用 python 内置的 time 库)
1 | import requests |
虫
flag{SSssTV_y0u_W4NNa_HaV3_4_trY}
通过题目中的关键词可以查到一种通过高频波段来传输图片的方式,下载到对应的转译工具( https://hamsoft.ca/pages/mmsstv.php )后播放音乐,可以得到以下图像,拿到 flag
JSON ⊂ YAML?
flag{faf9facd7c9d64f74a4a746468400a50184f834122}
flag{b1c73f14d04db546b7e7e24cf1cc72520023e1fbc0}
主要是构造一个符合条件的 json,这道题解法非常多,在此给出一种,能同时获取两个 flag
1 | {"a":NaN, "a":NaN} |
Git? Git!
flag{TheRe5_@lwAy5_a_R3GreT_pi1l_1n_G1t}
git 操作,主要是去查看 log 文件夹里的内容,用相关的指令就可以找到被撤销的 flag 了
1 | git show 505e1a3f446c23f31807a117e860f57cb5b5bb79 |
HTTP 集邮册
flag{d1d you hear the HTTP packet from 1991?}
flag{stacking_up_http_status_codes_is_fun_2e34303358}
flag{I think that when many such status codes are accumulated dfa9d355c4 it becomes a lifetime}
做题很简单,直接现场问GPT能不能构造
100
1
2
3
4
5GET / HTTP/1.1\r\n
Host: yournginxserver.com\r\n
Expect: 100-continue\r\n
Content-Type: application/x-www-form-urlencoded\r\n
Content-Length: 15\r\n\r\n200
1
2GET / HTTP/1.1\r\n
Host: example.com\r\n\r\n206
1
2
3GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=0-3\r\n\r\n304
1
2
3GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
If-Modified-Since: Tue, 15 Aug 2023 17:04:04 GMT\r\n\r\n400
1
curl http://baidu.com
404
1
2GET / HTTP/1.1\r\n
Host: example.com\r\n\r\n405
1
2PUT / HTTP/1.1\r\n
Host: example.com\r\n\r\n413
1
2
3
4
5POST / HTTP/1.1 \r\n
Host: example.com \r\n
Content-Type: application/x-www-form-urlencoded \r\n
Content-Length: 13000000000 \r\n
key=value&foo=bar\r\n\r\n414
1
2GET /?query=LONG_PARAMS HTTP/1.1\r\n
Host: example.com\r\n\r\n416
1
2
3GET /index.html HTTP/1.1\r\n
Host: example.com\r\n
Range: bytes=200000-300000\r\n\r\n505
1
2GET /index.html HTTP/9.9\r\n
Host: example.com\r\n\r\n412
1
2
3GET /index.html HTTP/1.1\r\n
Host: yournginxserver.com\r\n
If-Match: "67890"\r\n\r\n
Docker for Everyone
flag{u5e_r00tless_contalner_7af00e24ac_plz!}
考察 Docker 提权,参考文章链接为 https://www.freebuf.com/articles/system/170783.html
1 | docker run -it --rm -v /dev:/dev alpine |
惜字如金 2.0
flag{you-ve-r3cover3d-7he-an5w3r-r1ght?}
读代码可以发现它的每一个cod_dict 都要判定长度是24,而数一下可以发现长度是23
所以每个都要补全一个字母,通过固定位置必须是 flag{ 和 } 来推定位置
最终推导得到 code_dict 如下,有二义的地方用 “|” 代替
1 | code_dict = [] |
高频率星球
flag{y0u_cAn_ReSTorE_C0de_fr0m_asc11nema_3db2da1063300e5dabf826e40ffd016101458df23a371}
在 linux 上使用 asciinema,并把输出的内容重定向到一个文本文件中,把终端内容里的杂七杂八的字符过滤后得到一个两三万行的 JS 文件,在本地 node.js 环境运行后得到 flag
小型大语言模型星球
flag{1-th!nk-Y0u-ARE-Re4llY-real!Y-Sm4Rt}
flag{YOu-4re-@cCEPt3D-7o-c0ntINue-7He-G4ME}
直接去 huggingface 找这个模型的训练集,网址链接如下 https://huggingface.co/datasets/roneneldan/TinyStories/tree/main,在里面我们可以找包含 smart 和 accepted 的字串,然后简单枚举得到 flag;后两个 flag 没在训练集里找到,也就没拿到
流式星球
flag{it-could-be-easy-to-restore-video-with-haruhikage-even-without-metadata-0F7968CC}
CV 题,主攻 AI 的如果连这题都没切那可真是太丢脸了(,通过 numpy 操作获取一张张视频帧,最后连成一个视频,很明显是 MyGO 的片段
低带宽星球
flag{A1ot0f_t0015_is_available_to_compre55_PNG}
随便找个压缩软件就能搞定第一问了,第二问不会,寄
Komm, süsser Flagge
flag{ea5Y_sPl1tt3r_466e82e14b}
flag{r3s3rv3d_bYtes_998a1267be}
逐个发送 TCP 的请求字符就可以了,第三问有思路,可惜没时间做了
1 | import socket |
为什么要打开 /flag 😡
flag{nande_ld_preload_yattano_3b9d39741f}
这题只要用 gcc 的静态编译就可以阻止 LD_PRELAOD 了,第二问可以做可惜没时间看
异星歧途
flag{B34WarE_0f_#xp1osi0N_ad18568e94}
很好玩的游戏,真的,hackergame 过后我都迷上这款游戏了,像素、策略、塔防、沙盒、城堡,真的太戳我了!
这题主要注意这么几个东西:
- 重要设备能否稳定运行
- 物品是如何流动的
- 微型处理器的逻辑
最终合法序列是 10100101110001001000110001110111