Ir al contenido principal

Desarrollo de Malware Básico en Windows (parte 2)

CTF 2 WriteUp sencillos con Radare2


Seguimos con los retos de reversing que han sido publicados en la cuenta de Github de la entrada anterior ( CTF Reto Serial ) donde ahora analizaremos el programa Serial el cual es un poquito mas complicado del anterior, ya que en este caso tendremos que tirar del Debugger.

1)Abrimos el programa con Rabin2 y sacamos información tanto del binario como de si hay alguna string interesante...






2)Además ejecutamos el programa con la terminal y vemos que nos piden un serial que tendremos que introducir y posteriormente hace una comprobación del mismo.




3)Abrimos el programa con Radare2 en modo Debug "r2 -d serial"  y seguidamente analizamos el programa y vemos las funciones del binario con "aa"  y luego "afl".


4)Luego nos vamos a la función mas interesante (main) para ello ejecutamos el comando en la shell de Radare2 el comando "s main" que lo que hace es irnos a la función main, y posteriormente desensamblamos esa parte de código de alguna de las siguientes maneras:

  1.  "pd @ sym.main" .
  2. Nos vamos a la parte visual con "V"  y con la letra "p"  hasta llegar a la siguiente parte visual del desensamblado.




Vemos que hay una llamada de strlen() , y luego vemos una comprobación de la salida de la función con 0x10 (16 en decimal).

Por lo tanto ponemos un breakpoint en esa instrucción "db 0x00400a23" y ejecutamos el programa e introducimos una entrada de test "AaeE12" para ver sobre que input hace el strlen() (aunque no hay que ser un genio para imaginarlo...)


Luego nos vamos a la vista de debugger con el comando "V"  en la shell de Radare2  y luego con "p"  nos vamos cambiando hasta alcanzar la vista de debugger.



Luego ya podemos usar los shortcuts típicos de debugging como F7 (Step into) y F8(Step over).
En la vista de debugging podemos ver que tenemos la función Strlen() y en el stack el serial de test ("AaeE12") que hemos introducido. Tras la ejecución de Strlen() vemos que en el registro rax el valor es 6 que es el número de caracteres de la cadena de test que hemos introducido y en el caso de que no sea 16. No tomaría el primer salto condicional e iríamos a parar a la dirección 0x400a30, donde se mostraría el mensaje de serial no valido (el cual queremos evitar).



Por lo tanto deducimos que debemos introducir un serial de tamaño 16,  tras esta primera condición, vamos a ver el resto de condiciones que debe de cumplir nuestro serial para ser válido. Si nos vamos mas abajo, vemos que:
  • Comprobación 1Vemos que la primera letra del serial tiene que ser igual a "E"



    Luego nos vemos que hay una comprobación que la suma de "E"  en hexadecimal (0x45) junto con la última letra del serial tiene que ser igual a 0x9B --> por lo tanto la última letra será "V" (0x56).





    Este tipo de comprobación se mantiene para las 4 primeras letras y por lo tanto tambien las 4 últimas, obteniendo los primero 8 caracteres del serial correcto: EZ9d????????7bAV
  • Comprobación 2

    Esta comprobación es bastante parecida a la primera, la 5º letra la sacamos directamente de una comprobación en hexadecimal con la letra "m"(0x6d) pero en este caso la suma tiene que ser igual a 0xB4.

    Por lo tanto la 5º letra por el final sera igual a 0xB4 - 0x6D --> "G" (0x47)



    Update serial --> EZ9dm??????G7bAV
  • Comprobación 3
    El mismo caso que las comprobaciones anteriores, aunque las suma es un valor distinto 0xAA, por lo tanto obtenemos las letras "q" de comparación directa y "9" de la resta de 0xAA - 0x71



    Update serial --> EZ9dmq????9G7bAV
Los ultimas dos comprobaciones son como la comprobación 1, es decir primero sacan los caracteres de una comparación directa del valor en hexadecimal y los del final  se obtienen sabiendo que la suma de los valores en hexadecimal de ambos valores tiene que ser 0x9B. Obteniendo los valores 7º ="4"  y 8º = "c" y los valores 7º = "g" y 8º  = "8" comenzando por el final.


Obteniendo finalmente el serial --> EZ9dmq4c8g9G7bAV  y comprobando que ese es el serial correcto al ejecutar el programa.



Un saludo
Krilin4

Comentarios

Entradas populares de este blog

Radare2- Set de comandos básicos

Buenas a todos y Feliz navidad lo primero. Entre mantecado y mantecado, y motivado por el curso de Ricardo Narvaja (CrackLatinos), me he decidido a publicar una entrada que es mas para mí que para el resto. Pero supongo que puede ser útil para otras personas, de ahí que lo ponga lo mas bonito posible en la web. Vamos a ver un "cheatsheet" con comandos útiles de Radare2 y su funcionalidad, todo esto puede extraerse del --help de las herramientas, pero para los que como yo le gusta ir al grano y ahorrar el mayor tiempo posible, tienen esta entrada. RABIN2: rabin2 -I file_.exe --> Nos proporciona información básica del binario, como arquitectura, y las protecciones del binario como (nx,dep,aslr...) rabin2 -i file_.exe --> Nos muestra los imports del binario. rabin2 -e file_.exe --> Dirección del Entry point. (Dirección virtual y raw offset en el executable) rabin2 -zz file_.exe --> Muestra las strings rabin2 -g file_.exe --> Este comando nos muestr

CTF WriteUp sencillos con Radare2

Para comenzar el blog y así repasar yo de paso, ahora que llevo un tiempo sin hacer ningún tipo de reto en reversing voy a comenzar con algunos CTF que ya se han cerrado y que intentaré resolverlos haciendo uso de Radare2 para los retos que estén sobre la plataforma Linux y IDA para los resto sobre la plataforma Windows. Iré comenzando de dificultad baja y poco a poco subiremos la dificultad conforme vaya sintiéndome mas cómodo yo con las herramientas utilizadas. El  primer reto es un de  Sharif_University_CTF_2016 y es llamado dMd   cuyo binario os podéis descargar de el Github que os dejo a continuación  https://github.com/N4NU/Reversing-Challenges-List/tree/master/Baby/Sharif_University_CTF_2016_dMd . Los voy a encarar de la forma mas sencilla posible para poder seguir un patrón: 1) Mirar el tipo de binario que es: Tras ver el tipo de binario que es, seguidamente lo que hacemos es intentar sacar información del binario como algunas " S trings interesantes "

Iniciación a la técnica de ROP

Buenas a todos, En esta entrada vamos a resolver el binario propuesto por el maestro con la protección DEP: Que previene de ejecutar el código que introducimos en el stack si se encuentra activada esta protección del binario. Para ver si un binario tiene la protección DEP (Data execution prevention) activa, p odemos mirarlo con la herramienta ProcessExplorer tal y como vamos a ver en el siguiente ejemplo activando la columna DEP del mismo para poder comprobar si el proceso tiene o no el DEP habilitado:                                 Vemos que al ser un sistema operativo de x64, todos nuestros procesos tiene el DEP habilitado por defecto, y hemos de comprobar también si tiene alguna otra protección nuestro binario como el ASLR(Address Space Layout Randomization), encargado de aleatorizar las direcciones de la memoria virtual cuando nuestro binario es cargado en memoria virtual. Vamos a ver todos los módulos que componen el binario (Programa + librerias(dlls)) para ver si algún