偶然的一个机会在tg频道里面获知了中科大的LUG社团举办了信息安全大赛,也就是Hackergame 2021。我也比较感兴趣,就抽空参加了一下。在过程中最高的排名好像是60多名,最后的总排名定格在了144名,勉强算是前5%吧。这个信息安全大赛总的来说还是挺有意思的,写一篇Writeup的同时分享一下自己玩这个比赛的一些感想。
玩这个比赛的时候就是一直想让自己保持在100名以前。(因为100名以前会上排行榜,大家都可以看到,我还有tag可以打在自己的名字后面)有的时候跌出100名的时候就再努努力做出来一道,最后实在是怎么努力也做不出来了hhh,只能眼睁睁看着自己的排名下跌。
题目分析
签到
签到题还是比较简单的,看到1970-01-01就意识到了是UNIX时间戳。点击Next按钮之后可以看到网页URL有个?page=1
,直接把现在的时间转换为Timestamp填入?page=
后面即可看到flag。
这道题可能也可以通过Javascript的方法做,我对JavaScript不是非常熟悉,还是用这种比较原始的GET方法做的。
进制十六——参上
看到图片就知道是十六进制编辑器,上网找一个在线的十六进制编辑器,把有flag的三行输入进去就可以得到结果。
去吧!追寻自由的电波
下载下来的音频文件可以隐约听出来是加速的,用达芬奇减速降调到20%之后即可听到一些英文单词。
这些英文单词自然难不住我,毕竟曾经是无线电爱好者。应该是叫做NATO_phonetic_alphabet。这种读法主要是为了解决无线电声音传输中的识别度问题(就像我国把一读成幺,把七读成拐,避免听不清,造成混淆)。
猫咪问答 Pro Max
这道题我感觉其实挺难的,是第一道卡我的题。
在Google搜索半天无果,最后意识到信息安全俱乐部的域名(sec.ustc.edu.cn)已经无法访问这句话。于是登入Wayback Machine寻找,终于找到了结果。
在USTC的LUG官网就有
在USTC的LUG官网的一篇新闻里面就有。(我还看到有人在百度贴吧求助说有人能帮忙跑去看一眼吗,真的是笑死我了hhh)
直接用
SIGBOVIK 2021 Newcomb-Benford
作为关键词在Google搜索,即可定位到一篇PDF,可以发现答案是13。(据说因为查询的人比较多,Google已经在输入SIGBOVIK 2021
后自动联想Newcomb-Benford
了)查询IETF官网关于Protocal Police的文档,发现其实是一个愚人节的玩笑。在文档第六章写出了举报地址
/dev/null
。
卖瓜
一开始想半天6x + 9y = 20
,肯定是没有整数的可行解的。负数,小数又不可以。偶然发现输入特别大的数字(乘积在$$2^63 - 1$$)就可以使称溢出,稍微凑一下就可以做出来了。
透明的文件
经验看出这个是ANSI Escape Code,但是没有ESC
标识符。在每个[
前面加上\e
或者是\033
就可以了。
最后的结果在终端里面echo -e ""
即可。
在转换的时候不知道为什么最多只能一次转换4096个字符,还是手动转了好几遍才可以的。
顺便稍微详细了解了一下ANSI Escape Code的作用原理,还是挺有启示意义的。
旅行照片
看到这张照片首先猜测是在中国沿海,判断拍摄方向和时间,然后分析就陷入了停滞。突然意识到,大多数的KFC应该都是红色的,蓝色的KFC实属少见。于是带着蓝色KFC
做关键词在百度搜索,发现这家KFC中国仅此一家,就在秦皇岛的新澳海底世界附近,然后做题就简单多了。轻易查询到KFC的电话号码,再通过街景发现左侧建筑的「海豚馆」三个字。最后的拍摄楼层枚举即可得出结果。
不知道这张图片有没有EXIF信息,用这个思路不知道行不行。
善用Python的requests库,在暴力枚举题目答案的时候帮我大忙。
FLAG助力大红包
通过看Chrome的Network请求,发现有一个POST表单里面有ip,于是枚举了0.0.0.0/8网段。发现除了前端通过这里的ip判定,后端也会判定ip地址,在请求的时候还需要加上X-Forward-For
请求头。爆破的速度也不宜太快,我每一个请求都sleep了2秒,将将枚举完成。特别地,0.0.0.0和255.0.0.0也需要枚举,差点超时间。
估计这道题是吐槽拼多多的砍一刀活动的(
图之上的信息
这是个graphql相关的题,原来从来没有接触过这个API。甚至REST相关的概念也没有接触过,这道题做完了也让我了解了一下REST相关的思想,这道题还是挺有启发意义的。
一开始直接查询id为1账户相关的信息,返回的都是permission denied。
在GraphQL的官网上面搜索,发现有一个introspection可以查询所有字段,最后发现邮件名字叫privateEmail,做一遍query即可得到flag。
赛博厨房
一开始把这道题想复杂了,以为有什么奇奇怪怪的骚操作,其实就是和推箱子一样的。
按照题目要求把程序写好保存之后,每一天的菜谱还是会变的。于是写了好几个程序,遇到哪个菜谱用哪个就行了。
题目要求一次只能放下一个食材,一开始复制了一堆
放下 1 个物品
但是程序最多只能有72行。傻眼了半天,最后发现如果手上的物品大于等于 n 向上跳转 m 行
这条命令可以用,然后就过关了。
后面的题一看就特别难(
题目里面的
如果手上的物品大于等于 n 向上跳转 m 行
没有说明清楚是程序跳转还是机器人移动,给我一开始做第二题造成了一定的阻碍。
minecRaft
这道题是我做出来的最难的一道题了我个人觉得。
分析一下网页,发现有一个misc/flag.js
可以细究(毕竟这个文件混淆得十分难看)。在gyflagh函数里面发现有一个(翻译过后的)命令''['encrypt']('1356853149054377')
意识到这个可能是个加密算法,而且密文是6fbde674819a59bfa12092565b4ca2a7a11dc670c678681daf4afb6704b82f0c
。
细看这个文件发现加密算法在code函数里面,分析查询一下发现是TEA加密算法(有一个关键值0x9E3779B9)。那么现在就已知密文,密钥和加密算法求明文了。
这个64位的密文应该16位一组,总共四组要分别解。code函数传入两个参数:一个是v[2]的明文,一个是key[4]的密钥。加密和解密的密钥是一个,把key[4]固定了下来。v[0]是密文的前四位的Base16toLong的结果,v[1]就是后四位。然后一步一步的解密即可得到答案。
按理说利用他给出的函数直接用可以更方便得解出来,但是我还是因为对JS不太熟悉,而且那个混淆确实太难看了,就用笨方法一个一个手动算的。
正好还利用了这道题的机会学习了一下TEA这个对称加密算法,摸清了TEA加密的具体原理。同样的,这道题也是挺有教育意义的。
感想
总得来说,这个信息安全大赛还是挺有意思的。特别是在做出来一道题之后,那种成就感是无法用言语表达的。同时,参加这个比赛还可以学到不少东西。如果明年条件允许,我还是会继续参加这个比赛,并且还会把这个比赛安利给别的同学。毕竟有几道题有没有计算机方面的知识都可以做,还可以借此机会普及一下计算机方面的相关知识(或者是常识)。