Ir al contenido principal

Hydra android malware (Part 2)

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 muestra una gran cantidad de información como secciones,segmentos,entrypoint,constructores, main, import,simbolos, strings, estructura del header, Realocaciones, etc
  • rabin2 -S file_.exe --> Muestra las secciones del ejecutable, incluidos los permisos que tiene.
RAHASH2:
  • rahash2 -a all file_.exe --> Muestra la función resumen con todos los algoritmos disponibles en la herramienta
  • rahash2 -B -b 512 -a md5 file_.exe --> Por cada bloque de 512 bytes del ejecutable nos saca el md5.
  • rahash2 -B -b 512 -a entropy file_.exe --> calcula la entropía para cada bloque de 512 bytes.
  • rahash2 -a md5 -s string --> saca el md5 de una cadena
RAX2:
  • rax2 10  ó rax2 0xa --> Convertir de decimal a hexadecimal y viceversa
  • rax2 -s 41424344 --> Pasa de hexadecimal a ASCII
  • rax2 -S ADB --> pasamos de carácter ASCII a hexadecimal.
  • rax2 4+8 --> Permite el uso de operaciones aritméticas siempre que no haya espacios entre ellas.
  • rax2 -k 0x3+0x2 --> Hace la operacion aritmética y mantiene la misma base(hexadecimal).
RASM2:
  • rasm2 -d 4141 --> Desensambla en 32 bit  dando lugar a inc ecx
                                                                                                inc ecx
    • rasm2 -a x86 -b 32 "mov eax, 33" -> Ensambla en 32 bits la instrucción "mov eax,33"
    • rasm2 -a x86 -b 64 "mov rax,33" --> Ensambla en 64 bits la isntruccion "mov rax,33"
    • rasm2 -L --> Listado de plugin disponibles para el ensamblado/desensamblado.
    *(-a) es el nombre del plugin a usar x86 y (-b) indica si es de 32 o 64 bits.

    RADIFF2: Herramienta para hacer "diffing" entre binarios, y encontrar las modificaciones hechas entre versiones.
    • radiff2 exe_.exe exe_modified.exe ---> Nos da en la dirección física (raw offset del fichero) donde esta la diferencia entre ambos binarios.
    *Extra:
    Localización en la memoria virtual de un valor en el fichero ejecutable,  para ello podemos aplicar la siguiente fórmula:

    (target virtual address) = (target raw offset) - (raw offset of section) + (virtual address of section) + (image base) 

    Target virtual address--> Dirección virtual que queremos conocer.

    Target raw offset --> Direccion en nuestro fichero ejecutable.

    raw offset of section -->  Inicio de la seccion donde esta el dato modificado que queremos mirar.

    virtual addres of section + imagen base --> En este caso es sacar el valor de la imagen Base y la imagen virtual de la seccion.

    Para hacer esto con radare2 debemos de ejecutar los siguientes comandos:

    • r2 exe_.exe --> Abrimos el binario.
    • idp file_exe.pdb --> Cargamos los símbolos del binario si los tenemos.
    • aaa --> analizamos el programa 
    • afl --> listamos las funciones del binario, donde la información que nos muestra está organizada de la siguiente manera:
      • 1ra columna : dirección virtual 
      • 2da columna: Numero de  basic blocks (bloques) en la función
      • 3ra columna: tamaño de la función (en bytes)
      • 4ta columna: Nombre de la función.
    • /x ffd0 --> Buscamos esa cadena de bytes en el binario y nos indica la posicion donde tenemos esa sequencia de bytes, usado  con rasm2  podemos buscar instrucciones dentro del binario.
    • s 0x401342 --> nos vamos a la dirección de la memoria virtual que estamos indicando (0x401342 )

    • pdf-->  desensamblamos esa función completa y podemos ver si el valor de la dirección virtual y que instrucción en ensamblador representa.
    • Ps nombre_proyecto --> creamos un proyecto para no perder el avance de lo que vamos haciendo. Podemos guardar con distinto nombre, para así poder volver a distintos puntos del programa.
    • Po nombre_proyecto --> Para cargar un proyecto guardado de un binario que estamos analizando, es necesario, abrir el binario en otra terminal (r2 exe_.exe) y posteriormente cargar la sesión con el comando Po + el nombre del proyecto.
    • V!--> Accedemos al Modo PANELS:
      • Apretamos la letra "m" --> Nos vamos al menú y con las flechas/Enter nos podemos desplazar por el mismo hasta seleccionar la opción que queramos.
      • En View/Hexdump-->  Para ver en hexadecimal esa parte del código ensamblador que estamos viendo. (Con TAB nos podemos ir desplazando para ir poniendo el foco en la ventana que queramos, si pulsamos ENTER entramos en modo ZOOM y con Q volvemos otra vez al modo PANELS).
    • V--> Accedemos al modo visual y con p vamos cambiando la vista seleccionada, llegando por ejemplo al Hex-view.
      • Barra espaciadora-->Vemos en el modo árbol las funciones de nuestro programa. Dentro de esta vista si volvemos a pulsar la barra espaciadora salimos de la misma.
      • : --> Su queremos ejecutar algún comando nos aparece abajo una especie de shell para introducir el comando, q para quitarla.
    • afn nombre_nuevo nombre_antiguo --> Lo usamos para renombrar las funciones de nuestro binario
    • afvn nombre_nuevo nombre_antiguo --> Lo usamos para renombrar variables de la función que estamos analizando
    • afvf --> Mapa estático del stack nos muestra la siguiente información de cada variable
      • 1ra columna : Distancia respecto al horizonte en la función (EBP guardado) 
      • 2da columna: Nombre de la variable
      • 3ra columna: Tipo de la variable
    • afvt nombre_variable nuevo_tipo_variable --> Nos permite cambiar el tipo de la variable, para ello debemos indicarle el nombre de la variable a cambiar y el tipo que queremos asignarle.

    Comentarios

    Entradas populares de este blog

    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