USTC Hacker Game 2021 参赛记录

在妮可这几年作为一名寄科壬,之前居然一次 Hacker Game 都没参加过(实在是没时间),今年决定不放弃这个机会参加玩一玩,能做出几题来无所谓,咱也不是奔着拿奖去的,重在参与嘛。

1.签到题

为了能让大家顺利签到,命题组把每一秒的 flag 都记录下来制成了日记本的一页。你只需要打开日记,翻到 Hackergame 2021 比赛进行期间的任何一页就能得到 flag!

每年签到题似乎都是 web 相关的,今年签到题打开是个日记本网页,从 1970-1-1 GMT 08:00:00 开始计时,每一秒都写了一页,虽然网页上有按钮让你前进/后退,但是粒度都是以秒计,想要手动翻到 2021-10-23 下显然不可能,观察网页 URL 不难发现每次都是从浏览器请求一个朴素的固定链接 /?page=1 。其中 page 所取得至即为离 1970-1-1 GMT 08:00:00 所过的秒数,因此直接请求/?page=1635000000 即可进入想要的时间段。flag 到手。

2.进制十六——参上

为严防 flag 泄漏以及其他存在于未来所有可能的意外灾难,神通广大的 Z 同学不仅强制要求每一道题目都加上权限和资源的限制,还给所有参与 Hackergame 2021 命题的计算机施加了一层法术结界。任何试图从结界逃逸的 flag 都会被无情抹除。

而一位明面上是计算机学院的新生,实则为物理学院暗部核心成员的 X 同学,在 Hackergame 2021 命题组已经潜伏多时。妄想趁比赛开始的午时,借阳火正旺之势,冲破 Z 同学的结界,以图片而非明文的形式,将 flag 悄悄传递出来。

好在 Z 同学法力之深厚,不可管窥蠡测。在 flag 被传出去的前两天,就已预知此事并将图片中的 flag 无声消泯了。

只是,这位 X 同学,虽然不会退出 Vim,但是似乎对打开十六进制编辑器颇有造诣……

题目附图:

这题非常直球,右边的英文和题目都在暗示你用左边的 16 进制数字,将图片左边被打码的 16 进制数字转为 ASCII 字符,题目就完成了。

3.去吧!追寻自由的电波

(前情提要) 为了打破 Z 同学布下的结界,X 同学偷偷搬出社团的业余无线电台试图向外界通讯。

当然,如果只是这样还远远不够。遵依史称“老爹”的上古先贤的至理名言,必须要“用魔法打败魔法”。X 同学向上级申请到了科大西区同步辐射实验室设备的使用权限,以此打通次元空间,借助到另一个平行宇宙中 Z 同学的法力进行数据对冲,方才于乱中搏得一丝机会,将 flag 用无线电的形式发射了出去。

考虑到信息的鲁棒性,X 同学使用了无线电中惯用的方法来区分字符串中读音相近的字母。即使如此,打破次元的强大能量扭曲了时空,使得最终接受到的录音的速度有所改变。

为了保障同步辐射设备的持续运转,组织牺牲了大量的能源,甚至以东北部分地区无计划限电为代价,把这份沉甸甸的录音文件送到了你的手上。而刚刚起床没多久,试图抢签到题一血还失败了的你,可以不辜负同学们对你的殷切期望吗?

注:flag 花括号内只包含小写字母。

这题和无线电有关,虽然不难但个人觉得很有意思。题目附件给出了一份音频文件,打开试听会发现音频文件被明显地加速过了,因此首先要复原原有的音频内容。笔者随便 Google 了个音频编辑器 Audacity,选择效果-速率后将原音频放慢了四倍。听起来就非常的舒服了。音频内容如下:

Foxtrot Lima Alpha Golf Left-bracket Papa Hotel Oscar November Echo Tango India Charlie Alpha Bravo Right-bracket

Google 无线电码即可获得上述的翻译(其实就是每个单词的第一个字母,左右括号除外),原表为美军无线电通信音标码:

翻译之后即可获得 flag。

4.猫咪问答 Pro Max

我猛然一看,就猛然看到这个猫咪问答,我直呼我直呼,上次看到这么这么的发言还是上次,这问答属于是典型的典型了,我之前还没发现,当我发现的时候我已经发现了,这问答就像一个问答,问答的内容充满了内容,我不禁感慨了一句感慨:希望下次看到这么这么的猫咪问答是下次。

本质是信息搜索题,提示大家善用各种资料库和搜索引擎。

(1)2017 年,中科大信息安全俱乐部(SEC@USTC)并入中科大 Linux 用户协会(USTCLUG)。目前,信息安全俱乐部的域名(sec.ustc.edu.cn)已经无法访问,但你能找到信息安全俱乐部的社团章程在哪一天的会员代表大会上通过的吗?

遇到访问不了的网站不要怕,我们有互联网档案馆,把信安俱乐部的域名敲进互联网档案馆的 URL 索引,噔噔咚!社团章程点击就送:codes [SEC@USTC] (archive.org)

(2)中国科学技术大学 Linux 用户协会在近五年多少次被评为校五星级社团?

送分题,不急着做,猜也是猜 5。

(3)中国科学技术大学 Linux 用户协会位于西区图书馆的活动室门口的牌子上“LUG @ USTC”下方的小字是?

线下真人快打

其实在 LUG 的官网上直接搜活动室就能找到图片,原题中也说了非科大的同学也可以做,说明肯定是有在线方法的。链接:西区图书馆新活动室启用 – LUG @ USTC

(4)在 SIGBOVIK 2021 的一篇关于二进制 Newcomb-Benford 定律的论文中,作者一共展示了多少个数据集对其理论结果进行验证?

Google 关键词 SIGBOVIK 2021 Newcomb-Benford 即可找到原论文,论文中给了十三章图,每张图对应一个数据集。

(5)不严格遵循协议规范的操作着实令人生厌,好在 IETF 于 2021 年成立了 Protocol Police 以监督并惩戒所有违背 RFC 文档的行为个体。假如你发现了某位同学可能违反了协议规范,根据 Protocol Police 相关文档中规定的举报方法,你应该将你的举报信发往何处?

Google IETF Protocol Police 可获得规范文件,检索文件可知答案为/dev/null。(感觉很奇怪,有空再补)

5.卖瓜

有一个人前来买瓜。

HQ:哥们,这瓜多少钱一斤啊?

你:两块钱一斤。

HQ:What’s up!这瓜皮子是金子做的还是瓜粒子是金子做的?

你:你瞧瞧现在哪有瓜啊?这都是大棚的瓜,只有 6 斤一个和 9 斤一个的,你嫌贵我还嫌贵呢。

(HQ 心里默默一算)

HQ:给我来 20 斤的瓜。

你:行!

HQ:行?这瓜能称出 20 斤吗?

你:我开水果摊的,还不会称重?

HQ:我问你这瓜能称出 20 斤吗?

你:你是故意找茬,是不是?你要不要吧!

HQ:你这瓜要是刚好 20 斤吗我肯定要啊。那它要是没有怎么办啊?

你:要是不是 20 斤,我自己吃了它,满意了吧?

(你开始选瓜称重)

这题你只能往称上放 6 斤瓜和 9 斤瓜,显然想要直接称出来是不可能的。

笔者一开始试了很多方法,提交小数,负数,字符串啥的,都没有作用。想了老半天才想出来是靠的数据溢出,输入 999999999999999999 个 9 斤瓜可以发现总斤数变成了负数,而把这个负数慢慢加回正数模一下 3 就会发现和 20 是同余的,flag 到手(虽然花了我好长时间慢慢凑)。

PS,这题直接想把总斤数溢出是不行的,只能靠每次计算结果时的溢出才能实现。

7.旅行照片

你的学长决定来一场说走就走的旅行。通过他发给你的照片来看,他应该是在酒店住下了。

从照片来看,酒店似乎在小区的一栋高楼里,附近还有一家 KFC 分店。突然,你意识到照片里透露出来的信息比表面上看起来的要多。

请观察照片并答对全部 5 道题以获取 flag。注意:图片未在其他地方公开发布过,也未采取任何隐写措施(通过手机拍摄屏幕亦可答题)。

五道题问的分别是拍摄者的面朝方向,拍摄大致时间,拍摄者所在楼层,左上角 KFC 电话号码,KFC左侧分店上的三个汉字。

前三个直接暴力穷举,狗都不写,难的就在于后两题,突破点就是那个与众不同的 KFC,笔者解题时被那个店面的颜色误导,以为是 KFC 的 KPRO 店,翻遍了地图都没找到,结果原来那就是家普通的 KFC …,至于要怎么搜出来,加一些关于墙体颜色的关键字就莫名其妙的搜出来了(还是个网红店),地址全称是秦皇岛肯德基(新澳海底世界店),随便找个比如大众点评的软件就可以找到电话号码,再搜一下当地的街景就可以看到左边店面三个字是海豚馆。剩下来就是穷举前三个选项的事情了。

附全景地图地址,虽然全景很老旧:秦皇岛街景地图-实景地图-河北省秦皇岛市全景地图 (earthol.org)

26.外星人的游戏掌机

一块带着四个开关、一个 LED、一个串口、和一块 iCE40-HX1K-TQ144 FPGA 芯片的电路板。以纳秒量级的速度正确地按动开关,LED 会亮起,同时串口会输出 flag。

你记下了存储在 Flash 中 FPGA 的比特流(bitstream.bin)和电路板的接线(constraint.pcf)。

完成本题并不需要任何硬件设备。

显然烧板子运行一遍是不可能的,纳秒级地按动开关一定是通过仿真实现。于是问题便有了思路:先尝试将比特流文件(*.bin)恢复至 RTL 设计文件。

笔者起初尝试对(*.bin)文件进行格式分析并尝试还原,花了很大工夫找到文件格式文档后发现要直球恢复相当困难(笔者也没有那个知识储备),于是再次求助于 Google,终于搜出了一个名为 IceStorm 的开源项目,该项目下有着一个 bin 文件转 verilog 文件的工具,于是最困难的部分完成了。( Google Search Game 实锤)。IceStorm 链接:http://www.clifford.at/icestorm/

按照 IceStorm 的使用说明,简单地使用命令:

$ iceunpack ice40_files/bitstream.bin > ice40.asc
$ icebox_vlog -p ice40_files/constraint.pcf ice40.asc > ice40.sv

即可得到 ice40.sv 设计文件。

尽管如此,还原出的设计文件及其难懂, IceBox 生成的设计文件全部由二选一多选器组成。对于这个文件进行一次快速仿真非常简单,但是仍并不知道如何按动按钮,还是得不到 flag,因此笔者就硬着头皮去看那堆程序生成的代码了(太痛苦了)。

根据 IO ,一共有 4 个按钮作为输入,一个 led 和 一个 tx 信号输出。显然 tx 是串口线,出 flag 之前不用管他。由题知当 led 常亮时,串口会输出 flag,故笔者从 led 信号开始顺藤摸瓜。绘制出了如下的信号依赖:

其中 btn1 并不真的是 N219 – N222 信号的输入,只是他们的使能信号,N219 – N222 的信号来源相当复杂,笔者没有必要在此罗列展开,后面也能很快搞懂这几个信号的关系。n15 是一个简单的由 btn3 和 btn4 的值决定的固定输入,当 btn3 = 1 & btn4 = 0 时,n15 为 1,n357 的值由 N223 和 btn2 的输入决定,他们之间的关系可以刻画为如下:

assign n357 = n223 ? !btn2 : btn2;
always@(posedge clk) begin
    n223 <= btn2;
end

显然,由上述代码知 btn2 的值必须始终和 n223 相反才可能使 n357 恒真。

对于最后的 N219 – N222,从代码中可以抽象出的条件是 N219 = 0,其余均为 1 时。n264 为真,稍微跑一下仿真,就可以看出 N219 – N222 的关系:

这不就是个计数器嘛,因此想要满足上述条件,让 btn1 的使能信号只持续一段有限的时间即可,从而满足了 led 亮的条件。

之后只需要继续运行仿真即可获得 tx 信号的输出,Google 即可获得串口波形说明,笔者由于没怎么见过串口波形,还特地找了一位大佬确认了一下输出是串口波形,在此向那位大佬表示感谢。剩下的就是读取波形并转为 ASCII 字符,flag 终于到手。

附一张 flag 的波形图,构造的仿真文件和还原出的设计文件的压缩包:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据