Hackergame2023-Writeup

Hackergame2023-Writeup

——by Jednersaous

mark:3350, rank:185/2386, group rank:3/63

AI:300, binary:0, general:2050, math:200, web:800

——————————————————————————————————————————————————

1.Hackergame 启动

认真虔诚地喊出“hackergame,启动”(不是

试了一次之后发现匹配度根本到不了99.9%,但是发现URL这个东东呢,后面有了个similarity参数

数字好像正好是匹配度,那就直接修改该参数超过99.9%即可

2.猫咪小测

第一题在科大西图找一本书,给了提示非负整数,故穷举,答案是12

第二题直接Google「可观测宇宙中的鸡的密度上限」,知乎等各大中文网站都有答案

第三题我问的ChatGPT3.5,可喜可贺,给出了正确答案

第四题还是Google”Mypy type check infinite loop”,各大论文网站均有引用,容易找到原文及今年的发表大会

3.更深更暗

F12查看源码,打开发现一直有新的<pre>元素“涌”进web页面,我的flag!!!

打断点暂停,或者抓包,或者Network,flag就藏在div-main的最下面

4.旅行照片3.0

此题我已写了题解,太爽啦,直接CV

1.通过文本可知粗略的时间是今年2023年暑假大概是6月-9月(其实已经可以开爆了

查了下中科大学生放假时间

本科7.29-9.2,惨惨惨,那估计就是8月份的某一天了

飞机照片能搜出来南航的标识

通过后面拉面店里的日文可以看出目的地是日本,文本中有提到是东京

但是出发地不太知道,有点幽默了,难道是合肥吗?

如果出发地不知道的话就有点难找了

结果爆出来是2023-08-10

2.奖牌是诺贝尔奖奖牌,获得者是KOSHIBA,也就是小柴昌俊,东京大学毕业,所以学长大概率在东大读书

而koshiba获得的的是诺贝尔物理学奖,所以只要找到东京大学诺贝尔物理学奖最年轻的获得者就可以

发现符合这个条件的人只有梶田隆章了,从wiki百科里知道当时他工作于东京大学宇宙射线研究所,缩写ICRR

3.识图找到了这家拉面店和这个喷泉

这个喷泉确实挺有标志性,叫上野公园大喷泉,但是附近有两个博物馆

一个博物馆在喷泉旁边,叫国立科学博物馆;另一个在马路对面,叫东京国立博物馆,到底是哪一个呢

查了一会,好像符合时间和地点条件的活动就只有当天的梅酒祭

有一说一,确实挺难找的,但凭我的实力还是直接给我干到官网了

https://umeshu-matsuri.jp/tokyo_staff/

https://ws.formzu.net/dist/S495584522/

答案直接在页面上显示出来了

S495584522

4.只要搜东京的国立科学博物馆门票价格就行,普通人好像是1000yen,我看大学生减免50%还以为是500yen呢,结果直接0yen,只能说不愧是润霓虹爷啊

5.文本说是上野站,直接google map,开找

但是这上野站离河还很远啊,离这Rainbow Bridge就更远了,我是有点没搞懂

哦原来是在上野站上车是吧,日,审题不仔细

tmdtmdtmdtmdtmd

原来是先搞学术是吧,在东大里先搞点学术再集合

我tm还以为是在哪里集合坐船

我日似你的木,气死了

ans:安田讲堂

6.上野站好像是喜欢panda的

图在下面那个网站里

https://plaza.rakuten.co.jp/ayumilife/diary/202308030001/

马里奥在渋谷,先试试在渋谷站找找吧

马里奥是Nintendo TOKYO オフィシャルストア,有个林克的照片重合度100%

涩谷有忠犬八公,忠犬八公是秋田犬(?

好像还真是,新宿有猫,涩谷是忠犬八公,Youtube最近时间是2023-06

开蒙了

有点脏话,但是不想删了,素质就是这么低 ^_^

5.赛博井字棋

可以发现,正常下是100%下不赢的,那就只能抓包看看了

发现是POST请求,发送的是自己下的棋的坐标

那我能不能下在AI已经下过的棋上呢,一试发现可以

所以可以先手动下两个,然后最后一个抓包之后修改坐标成被AI堵住的那个就行了

6.奶奶的睡前 flag 故事

题目给的暗示真的挺多的,没想到这题跟PNG什么正常的图片隐写啊没什么关系,挺好的,毕竟我是misc新人

第一点谷歌的亲儿子指的是google自己研发的手机Pixel系列

好,那懂了啊,直接搜Pixel截图漏洞

https://www.ithome.com/0/681/025.htm

https://acropalypse.app/

aCropalypse截图漏洞就爆出来了,直接网页在线处理,flag轻而易举

7.组委会模拟器

这题还花了我不少时间的,都有200解了我才做出来,我以为大家都用的神必方法秒了,我还在傻傻写脚本呢

python-http请求脚本熟练度+1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import requests
import json
import re
import time

url="http://202.38.93.111:10021/"
header = {'Content-Type': 'application/json'}
# parame={
# 'token':"386:MEUCIAau2PaZf7UfJZPo7B2nkqGyyXuBoqNQM9QRe/c1S5qwAiEAt+5eRVU2N+kNE/mpF4cghZUxaUe/4Y/olgc0We5XQSk="
# }
cookie={ 'session':"eyJ0b2tlbiI6IjM4NjpNRVVDSUFhdTJQYVpmN1VmSlpQbzdCMm5rcUd5eVh1Qm9xTlFNOVFSZS9jMVM1cXdBaUVBdCs1ZVJWVTJOK2tORS9tcEY0Y2doWlV4YVVlLzRZL29sZ2MwV2U1WFFTaz0ifQ.ZT8Zhg.nu6aFcogpETdaJyp1BHVoDEFZ34"}
s=requests.session()
listf=[]
listd=[]
r=s.post(url+'api/getMessages',cookies=cookie)
mess=json.loads(r.text)
result=mess['messages']
print(result,len(result))
for i in range(1000):
surr=result[i]['text']
if(re.match(".*hack\[\.*",surr)):
listd.append(result[i]['delay'])
listf.append({'id':i})
print(listf)
j=0
listd.append(listd[len(listf)-1]+0.1)
for i in listf:
datas=json.dumps(i)
a=s.post(url+'api/deleteMessage',cookies=cookie,data=datas,headers=header)
if j<115:
time.sleep((listd[j+1]-listd[j])/1.1)
elif 115<=j<210:
time.sleep((listd[j+1]-listd[j])/1.5)
else:
time.sleep((listd[j+1]-listd[j])/1.2)
j=j+1
print(a.text,j)
r2=s.post(url+'api/getflag',cookies=cookie)
print(r2.text)
s.close()

要注意用delete的时候一定得等消息delay了之后再delete,不然会回显“检测到时空穿越”,我就被这个折磨了很久

好在getMessage的信息都给足了,不然我还真卡在这了

8.虫

这题还真挺有意思的,下载附件是wav格式,作为misc苦手,我又以为是xx隐写,搜了半天无果

回到题目,说是无线信道传输图片,然而,bing和google都没能第一时间搜出有用的信息,我在浏览苦海中寻觅了不少时间,才偶然发现一位佬的博客在打以前的某CTF的题解里提到了这种方式

https://md.byr.moe/s/Bk6tsb2O8

正是这位佬,照着他的方法,下载一个虚拟声卡和RX-SSTV就可以通过这个音频转化成图片力,图片还怪好看的

9.JSON ⊂ YAML?

嘿嘿,这题根本没懂,还是连蒙带猜才做出来的,还是只能说打hg的时候的运气实在太好了

1
2
flag1-payload:{"a":"NaN"}
flag2-payload:{"a":"123","a":"222"}

第一个Python解析出来的YAML111是nan,JSON是NaN,黑人问号(?

第二个我是尝试千百次才得到,什么超长字符串,转义字符试了,统统不好使,最后发现YAML1.2不能重复键值

可能运气也是实力的一部分吧

不过花在这题上的时间也是挺久的,(指疯狂拷打GPT

10.Git? Git!

把附件Xftp传到我的小云服务器上,然后进行如下操作

1
2
3
git init
git reflog
git diff id-1 id-2

第一步初始化仓库

第二步查看历史记录,可能有人会好奇历史记录是在哪里保存的

实际上每次操作都会记录为某个hash值存在.git中的某个文件,通过git可以重新解析

第三步拿reflog回显的文件头进行diff比较,看哪个不顺眼就是哪个

千万别git log,buffer会炸的(亲身经历

11.HTTP集邮册(2/3)

这题把我的弱点展现的淋漓尽致,我也就堪堪找到5个状态码,确实我太废物了

200:正常发送

400:HEADERS的格式错误

404:GET访问不存在的页面

405:POST, HEAD, PATCH, DELETE…

505:将HTTP1.1改成HTTP2.1(?

空状态码:只留下GET /

寄了,还是看看佬的题解⑧家人们

12.Docker for Everyone

这题确实有意思,经典不会就开搜,而我确实是这么做的

发现是Docker的用户组提权

但是注意一点,usermod好像被出题人删了,用不了,所以可以参照以下博客

https://www.cnblogs.com/hellobao/articles/17262230.html

直接可以读flag,也不用像他的博客一样写入root用户

13.惜字如金2.0

靠猜(拼运气

虽然你可能不是很理解什么是第一原则和第二原则,但是你知道flag的格式是flag{.*}

所以开头是flag{,最后一个字符是},然后理解代码就不难了

最后给出补齐之后的py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def get_cod_dict():
# prepar th cod dict
cod_dict = []
cod_dict += ['nymeh1niwemflcir}echaete']
cod_dict += ['a3g7}kidgojernoetlsup?he']
cod_dict += ['ulww!f5soadrhwnrsnstnoeq']
cod_dict += ['ctt{l-findiehaai{oveatas']
cod_dict += ['ty9kxborszstgguyd?!blm-p']
return ''.join(cod_dict)
def decrypt_data(input_codes):
# retriev th decrypted data
cod_dict = get_cod_dict()
output_chars = [cod_dict[c] for c in input_codes]
return ''.join(output_chars)

cod_dict = []
cod_dict += ['nymeh1niwemflcir}echaet1']
cod_dict += ['a3g7}kidgojernoetlsup?h1']
cod_dict += ['ulw!f5soadrhwnrsnstnoeq1']
cod_dict += ['ct{l-findiehaai{oveatas1']
cod_dict += ['ty9kxborszstguyd?!blm-p1']
print(cod_dict)
print(set(len(s) for s in cod_dict))
print(''.join(cod_dict))
flag = decrypt_data([53, 41, 85, 109, 75, 1, 33, 48, 77, 90,
17, 118, 36, 25, 13, 89, 90, 3, 63, 25,
31, 77, 27, 60, 3, 118, 24, 62, 54, 61,
25, 63, 77, 36, 5, 32, 60, 67, 113, 28])
print(flag)

14.高频率星球

我再也不装CentOS(擦擦擦擦擦擦

下载附件是.rec文件,得用题目中所说的asciinema来play

Windows用不了,于是乎我高兴地打开了我的华为云HECS,搭配的是炒鸡利害的CentOS内核

yum install asciinema !!! 然后asciinema play ~!!!

嗯?报错?(黑人问号?

Python版本低于3.9无法使用asciinema

沃日,赶紧查看python版本(python -V),一查3.6

我晕,CentOS的yum都是靠python解析的,况且我都装了3、4个Python版本,连管理都不知道在哪管理

真的是气的想吐血,又只能搬出陈年的VMware,在我老旧的Kali虚拟机上进行操蛋的操作

先asciinema play ~,play一遍之后发现提示nodejs flag.js就能拿到flag

然后就asciinema cat ~ >output.js,结果回显一堆乱码(全是\r、^M)这种Windows特有的操蛋玩意

我当时已经身心俱疲,不想研究什么vim快速删除,只想重复傻瓜式的机械操作,leafpad一个个手删

也就耗时30min+,不是很久嘛(((

最后nodejs flag.js就能拿到flag了,庆幸我删的都是对的

15.小型大预言模型星球(2/4)

这个AI,好玩好玩((

试探性聊了几句,发现他的Response有种精神污染,牛头不对马嘴

实际上我知道他类似于是一个编故事的AI,根据你的开头接着编故事,所以只需要想象语境就能做很大部分的题了

比如第一个You are smart

这个我甚至有多解,随便给一个解吧

直接输入Am I smart?,然后就能拿到第一个flag了

第二个accepted

输入Apology,不多不少,正好7个字,这是个非常nb的想法

总之对这种正常词汇,头脑风暴想语境就可以了

至于后面两个非正常词汇,肯定得用一些漏洞⑧

16.流式星球

一开始我搞错了,把下载附件的代码以为是把bin convert to mp4了,后来甩给GPT才看懂+结合题干

原来是在告诉我怎么把mp4 convert to bin,所以我故技重施,让GPT告诉我怎么复原

GPT给了我如下十分折磨人的代码(后面细锁

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import cv2
import numpy as np

def create_video_from_bin(input_bin, output_mp4, frame_width, frame_height, frame_rate):
# 读取二进制文件
with open(input_bin, "rb") as file:
binary_data = file.read()

# 还原视频帧数据
frame_size = frame_width * frame_height * 3
video_frames = np.frombuffer(binary_data, dtype=np.uint8)
video_frames = video_frames[:len(video_frames) - (len(video_frames) % frame_size)] # 确保数据长度是帧大小的倍数
video_frames = video_frames.reshape(-1, frame_height, frame_width, 3)

# 创建视频编写器
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 使用MP4编码
out = cv2.VideoWriter(output_mp4, fourcc, frame_rate, (frame_width, frame_height))

# 将帧写入视频文件
for frame in video_frames:
out.write(frame)

out.release()
print(f"Video saved to {output_mp4}")

if __name__ == "__main__":
input_bin = "video.bin"
output_mp4 = "video.mp4"
frame_width = 640 # 帧宽度(根据你的数据更改)
frame_height = 480 # 帧高度(根据你的数据更改)
frame_rate = 30 # 帧速率(根据需要更改)

create_video_from_bin(input_bin, output_mp4, frame_width, frame_height, frame_rate)

为什么说它折磨人,是因为这段代码复原的MP4文件是一坨⑩,有重影有莫名其妙的诡异的移动,还有几乎糊到

看不清的flag,只能说还好是出题人良心大发,flag里面的字母没做替换,不然我是真的做不出来的

我看official题解是用GPT4帮忙写的,羡慕富哥了,我的GPT3.5就只能写出此等低劣代码(恼

我一直以为是帧宽度和帧高度的原因会导致我根本看不清,结果在我N次尝试之后,发现还得是GPT给我初始

的帧宽和帧高相比之下最清晰,所以我就拿着那个糊到不能再糊的MP4,一帧一帧的仔细看,从缝里扣出flag

最后我也提交了N次,N-1次都错了,是因为我的flag{ 后的第一个字母i弄成了大写I(奈何我看不清楚,最后我还是灵光一闪,把I改成了i,flag对了,说实话当时我真的很感动,也只能说幸运女神又眷顾了我

Last:Summary

题目做到这里就没再做出别的了,还是自愧不如把,但是~~~

Hackergame好玩,爱玩,多来点

今年我已经是大二了,明年的hg我应该是大三了,到那时一定还会再来捧场

但是应该就不会和小东西们冲榜了^_^

感谢科大

感谢西电XDSEC


Hackergame2023-Writeup
http://example.com/2023/11/03/Hackergame2023-Writeup/
作者
Jednersaous
发布于
2023年11月3日
许可协议