Write-up Juntosalpoder {Q4 CTF}
Problema
Nombre: CampanaSur — Juntosalpoder
Puntos: 200
Dificultad: Difícil
Fecha: 31–08–2019
Postcard 1 ( postcard.jpg)
Postcard 2 ( postcard2.png)
Lo primero que debemos notar (fuera de la competencia) es el contenido: Lideres comunistas Stalin (Rusia) y Mao Zedong (China). Stalin es considerado un dictador y un autocrata. Puedes leer más al respecto aquí.
A Mao Zedong se le considera el responsable de la hambruna de unas 45 millones de personas.
¿No habían otros personajes históricos un poco más positivos?
Sigamos con el problema.
Lo primero que debemos hacer en este tipo de problemas es revisar cada imagen con las herramientas clásicas (strings, binwalk, steghide, entre otros).
La mayoría de los problemas donde se presentan dos imágenes, se trata de encontrar las diferencias entre ambos archivos. Para esto podemos usar la herramienta 'compare':
compare postcard.jpg postcard2.png -compose src salida.jpg
Y el archivo resultante se ve así:
Ahora debemos extraer el texto de la imagen. Esto podemos realizarlo mediante un servicio web que permita hacer OCR. Probé con los siguientes: https://www.onlineocr.net/ y https://www.newocr.com/, pero los resultados no fueron satisfactorios.
Utilicé la app Google Translator, la función escaner permité extraer el texto de un imagen. El texto obtenido es el siguiente:
дорогой цезарь: Сж чкшхбкшаж кшаж ку кссж, убкшачж шжсвжифчж цбк хкскж ку сжш ижсскш. Сж зжуйкчж убуиж ижкчж, сж зжуйкчж кш ИнбуС1кшСжтКпОЧ.
Traduciendo el texto, nos dice que la primera parte дорогой цезарь:, corresponde a 'Dear Caesar', esto nos da la pista de que debemos usar un Caesar cipher. En términos prácticos debemos encontrar una sustitución fija de cada letra del texto en ruso (con su correspondiente alfabeto) al alfabeto del español o inglés.
Para esto podemos usar CiberChef.
El primer paso es convertir las letras a mayúsculas. El segundo paso es definir una sustitución. Para encontrar una correspondencia debemos mover el valor en amount, que son las casillas que se desplazan las letras entre ambos alfabetos.
Debemos usar los siguientes alfabetos:
- АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя
- AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzAaBbCcDdEeFfGg
El resultado es el siguiente:
Pero algo falló en el proceso de OCR, inferimos por el contexto que la penúltima letra en el texto original no es 'O' si no un 0.
Corregido queda:
Y finalmente obtenemos la flag: ChunL1esLamEj0R