2024吾爱解题领红包 WP

全静态与动态Flag

静态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

Github提交记录

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', '', '', '']}

LICENSED UNDER CC BY-NC-SA 4.0
Comment