Esta habitación, de dificultad media, se centra en aprender sobre el «análisis estático», una técnica de análisis de malware.

El principal objetivo es no usar depuradores (debuggers) ni deberíamos ejecutar el programa.

Nos van a dar varios archivos y una contraseña para descomprimir en caso de necesitarla, que es MalwareTech.

Vamos con ello.

Cadenas: Desafío 1

El ejecutable que nos proporcionan imprime un hash MD5 en la pantalla cuando se ejecuta. Nos pide capturar la bandera exacta y nos advierte de que no necesitamos correr dicho ejecutable.

Estoy en Linux y veo que es un archivo exe, agh. Al descomprimir en terminal con unzip, además, da error compression method 99. Debemos usar 7zip.

7z e strings1.zip

«e» es el método que indica que quiero extraer (e de extract), por alguna razón no descomprime bien cuando le pasas la contraseña con el parámetro -p así que ejecuto lo anterior y pongo la contraseña cuando me la pide.

La pregunta exacta es ¿Cuál es la bandera a partir de la cual es generado ese MD5?

Cuando le paso la instrucción strings en Linux sale una cantidad brutal de banderas posibles.

strings strings1.exe_

Así a pelo, complicado, así que hay que usar Ghidra, qué pereza. Busco una alternativa en Cutter, que es de fuente abierta y me baja una Appimage.

Abro el archivo strings2.exe_ y en la primera función, entry0, si me voy a la pestaña «Decompiler» veo el código en C y aparece la bandera.

Decompilando un ejecutarble con Cutter

Pero claro, hay que ver cuál de todas las banderas es y cómo está escrita exactamente para que acepte la respuesta.

Si ejecuto:

strings strings1.exe_ | grep -i "can-i"

He puesto guion y no guion bajo porque las cadenas están así escritas cuando les pasas la instrucción strings.

FLAG{CAN-I-MAKE-IT-ANYMORE-OBVIOUS}

Cadenas: Desafío 2

El nuevo ejecutable imprime un hash MD5 y hay que capturar la bandera exacta.

Este es más difícil, de hecho, requiere cierto conocimiento de ensamblador. Aquí no hay mil banderas, aquí hay una que se va formando a pedacitos.

Si examinamos en Cutter, vamos viendo lo siguiente:

var_28h = 0x46;

var_27h = 0x4c;

var_26h = 0x41;

Y así hasta abajo descendente, así que habrá que coger cada codificación y traducirla. Si nos vamos al enlace anterior, 0x46 es F, 0x4c es L, así que se va formando así la bandera.

Poniendo todo junto es:

0x46 0x4c 0x41 0x47 0x7b 0x53 0x54 0x41 0x43 0x4b 0x2d 0x53 0x54 0x52 0x49 0x4e 0x47 0x53 0x2d 0x41 0x52 0x45 0x2d 0x42 0x45 0x53 0x54 0x2d 0x53 0x54 0x52 0x49 0x4e 0x47 0x53 0x7d

Si nos vamos a un conversor de hex a ascii como este, y pegamos lo anterior, sale la bandera.

FLAG{STACK-STRINGS-ARE-BEST-STRINGS}

Cadenas: Desafío 3

Lo mismo, bajamos el nuevo archivo y repetimos el ciclo. Este es mucho más complicado y se escapa a mis conocimientos.

Cutter ve un montón de banderas si buscas «flag», pero a saber cuál es.

Si usas Ghidra, sale la bandera enseguida, así de poderoso es.

FLAG{RESOURCES-ARE-POPULAR-FOR-MALWARE}

Una habitación que se escapa a mis conocimientos, los primeros tira que te va, pero el tercero…