CTF Learn — Image Magic — Writeup

Renan Santana
2 min readFeb 4, 2021

--

Photo by Luca Bravo on Unsplash

Salve meus cyber-iludidos! Como estão? Espero que bem.

Hoje vos trago a resolução de um challenge do site CTFLearn, da categoria programming.

O desafio da vez é o Image Magic, onde faremos um pequeno script para resolvê-lo, utilizando somente a lib pillow, do Python ❤️

O desafio começa com o seguinte enunciado, seguido de um link de download de uma imagem:

“It looks like someone messed up my picture! Can anyone reorganize the pixels? The python module PIL (Python Imaging Library) might be useful!

Update: I think whoever messed up my image took every column of pixels and put them side by side. Update: I think the width of the image was 304 before they messed with it.”

A imagem se trata de uma fileira de pixels, e o desafio já nos dá a dica que a largura da imagem original, era de 304 px. Precisamos pegar essa fileira, e reconstruir a imagem original a partir dos pixeis dela.

Fiz o pequeno script para resolver isso, vou postar o script completo aqui, e logo abaixo explico meu raciocínio:

  • Para trabalhar com imagens, vamos precisar da lib PIL. Instale ela com o comando pip install pillow
  • Primeiramente, eu abro a imagem baixada, utilizando a função open da nossa lib PIL recém baixada, e logo após, crio com new o que será nossa imagem final
  • Logo após, eu descubro o tamanho total da imagem que baixamos, e exibo este valor ali em print(original_image.width)
  • Descobrimos que a imagem tem 27968 pixels
  • O próprio enunciado do challenge já dá a dica que a imagem original tinha 304 pixels de largura, munido desses dois números, descobrimos a altura dividindo 27968 por 304, resultado: 92
  • Agora, para cada pixel na imagem “esticada”, eu vou reconstruindo a imagem original. Para isso, faço uso das funções getpixel e putpixel para pegar os pixels da imagem original e posicioná-los nas posições (x, y) corretas da imagem que estamos reconstruindo
  • O enunciado diz que “alguém pegou cada coluna de pixel e botou lado a lado”, então eu reconstruo a imagem verticalmente, preenchendo coluna por coluna, até o final
  • Ao final do processo, fechamos a imagem esticada, e mandamos exibir nossa obra de arte:

Flag na mão, meus consagrados! Basta pontuar e partir pro abraço!

--

--

Renan Santana

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