Unpacking binaries

Aprende hacking en AWS de cero a héroe con htARTE (Experto en Red Team de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Identificando binarios empaquetados

  • Falta de cadenas: Es común encontrar que los binarios empaquetados no tienen casi ninguna cadena.

  • Muchas cadenas no utilizadas: Además, cuando un malware está utilizando algún tipo de empaquetador comercial, es común encontrar muchas cadenas sin referencias cruzadas. Incluso si estas cadenas existen, eso no significa que el binario no esté empaquetado.

  • También puedes usar algunas herramientas para intentar encontrar qué empaquetador se usó para empaquetar un binario:

Recomendaciones Básicas

  • Comienza analizando el binario empaquetado desde abajo en IDA y avanza hacia arriba. Los desempaquetadores salen una vez que el código desempaquetado sale, por lo que es poco probable que el desempaquetador pase la ejecución al código desempaquetado al principio.

  • Busca JMP's o CALLs a registros o regiones de memoria. También busca funciones que empujen argumentos y una dirección de dirección y luego llamen a retn, porque el retorno de la función en ese caso puede llamar a la dirección que se acaba de empujar a la pila antes de llamarla.

  • Coloca un punto de interrupción en VirtualAlloc ya que esto asigna espacio en memoria donde el programa puede escribir código desempaquetado. "Ejecutar hasta el código de usuario" o usar F8 para llegar al valor dentro de EAX después de ejecutar la función y "seguir esa dirección en el volcado". Nunca se sabe si esa es la región donde se va a guardar el código desempaquetado.

  • VirtualAlloc con el valor "40" como argumento significa Leer+Escribir+Ejecutar (algún código que necesita ejecución se va a copiar aquí).

  • Mientras desempacas código, es normal encontrar varias llamadas a operaciones aritméticas y funciones como memcopy o VirtualAlloc. Si te encuentras en una función que aparentemente solo realiza operaciones aritméticas y tal vez algo de memcopy, la recomendación es intentar encontrar el final de la función (quizás un JMP o llamada a algún registro) o al menos la llamada a la última función y ejecutar hasta entonces ya que el código no es interesante.

  • Mientras desempacas código, nota cada vez que cambias de región de memoria ya que un cambio de región de memoria puede indicar el inicio del código desempaquetado. Puedes volcar fácilmente una región de memoria usando Process Hacker (proceso --> propiedades --> memoria).

  • Al intentar desempacar código, una buena manera de saber si ya estás trabajando con el código desempaquetado (para poder simplemente volcarlo) es verificar las cadenas del binario. Si en algún momento realizas un salto (quizás cambiando la región de memoria) y notas que se agregaron muchas más cadenas, entonces puedes saber que estás trabajando con el código desempaquetado. Sin embargo, si el empaquetador ya contiene muchas cadenas, puedes ver cuántas cadenas contienen la palabra "http" y ver si este número aumenta.

  • Cuando vuelcas un ejecutable desde una región de memoria, puedes corregir algunos encabezados usando PE-bear.

Última actualización