吾爱 2024 春节解题领红包 Web 题 WriteUp
Web(×) Misc(√)
辛苦出题大大,整体体验感不错。小问题就是难度设置不是很舒服,下面也会提到x。
正文
flag1{52pj2024}
视频第 2 秒,白色亮圈从中心扩大的时候,很容易发现后面有字(始终保持黑色的区域)。我直接看出来了,因为是有意义的内容。也可进行叠加如下:
flag2{xHOpRP}
视频第 5 秒开始的二维码,用 Photoshop 拼接后反相,识别后得到网址 https://2024challenge.52pojie.cn/index.html(下称“**主网址**”)。登录后在响应标头中即可看到。
这么前面的 flag,然后我就一直在视频中找ww
同时还看到了 flag4_flag10.png 这张图片。
flag3{GRsgk2}
视频第 0 秒,和 flag1 一样直接看了。或许有一些我不知道的处理方法,希望各位大神指点。
flag4{YvJZNS}
flag2 中说了,图片中明文。
flag5{P3prqF}
主网址源码中注释。发现颜色被改成白色,并设置不可选中,导致一开始并没有看到。修改后即得到 flag5。
同时看到 flag9 也在这里。
现在是在 ……….. 中找到字母一个个拼出来,在 flag9 中会看到更直观的显示。
flag6{20240217}
主网页中进入 flag6,查看源码发现它自己会去算的,1e8 次循环,循环体中也没看到卡时间的部分,就让它自己算即可。甚至贴心的在 console 中有输出,65s 就出了结果。
flag7{Djl9NQ}
视频第 21 秒,前往对应 github 仓库,查看 commit 记录,得到 flag7。
甚至 commit message 都这么直接,是故意的还是不小心?
flag8{OaOjIK}
主网页中进入 flag8 & flagB,玩到 10000 分领了 flag8。正确姿势见 flagB。
flag9{KHTALK}
flag5 中说了,看这 / \ _
总感觉很眼熟,但一时想不出来。Brainfuck、二进制对应等等都想过,怎么映射都对不上。后来终于想起来了,请看:
调整网页宽度,flag9 就出来了。同时 flag5 更清楚了。
flag10{6BxMkW}
flag4_flag10.png 那张图片,考虑隐写,先把老套路的方法都上一遍再说,结果 Stegsolve 一下就出来了。
flag11{HPQfVF}
主网页中进入 flag11,发现是一张图片被分成很多块后显示在特定位置,源码中提示在 0 ~ 100 范围内调整 var1 和 var2 两个值。
下载 index.html 和 flag11.png 到本地,编写脚本:
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get('file:///xxx/index.html')
for var1 in range(0, 101):
for var2 in range(0, 101):
script = f"document.documentElement.style.setProperty('--var1', '{var1}');"
script += f"document.documentElement.style.setProperty('--var2', '{var2}');"
driver.execute_script(script)
print(var1, var2)
time.sleep(0.01)
driver.quit()
快速遍历 0~100 的范围,每 0.01 秒改变一次图像。不断缩小遍历范围,最后得到 flag11。
一开始还以为是小方块组成对应文字,后来才意识到是重排顺序组成一张图片,被自己蠢的笑了。。。
flag12{HOXI}
主网页中进入 flag12,发现是将你的输入跑一段汇编,结果非零则输出正确 flag。无奈汇编看不懂,只能跑暴力。
启用本地替代,修改程序,开始暴力:
非常漫长,如果不自信到底有没有在跑可以时不时设个断点看一下。记得等了个 5~10 分钟才出了结果。
此时 secret 几乎是上界。。。之后重新倒着暴力了一遍,不用一分钟就出来了。
flagA
没出来,主网页登录后 login 响应标头中有 flagA,看上去像 base64 加密的,但解密出来是乱码。在网页的各个地方找解密接口找不着。
flagB
看到 flagB 价格的数字这么“精准”,能想到可能和溢出相关,v50 的提示的确就是溢出。
对于不大了解的,暂时可以简单理解为,当数字达到正的最大值时,再加 1,则会变成负的最小值,反之同理。相当于一个循环的结构。
购买个数随便输了个很大的数字,提示“购买后金币大于原金币”,被拦截了。因此需要精心构造一个数字。
首先要确定存储金币的数据类型的范围。用便宜的 100 一个的东西开始试(精确),逐步加大购买个数(后面加 0),找到提示“钱不够”和“购买后金币大于原金币”的分界线,就能确定最高位,然后继续精确下一位,等等。前几位试了知道是 9.22e16 左右,乘上单价也就是说(负数的)数据范围在 -9.22e18 左右,熟悉的就知道应该是 64 位有符号整数了( $-2^{63} \sim 2^{63}$ )。
然后就可以构造购买个数了。记 $N=2^{63}$,则购买价格为 $Q$ 的东西时,数量为 $\lceil\frac{2N}{Q}\rceil$ 。
flagC
默认图片中,显示种类正确的四种就是全部所需的图片。然后就像这样试位置就行了。
最后的图片就长这样:
一开始还以为很烦,不知道它跑的权重的 numClass 有多少,以为每个分类一个个都要试过。被唬住了,懒得去试。
这高级题所需的技术不就和最开始拼接视频的二维码一样吗……高级题到手的前十首杀奖励飞了,这 400 吾爱币有点红眼啊 (bushi)
后注
一些尝试过的点:
- 前文已经说过的
- 查看视频的声谱图
- 观察发现各个 flag 的地址均形如
https://2024challenge.52pojie.cn/flag?/index.html
,一开始卡在 flag2 时,尝试访问 flag2/index.html
- flagB 针对 info 做逆向
忘了,碰壁的东西就是忘得快