静态Flag
Flag1
在视频第二秒, 粒子从中央向外扩散, 会发现有阴影, 一帧一帧看就能得到flag1{52pj2024}
Flag2
请求https://2024challenge.52pojie.cn/
curl -v https://2024challenge.52pojie.cn/
可见响应头中有Flag2
X-Flag2: flag2{xHOpRP}
Flag3
视频开头雪花屏部分, 仔细看能看到Flag3 (挺费眼睛的)
Flag4
访问站点, 发现页面请求了flag4_flag10.png
Flag5
发现页面中的提示
将文字改为黑色, position改为relative后得到
将这段文字中的字母, 数字和{}提取后得到
flag5{P3prqF}
Flag6
观察JS, 发现在比较MD5
const t0 = Date.now();
for (let i = 0; i < 1e8; i++) {
if ((i & 0x1ffff) === 0x1ffff) {
const progress = i / 1e8;
const t = Date.now() - t0;
console.log(`${(progress * 100).toFixed(2)}% ${Math.floor(t / 1000)}s ETA:${Math.floor(t / progress / 1000)}s`);
}
if (MD5(String(i)) === '1c450bbafad15ad87c32831fa1a616fc') {
document.querySelector('#result').textContent = `flag6{${i}}`;
break;
}
}
查询MD5, 得
Flag7
Flag8
玩吧, 玩到10000金币即可
Flag9
Flag5那的字符画, 调整浏览器窗口就能显示出
Flag10
使用StegSolve将flag4_flag10.png反色 (Color Inversion)
Flag11
直接用gaps拼不好的, 看提示
提示里让我们给var1和var2在0-100范围内找到一个合适的值, 我直接爆破!
let El = document.documentElement
function Find(v1, v2) {
if (v1 === 100) {
return
}
if (v2 === 100) {
v1++
v2 = 0
}
v2++
El.style = '--var1: ' + v1 + '; --var2: ' + v2
setTimeout(Find, 100, v1, v2) // 间隔0.1s方便观察拼的情况
}
Find(0, 0)
得到还原好的flag11
对应的var1, var2:
--var1: 71;
--var2: 20;
Flag12
分析WASM
i32.const 1213159497
i32.const 0
local.get $var0
i32.const 1103515245
i32.mul
i32.const 1
i32.eq
select
判断了$var0是不是1103515245的倒数, 如果是就返回1213159497
直接把函数get_flag12中的num替换成1213159497即可
最后得到flag12{HOXI}
动态Flag
FlagA
在页面上登录后会将uid, flagA存到Cookie里
curl -v -d "uid=你的UID" https://2024challenge.52pojie.cn/auth/login
Set-Cookie: uid=Zc0EAIdE+35lTUCZkVxqlGEeZrWyzHrJHAiT4M9J3abVr7Q=; path=/; SameSite=Lax
Set-Cookie: flagA=M1It0z/FXQNBFWnjCM9J/JWOjPImaFIrm/ZYSjlUQRaBKk1KlYbOyMObzQ==; expires=Sat, 24 Feb 2024 02:30:00 GMT; path=/; SameSite=Lax
注意到每次打开页面都会请求https://2024challenge.52pojie.cn/auth/uid从Cookie解密uid, 猜想是否可以将FlagA内容替换至其中
于是将flagA的内容替换到uid里, 再刷新页面即可得到flagA
curl -b "uid=FlagA内容" https://2024challenge.52pojie.cn/auth/uid
FlagB
V他50(建议V我50), 得到提示
竟然真的有人v我50,真的太感动了。作为奖励呢,我就提示你一下吧,关键词是“溢出”。
考虑int64整数溢出, 一般买东西算总价都是单价 x 数量, 所以只要买8446744073709551615(也就是2 ** 64 - 1) / 999063388个flagB就OK了 (但还是会扣除大概28金币)
FlagC
分析一下可以发现, 在前端用yolov5n识别完物品后会在服务端对物品的种类进行比较, 只有全部正确才会返回flagC
{
"boxes": [...],
"scores": [...],
"classes": [2, 5, ...] // 物品的种类
}
{
"hint": "物体太多了",
"labels": [
"car 种类错误",
"bus 种类正确 位置正确",
...
], // 长度等于classes的的长度
"colors": [...]
}
用python跑一下
import requests
import tqdm
CLS = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Cookie = '' # 填充你的Cookie
for i in tqdm.tqdm(range(len(CLS))):
for a in range(81):
CLS[i] = a
r = requests.post('https://2024challenge.52pojie.cn/flagC/verify', {
"boxes": [0.0071830302476882935, 0.5186262726783752, 0.4009798765182495, 0.6479262709617615, 0.40771162509918213, 0.5121312737464905, 0.7820707559585571, 0.7769460082054138, 0.3125038146972656, 0.2294374704360962, 0.728165864944458, 0.4627001881599426, 0.002122625708580017, 0.8341933488845825, 0.3802390694618225, 0.9994925260543823, 0.8375666737556458, 0.6610859632492065, 0.9833332896232605, 0.9978412389755249, 0.46407967805862427, 0.7901233434677124, 0.7629221081733704, 0.9946882724761963, 0.5860870480537415, 0.01528950035572052, 0.6056223511695862, 0.05522865056991577, 0.49284374713897705, 0.019939638674259186, 0.5142461061477661, 0.06407386064529419, 0.7947754859924316, 0.45499294996261597, 0.9924987554550171, 0.6384640336036682, 0.7654308080673218, 0.03613254427909851, 0.9887223243713379, 0.2596513032913208, 0.043191954493522644, 0.025760412216186523, 0.27349424362182617, 0.48559069633483887, 0.7787967324256897, 0.2953518033027649, 0.9544115662574768, 0.45228803157806396, 0.41201093792915344, 0.03150711953639984, 0.42948994040489197, 0.07240761071443558, 0.01391458511352539, 0.6711101531982422, 0.41128668189048767, 0.8037518262863159],
"scores": [0.8933814167976379, 0.8905048370361328, 0.8846318125724792, 0.8726909756660461, 0.8570783138275146, 0.8548367619514465, 0.8514701724052429, 0.8206562399864197, 0.8038725256919861, 0.7646903991699219, 0.723249614238739, 0.6844016909599304, 0.6817190051078796, 0.4212005138397217],
"classes": CLS
}, json=True, headers={'Cookie': Cookie}).json()
if '错误' in r['labels'][i]:
pass
else:
break
print(CLS)
print(r)
最后得到
[6, 5, 3, 80, 80, 80, 80, 80, 80, 80, 8, 80, 80, 80]
{'hint': 'flagC{bc99ed00} 过期时间: 2024-02-24 10:50:00', 'labels': ['train 种类
正确 位置正确', 'bus 种类正确 位置正确', 'motorcycle 种类正确 位置正确', '', '',
'', '', '', '', '', 'boat 种类正确 位置正确', '', '', ''], 'colors': ['99ff99',
'99ff99', '99ff99', '', '', '', '', '', '', '', '99ff99', '', '', '']}