Ingeniería Inversa.

Análisis estático.

 

Underc0de - ingenieria inversa analisis estatico

El análisis estático es como leer un mapa de direcciones hacia donde ir. A medida que vas transitando el camino, vas tomando notas sobre las cosas que parecen importantes segun criterio propio.

Aquí verás como trabajar dentro del código estático desempaquetado, renombrando y comentando partes interesantes de las rutinas ensambladas.


Laboratorio.

Empaquetado posible.

Analizar que con CFF Explorer hay un header que es UPX.

 

Underc0de - cff explorer header

Al abrir el ejecutable con IDA, verá una seccion extentida de código sin desamblar.

underc0de - ida desamblando

Debido que es UPX es un empaquetador común, hay varias herramientas que son útiles para desempaquetar UPX.

Abra el ejecutable con PE Explorer, él mismo desempaqueta de forma automática el binario.

Guarde el archivo con un nombre para identificar como desempaquetado.

Underc0de - Pe Explorer - Desempaquetado


Abrir nuevamente el ejecutable con IDA.

El siguiente paso es entender lo que el programa realiza. Hasta ahora podemos asumir que:

  • El EXE se conecta a internet de alguna forma.
  • Este Exe utiliza una función de encriptación encadenada.
  • El EXE podría estar lanzando una shell.

La mayoría de los programas que corren bajo windows inician con la dirección 004010000.


Adentrandonos.

Navegue en la ventana de Strings, hay una cadena interesante con la que debemos comenzar:

 

Underc0de - dentro del ejecutable

La cadena es una clave de registro que permite a los programas auto-ejecutarse/iniciarse al reinicio.

Esto es considerado como un mecanismo de persistencia. Haga doble click en la cadena.

Utilizando la tecla X, saltamos dentro de la referencia del codigo ensamblado.

Underc0de - dentro del ejecutable

Esta función se encuentra en el array con el id 00401340, está definida como una clave de registro, utilizando una Api de Windows RegOpenKeyEx. Deberíamos renombrar la funcion “SetRegKey“, ahora debemos llamar a la función utilizando X” en “SetRegKey”, navegar hacia arriba hasta encontrar una API interesante. Como también ver que hay un llamado utilizando InternetOpen que abre una sesión Https.

Este llamado de función tiene los siguientes argumentos:

  • C++

Necesitamos adivinar que registro es esi debido que contiene la URL que estamos buscando.

  • Assembly x86

Justo ántes del primer push 0 hay un mov esi,eax lo que significa que esi = eax.

Cuando retorna de la función, el valor es almacenado en eax. Entonces busquemos la función que es llamada. Toma un string como primer argumento, mientras que el segundo argumento podría ser la longitud de la cadena. Presione enter para ir a la función.

Underc0de - ida dentro de funcion

Descienda hasta encontrar xor al, 5Ah. Eventualmente será capaz de reconocer cuando la cadena recursiva está comenzando a procesarse. Para éste caso, es xor un byte con 5Ah que es Z en ascii.

Underc0de - ida valor eax

Ahora podemos asumir que la función está haciendo algun tipo de codificación Xor. Entonces debemos renombrarla como XorDecode.Luego necesitaremos ésta información cuando realicemos el debugeo.

Underc0de - debugeo

Utilizamos la herramienta XORSearch para ver si encontramos algo interesante. Abriendo una terminal con cmd.exe desde la barra de inicio, y utilizando XORSearch.exe.

Underc0de - XORsearch


Viendolo más claro.

Navegemos al inicio del programa utilizando la tecla “X”. Usando la barra espaciadora para cambiar entre vistas.

underc0de - iniciando nuevamente

Es fácil rastrear utilizando el programa desempaquetado, busquemos algún flujo de instrucciones de control ensamblado. Recuerde que jmp, jne, jnz, jnb son flujos de control de funciones.


Ejemplo de saltos.

underc0de - ejemplo de saltos

A continuación descienda para encontrar la llamada de la funcion de la API en el programa. Debería identificar todas las funciones offsets.

Underc0de - offsets

Algo más que interesante de la llamada en la API de la imagen anterior. Encontramos que hace cada función, muchas de ellas se explican en su contexto. Por ejemplo:

  • GetEnvironmentVariable (ObtenerAmbitoVariable)
  • CopyFile (CopiarArchivo)
  • DeleteFile (BorrarArchivo)
  • InternetOpen (ArchivoDeInternet)
  • InternetConnect (ConexionAInternet)
  • HttpOpenRequest (AbrirSolicitudHttp)
  • HttpSendRequest (EnviarSolicitudHttp)
  • MessageBox (CajaDeMensaje)
  • FindResource (EncontrarRecurso)
  • CryptStringToBinary (EncriptarCadenaABinario)
  • CreateFile (CrearArchivo)
  • ShellExecute (EjecutarShell)
  • CreateProcess (CrearProceso)

A partir de aquí conoce como navegar, reconocer e ir de arriba hacia abajo en el código desempaquetado para reconocer rutinas.

 

Underc0de - imagen final


Estamos acercandonos al final del análisis, entonces es obligatorio conocer los fundamentos, como analizar un malware, herramientas útiles y estimar el tiempo de trabajo invertido.

Posts Relacionados

Comments

comments

Deja una respuesta

Tu email no será publicado. Los campos requeridos estan marcados con *
Puedes usar tags HTML y los atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">