menu Thinking Null
USTC Hackergame 2020参赛记录
2020-11-28   信息安全   暂无评论   1719 次阅读

[TOC]

简介

所有的题目都看过了,发现好像除了签到题其它都不太会做,emmmm....
下面是参赛流程(x

st=>start: USTC Hackergame 2020 开始了!
op=>operation: 登录注册,只挑战签到题
cond=>condition: 答案是否正确?
e=>end: 光速离开

st->op->cond
cond(yes)->e
cond(no)->op

差不多就这样,除了签到题其它都不会。只好看大佬的题解才能维持生活。

本文参考了https://github.com/USTC-Hackergame/hackergame2020-writeups
https://hang333.moe/2020/11/21/ustc-hackergame-2020-writeup

签到

直接审查元素 (Inspect Element) 将 input 的 value 改成 1

或者和我一样通过观察提交的链接,发现输入的数值是通过number参数传入的,直接修改参数的值即可。

获得 flag flag{hR6Ku81-HappyHacking2020-58eadee9bc}

可我的flag是 flag{hR6Ku81-HappyHacking2020-da725abe0d}我提取到的flag和hang233的不一样!难道是通过flag来区分用户的?真奇怪。

猫咪问答

最烦的就是这题了

Q1: 以下编程语言、软件或组织对应标志是哺乳动物的有几个?
Docker,Golang,Python,Plan 9,PHP,GNU,LLVM,Swift,Perl,GitHub,TortoiseSVN,FireFox,MySQL,PostgreSQL,MariaDB,Linux,OpenBSD,FreeDOS,Apache Tomcat,Squid,openSUSE,Kali,Xfce.
提示:学术上一般认为龙不属于哺乳动物。

答案为 12

编程语言、软件或组织对应动物动物种类
Docker鲸鱼哺乳 (1)
Golang地鼠哺乳 (2)
Python爬行
Plan 9兔子哺乳 (3)
PHP大象哺乳 (4)
GNU角马哺乳 (5)
LLVM??
Swift鸟类
Perl骆驼哺乳 (6)
GitHub章鱼头足纲
TortoiseSVN乌龟爬行
FireFox狐狸哺乳 (7)
MySQL海豚哺乳 (8)
PostgreSQL大象哺乳 (9)
MariaDB海狮哺乳 (10)
Linux企鹅鸟类
OpenBSD河豚鱼类
FreeDOSBlinky鱼?
Apache Tomcat哺乳 (11)
Squid鱿鱼头足纲
openSUSE变色龙爬行
Kali??
Xfce老鼠哺乳(12)
Q2: 第一个以信鸽为载体的 IP 网络标准的 RFC 文档中推荐使用的 MTU (Maximum Transmission Unit) 是多少毫克?

解: 该标准为 IP over Avian Carriers。找到其 RFC 标准A typical MTU is 256 milligrams. 。即答案为 256

Q3: USTC Linux 用户协会在 2019 年 9 月 21 日自由软件日活动中介绍的开源游戏的名称共有几个字母?
提示:活动记录会在哪里?

解: 利用搜索引擎查找关键字 USTC Linux 2019 年 9 月 21 日自由软件日活动 找到活动新闻页 ,最后一项是李文睿同学介绍了开源游戏 Teeworlds ,Teeworlds 有九个字符, 即答案为 9

Q4: 中国科学技术大学西校区图书馆正前方(西南方向) 50 米 L 型灌木处共有几个连通的划线停车位?
提示:建议身临其境。

解: 我找到所有除这题以外的答案后用 burpsuite 遍历从 1 到 20, 找到答案为 9

Q5: 中国科学技术大学第六届信息安全大赛所有人合计提交了多少次 flag?

解: 从 Hackergame 首页的 ”相关链接“ 中找到 新闻稿:学生Linux用户协会第六届信息安全大赛完美收官 , 比赛期间所有人合计提交了 17098 次 flag , 即答案为 17098

hang233的flag 为 flag{b4a31f2a_G00G1e_1s_y0ur_fr13nd_7777892699},而我的flag为 flag{b4a31f2a_G00G1e_1s_y0ur_fr13nd_76a8fde32d}至此,基本可以确定是用flag在区分用户,防止作弊了。

2048

第一反应是把这游戏玩通关,但我2048就没有成功过。果然失败了,看到向某地址发出了请求http://202.38.93.111:10005/getflxg?my_favorite_fruit=搜索一番后发现源代码是这样的

if (won) {
    url = "/getflxg?my_favorite_fruit=" + ('b'+'a'+ +'a'+'a').toLowerCase();
  } else {
    url = "/getflxg?my_favorite_fruit=";
  }

我的flagflxg{8G6so5g-FLXG-2604ea70ea} 和hang233 的flxg{8G6so5g-FLXG-94887845e7}果然又不一样。

一闪而过的 Flag

从未有过如此轻松舒适的wine体验。

这次flag都是一样的 flag{Are_you_eyes1ght_g00D?_can_you_dIst1nguish_1iI?}

从零开始的记账工具人

先把下载下来的 xlsx 文件用 Excel 打开然后转换成 csv 文件以方便处理。
之后用 python 的 cn2an 库把中文大写数字转成阿拉伯数字。
来源: mcfx

import cn2an

tot = 0
for i in open('bills.csv', encoding='utf-8').readlines()[1:]:
    a, b = i.split(',')
    #print(a, b)
    b = int(b)
    x = 0
    y = 0
    z = 0
    if '元' in a:
        x, a = a.split('元', 1)
        x = int(cn2an.cn2an(x, 'smart'))
    if '角' in a:
        y, a = a.split('角', 1)
        y = int(cn2an.cn2an(y, 'smart'))
    if '分' in a:
        z, a = a.split('分', 1)
        z = int(cn2an.cn2an(z, 'smart'))
    #print(x, y, z)
    tot += (x + y * 0.1 + z * 0.01) * b
print(tot)

而我并不会python,excel公式也不熟练。下面是我尝试过的轮子,无一例外都失败了。

51240上有人民币大写转小写,但是部分数字居然会转换错误???WDNMD??无奈了。Github上有money.py可以转换中文大写为数字,但输出却不尽如人意。

麻了,花了3个小时,都没有搞定。

从零开始的火星文生活

找到个 乱码还原网站
在 UTF-8 下读取文件为

脦脪鹿楼脝脝脕脣 拢脠拢谩拢茫拢毛拢氓拢貌拢莽拢谩拢铆拢氓 碌脛路镁脦帽脝梅拢卢脥碌碌陆脕脣脣眉脙脟碌脛 拢忙拢矛拢谩拢莽拢卢脧脰脭脷脦脪掳脩 拢忙拢矛拢谩拢莽 路垄赂酶脛茫拢潞
拢忙拢矛拢谩拢莽拢没拢脠拢麓拢枚拢鲁拢脽拢脝拢玫拢脦拢脽拢梅拢卤拢脭拢猫拢脽拢鲁拢卯拢茫拢掳拢盲拢卤拢卯拢莽拢脽拢麓拢脦拢盲拢脽拢盲拢鲁拢茫拢掳拢脛拢卤拢卯拢脟拢脽拢鹿拢帽拢脛拢虏拢脪拢赂拢猫拢贸拢媒
驴矛脠楼卤脠脠眉脝陆脤篓脤谩陆禄掳脡拢隆
虏禄脪陋脭脵掳脩脮芒路脻脨脜脧垄脳陋路垄赂酶脝盲脣没脠脣脕脣拢卢脪陋脢脟卤禄路垄脧脰戮脥脭茫赂芒脕脣拢隆

将文本输入。查看 原来编码(假设) 为UTF-8、 现在编码(假设) 为GBK 下的文本。

ÎÒ¹¥ÆÆÁË £È£á£ã£ë£å£ò£ç£á£í£å µÄ·þÎñÆ÷£¬Íµµ½ÁËËüÃÇµÄ £æ£ì£á£ç£¬ÏÖÔÚÎÒ°Ñ £æ£ì£á£ç ·¢¸øÄ㣺
£æ£ì£á£ç£û£È£´£ö£³£ß£Æ£õ£Î£ß£÷£±£Ô£è£ß£³£î£ã£°£ä£±£î£ç£ß£´£Î£ä£ß£ä£³£ã£°£Ä£±£î£Ç£ß£¹£ñ£Ä£²£Ò£¸£è£ó£ý
¿ìÈ¥±ÈÈüƽ̨Ìá½»°É£¡
²»ÒªÔÙ°ÑÕâ·ÝÐÅϢת·¢¸øÆäËûÈËÁË£¬ÒªÊDZ»·¢ÏÖ¾ÍÔã¸âÁË£¡

把该文本再还原一次,发现 原来编码(假设) 为 GBK、 现在编码(假设) 为 iso-8859-1 时文本已还原。

 我攻破了 Hackergame 的服务器,偷到了它们的 flag,现在我把 flag 发给你:
flag{H4v3_FuN_w1Th_3nc0d1ng_4Nd_d3c0D1nG_9qD2R8hs}
快去比赛平台提交吧!
不要再把这份信息转发给其他人了,要是被发现就糟糕了!

官方题解


下载附件之后如直接用 GBK 打开,那就真的是题面里说的“夹杂着日语和数字的火星文”了。恭喜掉进坑,乱码又多了一层(逃

用 UTF-8 打开,看到形如“脦脪鹿楼”的文本,推断是上图中的“古文码”乱码。但是“古文码”明明是“以 GBK 方式读取 UTF-8 编码”造成的,看来“脦脪鹿楼”本来应当是 GBK下看到的结果,却又被存成了 UTF-8。所以第一步是用 GBK 重新编码文本“脦脪鹿楼...”。

然后用 UTF-8 打开,看到形如“ÎÒ¹¥ÆÆÁË”的文本,推断是上图中的“拼音码”乱码。“拼音码”是“以 ISO8859-1 方式读取 GBK 编码”,而现在文本的编码是 UTF-8。所以接下应当用 ISO8859-1 重新编码文本“ÎÒ¹¥ÆÆÁË...”。

然后用 GBK 打开,就能看到可读的汉字和 flag 了(原始编码确实是 GBK 呢!)。不过这里的 flag 全部是从 ASCII 字符转成的全角字符,不能直接复制使用。可以手动替换成 ASCII 字符,或者用其他简便方法变回 ASCII 字符。

例如用 VSCode (实测gedit也可以)的“Select Encoding”功能。

步骤(开始时 UTF-8 打开题目附件):

  1. Save with Encoding -> GBK
  2. Reopen with Encoding -> UTF-8
  3. Save with Encoding -> ISO8859-1
  4. Reopen with Encoding -> GBK

所以 flag 为 flag{H4v3_FuN_w1Th_3nc0d1ng_4Nd_d3c0D1nG_9qD2R8hs}

自复读的复读机

hang233题解

反向复读

Stackoverflow - shortest python quine? 找一个方便构造的进行构造。

Payload 为

print((lambda s:(s%s)[::-1])('print((lambda s:(s%%s)[::-1])(%r), end="")'), end="")

得到 flag: flag{Yes!_Y0U_h4v3_a_r3v3rs3d_Qu1ne_0850bb9e57}

哈希复读

同反向复读, 找了一个新的来构造:

import hashlib;exec(s:='print(hashlib.sha256(("import hashlib;exec(s:=%r)"%s).encode()).hexdigest(), end="")')

官方答案

第一问(每行都是一个可能的构造):

exec(s:='print(("exec(s:=%r)"%s)[::-1],end="")')

s='s=%r;print((s%%s)[::-1],end="")';print((s%s)[::-1],end="")

第二问(每行都是一个可能的构造):

exec(s:='print(__import__("hashlib").sha256(("exec(s:=%r)"%s).encode()).hexdigest(),end="")')

exec(s:='import hashlib;print(hashlib.sha256(("exec(s:=%r)"%s).encode()).hexdigest(),end="")')

import hashlib;s='import hashlib;s=%r;print(hashlib.sha256((s%%s).encode()).hexdigest(),end="")';print(hashlib.sha256((s%s).encode()).hexdigest(),end="")

得到 flag: flag{W0W_Y0Ur_c0de_0utputs_1ts_0wn_sha256_423ae2f900}

从零开始的 HTTP 链接

简单的解法

0 号端口是保留端口,大部分应用程序(包括nginx)会认为 0 号端口无效从而拒绝连接。但是,TCP 数据包头部的端口字段是两个字节,可以表示 0~65535 的端口号,所以构造 0 号端口的数据包是完全可行的。

经过我的测试,在大多数网络环境下,包括校园网、家庭宽带、国内外的云服务器等,即使经过了家用路由器的 NAT,0 号端口的流量也都是可以正常通过的。少数网络环境可能封禁了 0 号端口的流量,此时你可能需要更换一个网络环境或者从云服务器(包括一些免费的持续集成和沙箱环境等)发起连接。
在 Linux 下,安装 socat,然后运行 socat TCP-LISTEN:20000,fork,reuseaddr TCP:202.38.93.111:0,再从浏览器访问 localhost:20000 即可。
真是太方便了!

要注意,如果你在用 Linux 虚拟机,很多虚拟机软件的 NAT 实现不能正确处理 0 号端口,你需要把虚拟机的网络设置从 NAT 模式改为桥接模式。

本博客现在也通过以下方法在0号端口上运行

服务器上这个网站在 20000 端口提供服务,然后我加了两条 iptables:

iptables -t nat -I PREROUTING -p tcp --dport 20000 -j REDIRECT --to-port 0
iptables -t nat -I PREROUTING -p tcp --dport 0 -j REDIRECT --to-port 20000

相当于把 20000 端口的流量与 0 端口的流量互换了一下

本篇文章采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 许可协议进行许可。

转载或引用本文时请遵守许可协议,注明出处。

发表评论
暂无评论
textsms
account_circle
email
link