Ir al contenido principal

Hydra Android Malware (Part 1)

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

Hydra Android Malware (Part 1)

 Buenos Días, Hoy escribiré una entrada de análisis de malware en Android después de un tiempo sin escribir por aquí. La idea era coger de nuevo soltura con las herramientas open-source que hay para el análisis de aplicaciones android. Estuve leyendo información sobre alguna familias y me tope con Hydra (siguen apareciendo casos activos en Android (Twitter)) y me puse con ella. Arranqué con la lectura de este blog : Es el "padre nuestro" de la primera parte de nuestro tutorial, lo único que voy a hacer yo aquí en la primera parte es "puntualizar" algunos problemas que me he encontrado durante el análisis al seguir su tutorial. Información de la muestra y Herramientas:  -) Muestra : 46aeb04f2f03ebe7c716fc6e58a5dea763cd9b00eb7a466d10a0744f50a7368f -) JADX : Para poder leer el codigo Java/kotlin decompilado de la aplicación. -) Apktool : Para hacer el dissasembler de la APK, y poder parcherla y reconstruirla.  -) Ghidra : Decompilado de librerias Nativas. -) GEF : Debu

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

 Buenas de nuevo, en esta entrada continuaremos (y cerraremos) el capítulo de desarrollo básico de malware en Windows. En la entrada anterior, ya teníamos guardadas las APIs que íbamos a necesitar para nuestra infección, así que ahora nos ponemos con el proceso de infección en sí. Pasos para la infección: 1)Necesitamos obtener el handler de los ficheros que hayamos indicado en la variable "mascara" (.exe) , en este caso ejecutables                                                                          2)Haremos uso de las APIs FindFirstFileA y FindNextFileA , para buscar los archivos que queremos infectar, con las APIs GetWindowsDirectory (C:\WINDOWS) y GetSystemDirectory tendremos acceso a 2 rutas distintas(“C:\WINDOWS\SYSTEM”), con la API SetCurrentDirectory haríamos el cambio de escritorio al escritorio donde estarán los ficheros que queramos infectar. Durante la explicación del código añadiremos el prototipo definido por la MSDN para que sea más fácil la v