root@xmas-ctf:~# cat writeups.md

📝 XMAS CTF 2025 Write-ups

📄 Visualizar versão completa (não resumida) comentada pelo professor

🎄 Introdução

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).

⚠️ Atenção (spoilers): este documento revela o caminho completo até as flags. Use como material de estudo depois de tentar resolver por conta própria.

🎁 Write-ups

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.

Desafio 1: Payload Ofuscado 100 pontos

Categoria: Análise de Código / Web (XSS)
Dificuldade: Fácil
Arquivo inicial: desafio_payload_ofuscado.c

🎯 Objetivo

Encontrar um “payload” escondido em um arquivo .c e seguir as pistas até a flag final.

🔍 Etapa 1 — Encontrando o ZIP escondido

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:

Pista encontrada no arquivo:
vcme3ncontrouzip

O próprio conteúdo também deixa evidente a substring zip, indicando que a próxima etapa é um arquivo .zip:

✓ Próxima etapa: vcme3ncontrou.zip

🔍 Etapa 2 — Entendendo a falha no app.js

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.

💡 Interpretação: quando uma aplicação transforma input do usuário em HTML e renderiza sem sanitização adequada, isso é um indicador clássico de XSS (Cross-Site Scripting).

O próprio desafio deixa uma pista dizendo que “a sigla abreviada da falha + .txt” é o próximo arquivo:

✓ Próxima etapa: XSS.txt

🔍 Etapa 3 — Trusted Types e o tipo de XSS

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.

✓ Próxima etapa: DOM.txt

Ao abrir o DOM.txt, a flag é revelada:

✓ Flag Final: d0mhackerr

🎓 Conceitos aprendidos

  • CTF linear (pistas encadeadas)
  • Identificação de “ruído” vs. sinal
  • XSS e renderização de input do usuário
  • Trusted Types e DOM XSS

Desafio 2: HQs Escondidas 150 pontos

Categoria: Esteganografia / Forense
Dificuldade: Fácil
Arquivo inicial: HQs.jpg

🎯 Objetivo

Encontrar e extrair informações escondidas a partir de uma imagem.

🔍 Etapa 1 — A pista está “visível”

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:

✓ Próxima etapa: barcode.gif

🔍 Etapa 2 — Lendo o código de barras

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:

Texto extraído do código de barras:
vcemtcuriosopodeirprabompontozip

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.

✓ Próxima etapa: bom.zip (ou bomponto.zip)

🔍 Etapa 3 — Navegando o “labirinto” e achando o arquivo suspeito

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”:

✓ Arquivo suspeito: 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:

Frase cifrada encontrada no arquivo:
zg qi zirgiy e jpek jmrep il gxjgsqxigrmgewhigsqtyxeges

🔓 Etapa 4 — Cifra de César (shift 4)

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:

Texto puro:
vc me venceu a flag final eh ctfcomtecnicasdecomputacao
✓ Flag Final: ctfcomtecnicasdecomputacao

🎓 Conceitos aprendidos

  • Inspeção visual (quando a “pista está na imagem”)
  • Leitura de códigos de barras
  • Ruído intencional e triagem por “anomalias”
  • Cifra de César (deslocamento)

Desafio 3: Musicalidade 200 pontos

Categoria: OSINT / Forense de Rede / Multi-etapas
Dificuldade: Média
Arquivo inicial: musicalidade-longa.txt

🎯 Objetivo

Seguir uma trilha de pistas (texto → vídeo → ZIP → tráfego de rede → redes sociais) até a flag final.

🔍 Etapa 1 — “Agulha no palheiro” dentro do TXT

O arquivo é longo (a barra de rolagem entrega). Ao rolar até perto da metade, aparece uma string com “youtube”:

Pista dentro do TXT:
6ODycFBH2yw youtube

Isso indica o vídeo do YouTube:

Link do vídeo:
youtube.com/watch?v=6ODycFBH2yw

🔍 Etapa 2 — Vídeo longo e a pista “no quadro”

O vídeo tem quase 6 horas. A dica é procurar mudanças visuais no vídeo. Na minutagem 01:01:13, aparece bem grande:

✓ Próxima etapa: 110.zip

🔍 Etapa 3 — ZIP com senha escondida no final do vídeo

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:

✓ Senha do ZIP: admin1234

🔍 Etapa 4 — tcpdump e a pista para Instagram

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:

Indícios encontrados no tráfego:
www.instagram.com/sanjose.institute instagram.com/sanjose.institute/p/CzP0sJqL9Aa/

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.

🔍 Etapa 5 — Comentário suspeito no perfil e lescl.txt

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:

✓ Próxima etapa: lescl.txt

🔍 Etapa 6 — Binário → hash → admin1234

O lescl.txt tem várias linhas de binário. Ao decodificar, além de uma mensagem, surge esta string:

String em hexadecimal (32 chars):
c93ccd78b2076528346216b3b2f701e6

Pelo tamanho/formato, é muito provavelmente um hash de 128 bits (ex.: MD5). Usando um cracker/banco de hashes (ex.: CrackStation), a palavra correspondente é:

✓ Resultado do hash: admin1234

Isso ainda não é a flag — é a próxima etapa. Uma extensão muito comum em CTFs é .zip:

✓ Próxima etapa: admin1234.zip

🔍 Etapa 7 — Vídeo “Grupo Kaza” e a palavra em maiúsculo

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.

✓ Próxima etapa: 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”.)

✓ Flag Final: parqueegames

🎓 Conceitos aprendidos

  • Encontrar pistas em arquivos longos
  • Extração de informação de vídeo (quadros/overlays)
  • Arquivos protegidos por senha e “pista escondida”
  • Leitura de tráfego (pcap/tcpdump) como indício, não como resposta
  • OSINT/SOCMINT (achar comentários e fontes públicas)
  • Decodificação de binário e cracking de hash (MD5)
  • GEOINT (caminho alternativo)

Desafio 4: Enigma das Portas 250 pontos

Categoria: Binários / Reversing / Linux
Dificuldade: Média
Arquivo inicial: enigma_ctf (e pacote enigma_ctf_pack.zip)

🎯 Objetivo

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.

🔍 Etapa 1 — Entendendo o formato do desafio

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:

✓ Próxima etapa: enigma_ctf_pack.zip

O ZIP contém:

  • README_BINÁRIOS
  • enigma_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:

chmod +x enigma_ctf_linux_x86_64_static
./enigma_ctf_linux_x86_64_static

🧠 Resolução 1 — Jogando “do jeito difícil”

O jogo volta ao início quando você erra e o tempo vai diminuindo. A estratégia eficiente é:

  1. Passar pelas perguntas (mesmo errando), anotando cada uma.
  2. Pesquisar e anotar a resposta correta.
  3. No final, repetir o quiz copiando/colando as respostas.

✅ Respostas das 15 perguntas

Gabarito:
1) /etc/shadow 2) CTF 3) 750 4) 32 5) 20 6) 64 7) SIGKILL 8) /etc/passwd 9) A 10) /proc/net/dev 11) 00010110 12) chmod 13) 12345678 14) ^ 15) 0
✓ Flag Final (jogando): dashboard

🧩 Resolução 2 — “Hackeando” o binário (didático, com permissão)

⚠️ Importante: as técnicas abaixo são para fins didáticos, em ambiente controlado/CTF, com permissão. Não use fora desse contexto.

🧪 Método A — LD_PRELOAD para “aceitar tudo”

Muitos programas comparam respostas usando strcmp/strncmp/memcmp. Se você substituir essas funções para sempre retornarem “igual”, qualquer resposta passa.

mkdir -p ~/ctf_cheat && cd ~/ctf_cheat
nano cheat.c
cheat.c
#define _GNU_SOURCE #include <string.h> int strcmp(const char *a, const char *b) { (void)a; (void)b; return 0; } int strncmp(const char *a, const char *b, size_t n) { (void)a; (void)b; (void)n; return 0; } int memcmp(const void *a, const void *b, size_t n) { (void)a; (void)b; (void)n; return 0; }
gcc -shared -fPIC -O2 -o cheat.so cheat.c
LD_PRELOAD=$HOME/ctf_cheat/cheat.so ./enigma_ctf_linux_x86_64_static

Agora você tende a conseguir “passar” respondendo qualquer coisa, até o programa imprimir a flag.

🧪 Método B — GDB para “farejar” o print da 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.

gdb -q ./enigma_ctf_linux_x86_64_static
Sequência de comandos (resumo):
(gdb) set pagination off (gdb) catch syscall write (gdb) condition 1 $rdi==1 (gdb) run (gdb) x/s $rsi (gdb) bt

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.

✓ Flag Final: dashboard

🎓 Conceitos aprendidos

  • Executáveis Linux (dinâmico vs. estático)
  • Estratégia de resolução sob restrição de tempo
  • LD_PRELOAD e “hook” de funções de comparação
  • Debugging com GDB (syscalls, breakpoints e inspeção de memória)

🎉 Conclusão

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.

📚 Próximos passos

  • Refaça os desafios “do zero” (sem olhar) para consolidar os passos.
  • Documente seu próprio raciocínio (isso vale ouro em entrevistas).
  • Treine em outras plataformas e compare abordagens diferentes.
🌟 Sugestões de prática:
  • HackTheBox
  • OverTheWire
  • PicoCTF
  • ValeSecConf CTF (VSCTF)
  • Hacktest.net
  • Rootme
  • pwnable.kr
  • VulnHub (VMs "Boot-to-Root")
  • YouTube (LiveOverflow)

🚀 Curso: Introdução ao Capture The Flag Prático

Treine CTF do jeito certo — com orientação, prática e competição

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.

  • Aulas + desafios (mão na massa) com progressão clara
  • CTFs reais: como pensar, como pesquisar, como documentar write-ups
  • Grupos privados para formar time, treinar e competir
  • Metodologia de professor: atalhos, armadilhas comuns e mentalidade de resolução