「Hackergame 2022」#1 Writup 开局杀题

这篇 Writeup 写一下 Hackergame 2022 里刚开局时做的一些简单题:
签到、猫咪问答喵、家目录里的秘密、HeiLang、Xcaptcha、LaTeX 机器人、链上记忆大师


签到

众所周知,签到题是一道手速题。

为了充分发挥出诸位因为各种原因而手速优异于常人的选手们的特长,我们精心设计了今年的签到题。进一步地,为了更细致地区分不同手速的选手,我们还通过详尽的调研及统计分析,将签下字符的时间限制分为了多个等级。只有最顶尖的手速选手,才能在 CPU 来得及反应之前顺利签下 2022,从而得到光荣的 flag!

一个网站,手写数字成功识别为 2022 就可以完成签到。不过限制了每个数字的时间,依次为 2s、1s、0.1s、0s。

我还天真地试着签了好几次(其实是没注意到那个 0),痛失一血

做法其实是在源码里发现识别都在前端进行,最终提交的时候是跳转到 /?result=.... 页面(或者交一次试一下也能看出来)。所以直接访问 /?result=2022 即可拿到 flag:flag{HappyHacking2022-……}


猫咪问答喵

参加猫咪问答喵,参加喵咪问答谢谢喵。

经典题目,搜索大杂烩。除了第五题以外还是很容易找到的。(这次竟然分了两个 flag 出来 2333)

  1. 中国科学技术大学 NEBULA 战队(USTC NEBULA)是于何时成立的喵?

直接搜索了一下 “中国科技大学 NEBULA 战队”,找到了一篇新闻:中国科学技术大学星云(Nebula)战队在第六届强网杯再创佳绩,其中文末有简单介绍 “中国科学技术大学星云战队(Nebula)成立于 2017 年 3 月……”

所以答案就是 2017-03

  1. 2022 年 9 月,中国科学技术大学学生 Linux 用户协会(LUG @ USTC)在科大校内承办了软件自由日活动。除了专注于自由撸猫的主会场之外,还有一些和技术相关的分会场(如闪电演讲 Lightning Talk)。其中在第一个闪电演讲主题里,主讲人于 slides 中展示了一张在 GNOME Wayland 下使用 Wayland 后端会出现显示问题的 KDE 程序截图,请问这个 KDE 程序的名字是什么?

在 LUG @ USTC 的 wiki 就能找到软件自由日活动的页面:Software Freedom Day,其中可以找到所说的那篇 slides:《GNOME Wayland 使用体验:一个普通用户的视角》,其中第十五页讲了所谓的 KDE 程序在 Wayland 下的显示问题。但截图里并没有软件名,把下面一行工具栏的文本全怼到必应里,搜到了 Kdenlive 的官方文档。

所以答案是 Kdenlive

  1. 22 年坚持,小 C 仍然使用着一台他从小用到大的 Windows 2000 计算机。那么,在不变更系统配置和程序代码的前提下,Firefox 浏览器能在 Windows 2000 下运行的最后一个大版本号是多少?

搜索 “Firefox Windows 2000” 可以看到 Firefox 13 不再支持 Windows 2000 的很多新闻。

所以答案是 12

  1. 你知道 PwnKit(CVE-2021-4034)喵?据可靠谣传,出题组的某位同学本来想出这样一道类似的题,但是发现 Linux 内核更新之后居然不再允许 argc 为 0 了喵!那么,请找出在 Linux 内核 master 分支(torvalds/linux.git)下,首个变动此行为的 commit 的 hash 吧喵!

在 Linux 内核 GitHub dev 页面全局搜索了一下 argc == 0,发现了一些检查。找到个比较像的进到页面里 blame,找到了 commit:exec: Force single empty string when argv is empty(其实 commit message 里就写了 CVE-2021-4034)。

所以答案是 dcd46d897adb70d63e025f175a00a89797d31a43

  1. 通过监视猫咪在键盘上看似乱踩的故意行为,不出所料发现其秘密连上了一个 ssh 服务器,终端显示 ED25519 key fingerprint is MD5:e4:ff:65:d7:be:5d:c8:44:1d:89:6b:50:f5:50:a0:ce.,你知道猫咪在连接什么域名吗?

比较难搞的一道题,想了很长时间,甚至以为是一些 crypto 题。不过毕竟是一道搜索题,于是直接把 md5 fingerprint 怼到谷歌里,搜到了一个文档其中有这个(可能是做个例子):Zeek Logs > ssh.log。看到里面对应的 ip:205.166.94.16,访问进去看到了 sdf.org 域名。

所以答案是 sdf.org。(其实是囤 flag 阶段才做出来的)

  1. 中国科学技术大学可以出校访问国内国际网络从而允许云撸猫的“网络通”定价为 20 元一个月是从哪一天正式实行的?

搜了一下,发现了一篇通知:关于实行新的网络费用分担办法的通知,是 2011 年 1 月 1 日施行的,但是这篇通知里国际网络通费用并没有改变,还是 20 元。看来是比较久远的事情了。搜索同名通知,可以发现另一篇。里面写了国际网络通定价 20 元,2003 年 3 月 1 日实行。

所以答案是 2003-03-01

交上去得到两个 flag(一个是对三道题的,一个是对六道题的):
flag{meowexammeow_……}
flag{meowexamfullymeowed!_……}


家目录里的秘密

实验室给小 K 分配了一个高性能服务器的账户,为了不用重新配置 VSCode, Rclone 等小 K 常用的生产力工具,最简单的方法当然是把自己的家目录打包拷贝过去。

但是很不巧,对存放于小 K 电脑里的 Hackergame 2022 的 flag 觊觎已久的 Eve 同学恰好最近拿到了这个服务器的管理员权限(通过觊觎另一位同学的敏感信息),于是也拿到了小 K 同学家目录的压缩包。

然而更不巧的是,由于 Hackergame 部署了基于魔法的作弊行为预知系统,Eve 同学还未来得及解压压缩包就被 Z 同学提前抓获。

为了证明 Eve 同学不良企图的危害性,你能在这个压缩包里找到重要的 flag 信息吗?

给了一个用户家目录的压缩包,进去全局搜索一下 flag 可以发现 VSCode 的历史文件里有一个 DUGV.c 里有一个注释掉的 flag:**flag{finding_everything_through_vscode_config_file_……}**(抢了个一血 2333)

第二部分还是有些复杂的。搜 flag 的时候还可以发现 .config/rclone/rclone.conf 里有一个名为 flag2 的配置项:

1
2
3
4
5
[flag2]
type = ftp
host = ftp.example.com
user = user
pass = tqqTq4tmQRDZ0sT_leJr7-WtCiHVXSMrVN49dWELPH1uce-5DPiuDtjBUN3EI38zvewgN5JaZqAirNnLlsQ

没用过 rclone,自己装了一个试了一下,发现 pass 是混淆后的,而且是随机的,有一个命令 rclone obscure 可以用来混淆密码。文档里也说了混淆的目的也只是防止有人可以一眼看到密码而已,并没有加密,rclone 是可以直接复原明文的。于是就翻了下 rclone 源码,可以在 obscure 相关源码 里找到恢复相关的函数 Reveal,复制下来跑一下给出的 pass 即可以恢复密码,即:flag{get_rclone_password_from_config!_……}


HeiLang

来自 Heicore 社区的新一代编程语言 HeiLang,基于第三代大蟒蛇语言,但是抛弃了原有的难以理解的 | 运算,升级为了更加先进的语法,用 A[x | y | z] = t 来表示之前复杂的 A[x] = t; A[y] = t; A[z] = t。

作为一个编程爱好者,我觉得实在是太酷了,很符合我对未来编程语言的想象,科技并带着趣味。

题给了一个以这种语法写的生成数组的代码,以及验证结果的 python 代码。其实题目已经说的很明确了,不过懒得写,记得 GitHub 上看到过一个项目 HeLang,不过里面的数组下标从 1 开始,所以就写了段代码来将 [] 中的数都加一,跑一遍输出数组 a,然后替代原来文件里的部分,跑一下就可以拿到 flag:flag{6d9ad6e9a6268d96-97091f6fffb6935c}


Xcaptcha

题目太长了,省略了部分背景故事

众人目目相觑。

「我来试试。」,一名队员上前点击了按钮。然后,屏幕显示「请在一秒内完成以下加法计算」。

还没等反应过来,屏幕上的字又开始变幻,显示着「验证失败」。而你作为突击队中唯一的黑客,全村人民最后的希望,迎着纷纷投来的目光,能否在规定时间内完成验证,打开机房,不,推开和平时代的大门?

大概就是点击认证后在一秒内计算三个大整数加法然后提交。手快存一份 html,按照其中要求正则一下提取出算式然后做加法再 post 回去。

1
2
3
4
5
6
import re, requests
url = "http://202.38.93.111:10047/xcaptcha"
s = requests.session()
s.get("http://202.38.93.111:10047/?token=……")
res = re.findall(r">(\d*?)\+(\d*?) ", s.get(url).text)
print(s.post(url, data={f'captcha{i+1}': str(int(res[i][0]) + int(res[i][1])) for i in range(3)}).text)

经典压行)跑一下拿到 flag:flag{head1E55_br0w5er_and_ReQuEsTs_areallyour_FR1ENd_……}


LaTeX 机器人

在网上社交群组中交流数学和物理问题时,总是免不了输入公式。而显然大多数常用的聊天软件并不能做到这一点。为了方便大家在水群和卖弱之余能够高效地进行学术交流,G 社的同学制作了一个简单易用的将 LaTeX 公式代码转换成图片的网站,并通过聊天机器人在群里实时将群友发送的公式转换成图片发出。

这个网站的思路也很直接:把用户输入的 LaTeX 插入到一个写好头部和尾部的 TeX 文件中,将文件编译成 PDF,再将 PDF 裁剪成大小合适的图片。

“LaTeX 又不是被编译执行的代码,这种东西不会有事的。”

物理出身的开发者们明显不是太在意这个网站的安全问题,也没有对用户的输入做任何检查。

那你能想办法获得服务器上放在根目录下的 flag 吗?

纯文本

第一个 flag 位于 /flag1,flag 花括号内的内容由纯文本组成(即只包含大写小写字母和数字 0-9)。

特殊字符混入

第二个 flag 位于 /flag2,这次,flag 花括号内的内容除了字母和数字之外,还混入了两种特殊字符:下划线(_)和井号(#)。你可能需要想些其他办法了。

第一个 flag 很简单,只需要 input 一下即可:\input{/flag1},可以看到 flag:**flag{becAr3fu11dUd3……}**。

第二个 flag 因为里面包含特殊字符,所以在渲染的时候会出现错误。解决方案是利用 LaTeX 的 active character 概念来将 _ 和 # 替换为 \_ 和 \#,先将其字符的 catcode 设置为 \active,然后定义命令序列。payload 为:

1
$$\catcode`\_=\active \def_{\_} \catcode`\#=\active \def#{\#}\input{/flag2}$$

得到 flag:flag{latex_bec_0_m##es_co__#ol_……}


链上记忆大师

听说你在区块链上部署的智能合约有过目不忘的能力。

第一道题题目合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
pragma solidity =0.8.17;

interface MemoryMaster {
function memorize(uint256 n) external;
function recall() external view returns (uint256);
}

contract Challenge {
function test(MemoryMaster m, uint256 n) external returns (bool) {
m.memorize(n);
uint256 recalled = m.recall();
return recalled == n;
}
}

很简单,写一个合约存值,实现 memorize 和 recall 方法存取值即可:

1
2
3
4
5
6
7
8
9
10
11
pragma solidity =0.8.17;

contract Exploit {
uint256 num;
function memorize(uint256 n) external {
num = n;
}
function recall() external view returns(uint256) {
return num;
}
}

Remix 里编译然后上传即可,flag:flag{Y0u_Ar3_n0w_f4M1l1ar_W1th_S0l1dity_st0rage_……}

第一题抢了一血。第二三题看了属实蒙圈。第二题在调用 memorize 之后接了一个 revert 恢复状态变化。第三题限定 memorize 方法为 view 函数,即不能修改状态。感觉很神奇,可能是用了某些 EVM 特性吧。蹲 wp 学学。


接着就开始囤 flag 了,下一篇再写。

「Hackergame 2022」#1 Writup 开局杀题

https://blog.tonycrane.cc/p/c8afb596.html

作者

TonyCrane

发布于

2022-10-27

更新于

2022-10-29

许可协议