Ir al contenido principal

Iniciación a la técnica de ROP

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

Hack the Box Eat the cake!

Buenas de nuevo, retomo esto en un "ratillo" que he sacado para ir dándole un poco de contenido al blog.

Hoy nos ponemos con el resto Eat the cake! de HTB, ya que el otro día me calenté e hice un par de retos para ver lo oxidado que estaba... La verdad que bastante! 😑


El fichero os lo podéis bajar directamente de la página, cuyo SHA256:bd2efc7a1b23885d88d401b2a1fa1d4b307f6efcd76ee0a7d9486f0a8b06e586

Bueno vemos a ponernos manos a las obra, es un ejecutable por lo tanto nos iremos a nuestra máquina Windows que tenemos preparada para este tipo de retos, y abrimos el archivo con el software PEiD para ver si esta empaquetado/ofuscado, pero vamos que ya os digo que sí.



Vemos que PEiD nos dice que esta empaquetada con UPX 0.89.6 -1.02 / 1.05 - 2.90 --> Markus & Laszlo.
Intentamos desempaquetar la muestra, usando UPX directamente con "upx -d" y tras desempaquetarlo, comprobamos si se  ha hecho de manera correcta, procediendo a su ejecución y esperando a que sea co…

Reversing Write-up Hatred (Bitup19)

Buenas a todos,

Después de un fin de semana intenso peleándome con C++ un poco ( ya veréis el churro de código que he hecho), me he decidido hacer un write-up de como resolví el reto de Hatred, con la compañía de un "figura" de CrackLatinos @bym24v..., bueno sentimentalismos atrás, vamos al turrón!

Comenzamos abriendo el binario y comprobamos que un un binario de x64( por lo tanto, necesitamos ejecutarlo en un SO de x64), seguidamente, vemos que al ejecutarse el binario, se nos cierra automáticamente sin mostrar nada..... (SOSPECHOCHO!)

Lo abrimos con IDA para ver porque se sale y comenzamos a "debuggearlo", lo primero que hacemos es buscar la función main() y re-nombrarla para verlo mas bonito con IDA.



Una vez ya la tenemos localizada, nos metemos dentro de la función, y vemos que nada mas comenzar hace una llamada a IsDebbugerPresent() (esta función nos devuelve eax = 0x1 cuando estamos "debugueando" y eax= 0x0 cuando no). Vemos que independientemente …

WinDBG- Diseño de ShellCodes

Buenas a  todos,

En este pequeño tutorial, voy a intentar explicar y mostrar con ejemplos como crear shellcode tanto en binarios de x86, y posteriormente crearé una entrada para ejemplos en binarios en x64.

Este tutorial esta basado en la parte 6 de los tutoriales  de Ricardo Narvaja de uso de herramientas de exploiting gratuitas y el tutorial de desarrollo de malware de ZeroPad, así que si os gusta las gracias a ellos.

Partimos de una shellcode que vamos a detallar, para explicar como funciona, y los componentes de la misma. Para ello hemos creado un binario donde se ejecuta únicamente esta shellcode para que nos sea mas fácil a la hora de analizarla.

winexec_calc_shellcode =b'\x33\xd2\x52\x68\x63\x61\x6c\x63\x89\xe6\x52\x56\x64\x8b\x72\x30\x8b\x76\x0c\x8b\x76\x0c\xad\x8b\x30\x8b\x7e\x18\x8b\x5f\x3c\x8b\x5c\x1f\x78\x8b\x74\x1f\x20\x01\xfe\x8b\x4c\x1f\x24\x01\xf9\x0f\xb7\x2c\x51\x42\xad\x81\x3c\x07\x57\x69\x6e\x45\x75\xf1\x8b\x74\x1f\x1c\x01\xfe\x03\x3c\xae\xff\xd7'


La shellcod…