paint-brush
[Serie CTF #1] El desafío de la ingeniería inversapor@GhouLSec
14,044 lecturas
14,044 lecturas

[Serie CTF #1] El desafío de la ingeniería inversa

por GhouL3m2020/09/07
Read on Terminal Reader
Read this story w/o Javascript

Demasiado Largo; Para Leer

El Desafío de Ingeniería Inversa es el primero escrito sobre un desafío de ingeniería inversa. El desafío tiene como objetivo obtener la bandera del archivo binario (ELF). Tiene una función de verificación y buen chico que parece sospechosa y necesitará más investigación al respecto. El fragmento de código de la izquierda es la función de verificación. Era muy obvio que el valor del registro eax se comparará con el valor en el [local_8h] también conocido como ebp-0x08h para continuar con su proceso. Si el valor comparado no es el mismo, irá a la función badboy en la que el programa terminará.

Companies Mentioned

Mention Thumbnail
Mention Thumbnail

Coin Mentioned

Mention Thumbnail
featured image - [Serie CTF #1] El desafío de la ingeniería inversa
GhouL HackerNoon profile picture

Objetivo:

Para obtener la bandera del archivo binario (ELF).

Tópicos cubiertos:

1. Radare2, x32/x64 dbg
2. Comando Linux (objdump, awk, cut y grep)
3. Secuencias de comandos de Python

Procedimiento:

Aquí están las ideas sobre cómo resolver este desafío: D. Realicemos un análisis estático en el archivo binario usando radare2 en la máquina Linux (mis herramientas de depuración favoritas).

Después de echar un vistazo a los códigos ensambladores, parece que el binario recibirá un archivo como parámetro y lo leerá. Tiene una función de verificación y buen chico que parece sospechosa y necesitará más investigación al respecto.

El fragmento de código de la izquierda es la función de verificación. Era muy obvio que el valor del registro eax se comparará con el valor en el [ local_8h ] también conocido como ebp-0x08h para continuar con su proceso.

Luego, intente mirar hacia arriba para comprender de dónde proviene el valor de eax y [ local_8h ]. Hay una operación xor en al (los bytes inferiores de eax) con un valor constante. Si el valor comparado no es el mismo, irá a la función badboy en la que el programa terminará :(

Entonces, solo necesitamos obtener el valor de eax que es igual al valor comparado para evitar que el código ejecute la función badboy. Dado que la operación xor es reversible, podemos obtener el valor eax correcto mediante xor la constante con [local_8h] (p. ej., 0xf7 ^ 0xa3). Sin embargo, hay demasiados bloques de código que el be xor. Por lo tanto, no se puede hacer manualmente, por lo que se necesita un script para hacernos la vida más fácil. Pero antes de escribir el script, debemos extraer y filtrar todo el código de operación innecesario. Objdump nos ayudará aquí.

 objdump -d -M intel ch30.bin

Mmm. Los resultados son muy largos y necesitamos hacer algún filtro. Aquí, usaré el comando del manipulador de cadenas de Linux: awk , cut y grep . Dejaré el comando utilizado aquí y no lo explicaré en detalle. El comando aquí se mezcló con el comando en el informe disponible (solo se pudo acceder a esto después de que se resolvió el desafío... oops... por lo tanto, algunos de los comandos awk y cut están redactados con el carácter 'x').

 objdump -d -M intel xxx | awk -F 'xx' -v RS= "xxxx" 'xxxxxxxxxx' | cut -fx | grep "some mov and xor"

Aquí está el código de operación importante necesario para resolver este desafío. Para obtener el código hexadecimal dentro de este gran código de operación, escribí un script de python para automatizar todo el proceso. Aquí está el fragmento de código.

Básicamente, la idea es usar expresiones regulares y operaciones condicionales para filtrar todas las cadenas innecesarias y luego xorearlas para obtener la bandera. Pero de alguna manera hay algún valor que no obtuvo xor en absoluto. Entonces, tienes que resolverlo por ti mismo para hacer frente a tal situación: D

Después de que todo se hizo correctamente, apareció una cadena codificada en base64. Después de decodificar las cadenas, aparece un archivo EXE (puede ser reconocido por el MZ en el encabezado de la salida, puede investigar un poco sobre la firma del archivo).

¡Guau! Un archivo en un archivo. A continuación, avancemos en la máquina Windows (puede continuar con radare2 o IDA pro en su máquina Linux).

Del fragmento de código, se puede ver que la función general del archivo EXE es la misma que la del archivo ELF anterior. Entonces, se puede aplicar la misma solución para resolver el problema (solo necesita hacer algunos cambios menores en la línea grep y el código utilizado para obtener el EXE).

¡Finalmente! La bandera sale como esperaba.

Eso es todo por el artículo, espero que hayan disfrutado mi primer artículo sobre un desafío de ingeniería inversa. ¡Salud! También espero poder seguir publicando algunos artículos para los desafíos interesantes en el futuro. Oh sí, olvidé decirles que este desafío es la automatización de crackme.

Publicado anteriormente en https://medium.com/@cyjien/my-first-ever-write-up-on-the-reverse-engineering-challenge-6077b81b3021?source=friends_link&sk=a72d8e00069e5178cbc58370109d41b7