Bem-vindo aos write-ups oficiais do XMAS CTF 2025! Aqui você encontra as soluções detalhadas dos 4 desafios da competição.
Uma observação importante: competições de CTF tendem a ficar muito mais fáceis em Linux, porque o terminal oferece comandos e ferramentas simples para procurar “agulhas no palheiro” (strings, metadados, padrões, etc.). Ainda assim, as resoluções abaixo foram pensadas para funcionar no Windows (com alternativas em Kali/Linux quando fizer sentido).
Os desafios seguem o estilo linear: cada etapa geralmente entrega uma pista (um nome de arquivo, um link, uma palavra-chave, etc.) que te leva à próxima etapa — até chegar na flag final.
Encontrar um “payload” escondido em um arquivo .c e seguir as pistas até a flag final.
Ao baixar e abrir o arquivo, o texto menciona “olhos de lince” e o conteúdo traz muito “ruído” (inclusive marcando trechos como ruído). A estratégia é procurar por algo que “salte aos olhos”.
Na parte do payload cache, aparece um padrão claro:
O próprio conteúdo também deixa evidente a substring zip, indicando que a próxima etapa é um arquivo .zip:
vcme3ncontrou.zip
O ZIP contém um README.txt e um app.js de um “guestbook”. A pergunta é: qual é a falha do código?
O arquivo tenta despistar, mas a parte decisiva é a função que adiciona entradas: o texto do usuário é montado como HTML, o que significa que qualquer conteúdo HTML (e scripts) pode ser renderizado na página.
O próprio desafio deixa uma pista dizendo que “a sigla abreviada da falha + .txt” é o próximo arquivo:
XSS.txt
No XSS.txt, há uma pergunta: qual tipo de problema os Trusted Types resolvem?
Trusted Types é uma API de segurança do navegador para mitigar um tipo específico de XSS: DOM XSS.
DOM.txt
Ao abrir o DOM.txt, a flag é revelada:
Encontrar e extrair informações escondidas a partir de uma imagem.
O primeiro passo é abrir a imagem. Ela é bem grande, o que em desafios fáceis/médios costuma indicar algo escondido “a olho nu”. Ao dar zoom e inspecionar, aparece escrito na própria imagem:
barcode.gif
O barcode.gif é um código de barras longo. Um leitor de código de barras (o padrão usado aqui é muito parecido com Code 39) converte para o texto:
Em outras palavras: “vc é mt curioso pode ir pra bom.zip”. Dependendo da leitura, pode surgir dúvida entre bom.zip e bomponto.zip — vale testar ambas.
bom.zip (ou bomponto.zip)
O ZIP contém uma pasta com várias subpastas e muito ruído (inclusive zips corrompidos). Como o nível não é alto, a flag/pista tende a estar em algo mais “trivial”.
No meio das pastas, um arquivo se destaca: em src/tools há um ZIP pequeno e com nome “diferente do ruído”:
files.zip (corrompido, ~1KB)
Como está corrompido, a ideia é verificar se ele é mesmo ZIP (ex.: comando file) ou abrir em editor hexadecimal/bloco de notas. Logo aparece uma frase cifrada:
O texto parece uma cifra de substituição simples. Um brute-force de deslocamento (ex.: Cifra de César) revela o deslocamento 4 e o texto puro:
Seguir uma trilha de pistas (texto → vídeo → ZIP → tráfego de rede → redes sociais) até a flag final.
O arquivo é longo (a barra de rolagem entrega). Ao rolar até perto da metade, aparece uma string com “youtube”:
Isso indica o vídeo do YouTube:
O vídeo tem quase 6 horas. A dica é procurar mudanças visuais no vídeo. Na minutagem 01:01:13, aparece bem grande:
110.zip
Ao tentar extrair 110.zip, é pedida uma senha. Depois de testar senhas comuns e tentativas óbvias (ex.: 110, 110zip, 6, etc.), a pista real está mais adiante no próprio vídeo.
Próximo do fim, em 05:54:11, aparece a senha em azul no canto inferior direito:
Dentro do ZIP, há um README e um arquivo tcpdump. O enunciado fala de um comentário suspeito, e o tcpdump indica análise de tráfego.
No tráfego, aparece acesso ao Instagram e ao perfil:
O link direto não existe mais, e também aparece um “findme!” em um pacote, mas não é a flag. A chave é perceber que o README contém o termo OSINT, então a busca deve ser feita nas redes sociais (SOCMINT) e não “dentro” do dump.
Ao analisar as publicações do perfil @sanjose.institute, em uma publicação de 15 de janeiro de 2023 existe um comentário com a próxima pista:
lescl.txt
O lescl.txt tem várias linhas de binário. Ao decodificar, além de uma mensagem, surge esta string:
Pelo tamanho/formato, é muito provavelmente um hash de 128 bits (ex.: MD5). Usando um cracker/banco de hashes (ex.: CrackStation), a palavra correspondente é:
Isso ainda não é a flag — é a próxima etapa. Uma extensão muito comum em CTFs é .zip:
admin1234.zip
O ZIP contém um README e um vídeo MP4. O README diz que a etapa final está no arquivo com o nome do que está sendo construído no vídeo, com extensão .txt em maiúsculo.
No vídeo, aparece uma marca d’água “Grupo Kaza”. Pela via SOCMINT, você encontra o vídeo no perfil grupo.kaza (Instagram), publicado em 30 de junho de 2025, e a legenda revela o nome do local: Parque Una.
UNA.txt
(Existe também um caminho por GEOINT, inferindo cidade e local via imagens e mapas, chegando ao “Parque UNA São José dos Campos”.)
enigma_ctf_pack.zip)
Resolver um quiz de 15 perguntas (com tempo e punição por erro) ou extrair a flag do binário por técnicas de engenharia reversa.
O link inicial não tem extensão, o que pode indicar uma aplicação web (/enigma_ctf/index.html) ou um binário. Ao abrir, o desafio explica que foi feito para Linux e aponta para um pacote:
enigma_ctf_pack.zip
O ZIP contém:
README_BINÁRIOSenigma_ctf_linux_x86_64 (dinâmico)enigma_ctf_linux_x86_64_static (estático, mais compatível)Recomendação: executar em Linux ou no Windows via WSL. Exemplo:
O jogo volta ao início quando você erra e o tempo vai diminuindo. A estratégia eficiente é:
Muitos programas comparam respostas usando strcmp/strncmp/memcmp. Se você substituir essas funções para sempre retornarem “igual”, qualquer resposta passa.
Agora você tende a conseguir “passar” respondendo qualquer coisa, até o programa imprimir a flag.
A ideia: mesmo que o binário esconda a flag, ele precisa montá-la em memória e imprimir no final. Com GDB, você pode pausar em syscalls de escrita (write) e inspecionar buffers.
Seguindo o fluxo sugerido (achar o bloco de “vitória” por comparação com 0x0f, pôr breakpoint, inspecionar $rdi/$rsi no printf), você chega na string final.
Parabéns por completar o XMAS CTF 2025! Se você chegou até aqui, você já passou por técnicas essenciais de CTF: análise, busca por pistas, forense, OSINT, e até engenharia reversa.
Se você curtiu o XMAS CTF, você vai amar o nosso curso especial Introdução ao Capture The Flag Prático: aulas objetivas + desafios guiados de todos os tipos (web, forense, crypto, OSINT, reversing, pwn, etc.) e grupos privados de alunos para vencer competições e acumular prêmios juntos.