CTF Learn — The Simpsons — Writeup

Renan Santana
4 min readJul 31, 2020

--

Olá pessoas! Hoje vos trago o writeup do desafio “The Simpsons” do site CTFLearn. O link para este desafio caso você queira tentar resolver por conta própria antes de ler estre artigo está aqui.

Mas caso você só esteja passeando, ou “só dando uma olhadinha”, seja muito bem vindo, aperte os cintos, e vamos começar!

Este é um desafio de categoria “criptografia”. E ele começa com essa simples imagem:

Início do desafio

Como ja é de costume, ao receber uma imagem nesses tipos de desafios, eu sempre começo analisando as strings dela com o comando strings(ah vá!).

Como sempre, este comando retorna uma salada de caracteres aleatórios. Mas lá no final, eis que encontramos uma pista:

...
P*/J
yYWR
-Od|%
Ahh! Realistically the Simpsons would use octal instead of decimal!
encoded = 152 162 152 145 162 167 150 172 153 162 145 170 141 162
key = chr(SolutionToDis(110 157 167 040 155 165 143 150 040 144 151 144 040 115 141 147 147 151 145 040 157 162 151 147 151 156 141 154 154 171 040 143 157 163 164 077 040 050 104 151 166 151 144 145 144 040 142 171 040 070 054 040 164 157 040 164 150 145 040 156 145 141 162 145 163 164 040 151 156 164 145 147 145 162 054 040 141 156 144 040 164 150 145 156 040 160 154 165 163 040 146 157 165 162 051)) key = key + key + chr(ord(key)-4)
print(DecodeDat(key=key,text=encoded))

Pelo pseudo código que a dica nos fornece, percebemos que:

  • Temos uma mensagem encodada, na variável encoded
  • Temos uma chave, na variável key
  • Temos um print de um resultado final que é a mensagem, descriptografada com a chave
  • Todo o conteúdo das variáveis, estes números, muito provavelmente está em base 8, como sugere a diga “Simpsons would use octal instead of decimal!”

Convertendo os octals

Vamos primeiro converter o valor da variável encoded. Para isso, vou usar python

Para converter um valor de octal para decimal no python, é só fazer:

int(‘<valor_octal>’, 8)

Outra coisa que precisamos fazer também, é transformar o número decimal, em uma letra. Descobriremos “qual número equivale a qual letra” usando a famosa tabela ASC II. Em python, para transformar um número decimal na sua letra correspondente na tabela ASC, faça:

chr(<numero>)

Descobrindo o conteúdo da variável “encoded”

Resultado:

string_encoded = ‘jrjerwhzkrexar’

Descobrindo o conteúdo da variável “key”

Agora, da mesma forma, vamos descobrir a chave

Após esses passos, chegamos a seguinte string:

"How much did Maggie originally cost? (Divided by 8, to the nearest integer, and then plus four)"

Resolvendo a questão

Bom, vamos lá, quanto custava Maggie originalmente?

A questão se refere a abertura de Simpsons, quando o caixa do supermercado passa Maggie pelo leitor como se ela fosse um produto. Qual preço aparecia ali originalmente?

Eu não sei, mas a internet sabe tudo! Achei a resposta aqui.

“Maggie originally scanned for $847.63”

Seguindo as dicas “(Divided by 8, to the nearest integer, and then plus four)”, dividimos este valor por 8:

  • 847,63 / 8 = 105,95

Pegamos o inteiro mais próximo:

  • 106

Somamos 4:

  • 106 + 4 = 110

Chegamos ao valor 110

Mas não se esqueça que tínhamos um chr()ao redor da solução, logo:

chr(110)
> 'n'

key = ‘n’

Descobrindo a chave

Como sabemos que a key = 'n', vamos avançar. Copiei a linha do jeito que estava pro python e executei:

key = key + key + chr(ord(key)-4)
key = 'nnj'

key = ‘nnj’

Final

Agora, sabemos que:

encoded = "jrjerwhzkrexar"
key = "nnj"

Basta darmos um jeito de decifrar “jrjerwhzkrexar” usando “nnj” como chave. Mas como faremos isso?

Pela minha pouca experiência nessas terras de CTF, sei que, quando temos uma palavra criptografada, e uma chave, provavelmente estamos lidando com um vigenere cipher. Vamos recorrer então a este maravilhoso site para decifrar a mensagem

Inserimos a frase, a key, e eis o nosso resultado:

wearenumberone

Eis a nossa flag senhoras e senhores! Missão cumprida, abraços e até a próxima!

--

--

Renan Santana

Desenvolvedor Python, que no tempo livre tenta inventar alguma coisa ou resolver desafios CTF.