Миссия "Автокража": как я решал необычное задание CTF
Привет, Pikabu!
Сегодня хочу поделиться решением одного из необычных и заданий на одной площадке с CTF заданиями . Но прежде давайте разберемся, что такое CTF.
CTF, или Capture The Flag, — это вид соревнований по кибербезопасности, где участники решают различные задачи из области информационной безопасности, криптографии, веб-безопасности, программирования и многих других дисциплин. Задачи могут варьироваться от простых до крайне сложных, и каждое решение приносит команде очки. Обычно соревнования делятся на два основных формата: "Jeopardy", где участники выбирают задачи по интересующим категориям, и "Attack-Defense", где каждая команда защищает свою сеть и атакует сети противников
Само задание выглядит так
Инопланетяне украли мой автомобиль! Нашедшему вознаграждение в виде флага! Особые приметы: инфернальное название, цвет оранжевый, золотые диски, последний раз был замечен где-то в Bone County
На первый взгляд не очень понятно что надо сделать и где начинать искать. Но давайте начнем по порядку. В тексте задания упоминается какая то локация Bone Country, если погуглить, то станет понятно что это локация из игры Grand Theft Auto: San Andreas.
У GTA:SA есть мультиплеерная составляющая - SAMP. Неужели это отдельный игровой сервер где надо найти ctf флаг? Да, это он. Ah shit, here we go again
И так, у нас есть игровой сервер с кучей машин, но нам надо найти одну единственную. Из описания задания у нас есть подсказка, что машина имеет инфернальное название. Если посмотреть список техники из GTA:SA, то можно найти машину с названием Infernus, ну собственно она нам и нужна.
Теперь остается вопрос, где ее искать на такой большой площади? Если вы вдруг знакомы с лором и пасхалками из GTA:SA, то наверняка поняли эту отсылку про инопланетян.
Собственно в Bone Country только 2 места связанных с НЛО, это военная база и придорожная закусочная с летающей тарелкой. Ну собственно место для поиска понятно. Но это слишком просто, а задание помечено как среднее, значит давайте решим его более сложным способом.
Представим, что вы нормальный, адекватный человек и никогда не играли в GTA и все это время тратили с пользой для общества. Мы можем написать скрипт, который будет опрашивать всю технику в поле загрузки игрока и искать необходимую машину. Благо, за все это время в для GTA:SA был разработан мод MoonLoader, который позволяет загружать свои lua-скрипты.
И так, нам понадобится, сам MoonLoader, библиотека SAMPFUNC, версия SAMP 0.3.7-R3(Это важно) и версия GTA:SA v1.0.0 US(Это тоже важно)
И если после установки вы видите такой загрузочный экран, значит все установлено верно
Тогда приступим к написанию скрипта
wm = require 'windows.message'
font_flag = require('moonloader').font_flag
font = renderCreateFont('Arial', 11, font_flag.SHADOW + font_flag.BOLD)
local infernusModelId = 411 -- ID модели Infernus в GTA:SA
local vrender = false -- переменная для переключения отображения
function main()
if not isSampLoaded() or not isSampfuncsLoaded() then return end
while not isSampAvailable() do wait(0) end
addEventHandler('onWindowMessage', function(msg, wparam, lparam)
if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
if wparam == VK_F3 then
vrender = not vrender
end
end
end)
while true do
wait(0)
if vrender then
local vehicles = getAllVehicles() -- Получаем список всех транспортных средств в игре
for i, vehicle in ipairs(vehicles) do
if getCarModel(vehicle) == infernusModelId and isCarOnScreen(vehicle) then
displayInfernusInfo(vehicle) -- Отображение информации о Infernus
end
end
end
end
end
function displayInfernusInfo(vehicle)
-- Получаем координаты транспортного средства
local cx, cy, cz = getCarCoordinates(vehicle)
-- Конвертируем координаты в позицию на экране
local x, y = convert3DCoordsToScreen(cx, cy, cz)
-- Строка, которую хотим отобразить
local model = "Infernus (" .. tostring(getCarModel(vehicle)) .. ')'
-- Получаем длину и высоту текста для отрисовки
local length = renderGetFontDrawTextLength(font, model, true)
local height = renderGetFontDrawHeight(font)
-- Установим цвет текста
local textcolor = 0xFF00B811 -- Зелёный
if getCarDoorLockStatus(vehicle) == 2 then
textcolor = 0xFFEC0000 -- Красный, если двери заблокированы
end
-- Отрисовываем текст
renderFontDrawText(font, model, x - (length + 5) / 2, y - (height + 7) / 2, textcolor, true)
end
И так, скрипт готов. Скрипт активируется на клавишу F3. Сохраняем его в папку и заходим на сервер. Быстрее всего будет найти машину с воздуха, поэтому отправляемся в аэропорт Las Venturas и садимся в вертолет. Убеждаемся что наш скрипт работает, так как Infernus рядом с аэропортом прекрасно виден.
Начинаем облетать заданную локацию с севера на юг и в скором времени заметим Infernus помеченный красной надписью, а это значит что двери авто заблокированы, чтобы авто не угнали.
Похоже это наш пациент. Подходим к нему ближе и да, это он, а сверху флаг. Осталось только вбить его в форму и задание выполнено
Всем спасибо за внимание.