Mientras tenemos funcionando este AV e intentamos introducir el archivo tini.exe en nuestro PC, inmediatamente Kaspersky lo detecta y muestra una alerta de troyano. Este antivirus es bastante insistente y "follonero" y es necesario detenerlo para poder hacer las pruebas.
Primero, modificamos manualmente con un editor de PE (LordPE por ej) las cabeceras del ejectuable y aumentamos el tamaño de la sección .data en 4096 bytes (1000 en hexadecimal). Esto lo hacemos para añadir nuestro propio código ensamblador al final de esta sección.
También aprovechamos y marcamos la sección .text como editable y la sección .data como ejecutable.
Con un editor hexadecimal tendremos que rellenar esos 4096 bytes de espacio que hemos añadido con el valor 00 hex por ejemplo.
Ahora, vamos a añadir una pequeña porción de código ensamblador al ejecutable, y para ello utilizamos Olly Debugger. Nada más abrir el tini.exe con Olly, nos lleva a la primera intrucción que se ejecuta (dentro de la sección .text):
Nosotros sobreescribimos la primera instrucción y ponemos un salto (instrucción JMP en ensamblador) a una dirección de memoria de la sección .data (donde nosotros hemos añadido los bytes de relleno) que será donde añadiremos manualmente la porción de código encargada de la codificación. Antes de sobreescribir la primera intrucción nos la copiamos donde sea para luego poder recuperarla y no alterar así nada del código original.:
Añadimos a partir de la dirección donde salta nuestro JMP las siguientes instrucciones de ensamblador:
MOV EAX,dir_comienzo_codificación //movemos al registro EAX la dirección de memoria donde comenzará la codificación
XOR BYTE PTR DS:[EAX],0F //realiza una operación XOR entre el contenido de la dirección de memoria que contenga EAX y el valor 0Fh
INC EAX //incrementa el valor de EAX
CMP EAX,dir_fin_codificación //comprueba si se ha llegado a la dirección de fin de codificación
JLE SHORT dir_comienzo_bucle //si no son iguales así, vuelve al comienzo del bucle
La dirección de comienzo de codificación será la siguiente a la instrucción de salto que introdujimos al comienzo del ejecutable, en la imagen superior podemos ver que esa dirección es la 00401005. Como dirección de fin de codificación ponemos una dirección que veamos que esté al final del código del ejecutable, en este caso 004012F1.
A continuación del bucle, pondremos la instrucción que machacamos al principio cuando pusimos el JMP, es decir PUSH 00403014, después, ponemos un salto a la dirección 00401005 para que regrese a la siguiente instrucción despues el primer JMP que añadimos al comienzo. Nuestro código queda así:
Ponemos un punto de ruptura en la siguiente instrucción después del bucle de codificación (por ejemplo dirección 00403027) para que se detenga la ejecución una vez salga del bucle. Cuando pulsamos el botón play del Olly, inmediatemente se ejecuta el bucle que hemos añadido y se detiene en el punto de ruptura. En este momento, todo el código ensamblador de la sección .text del PE se encuentra codificado. Ahora guardaremos estos cambios en la sección .text y creamos un nuevo archivo (tini2.exe).
Si abrimos el nuevo ejecutable con Olly podemos ver que ya no aparecen las mismas instrucciones que la primera vez que lo abrimos. Ahora, despues de nuestro JMP ha cambiado todo:
Veamos qué hace este nuevo ejecutable ejecutándolo paso a paso (F7). La primera instrucción sigue siendo el JMP que añadimos al comienzo, a continuación salta directamente al bucle que añadimos nosotros, pero aquí viene lo interesante; una vez que se complete el bucle de codificación, el contenido de la sección .text vuelve a ser el mismo que al principio ya que se le ha vuelto a aplicar la misma función XOR.
La clave está en que la víctima que ejecute este archivo, tendrá el contenido original malicioso del troyano en memoria y no en disco. Al recibir la víctima nuestro archivo en el PC, el antivirus lo inspeccionará y no encontrará nada sopechoso ya que no hay similitudes en su código fuente con ningún virus conocido, (ya que el código fuente se encuentra codificado en disco), pero una vez que la víctima lo ejecute y pase a memoria, en tiempo de ejecución se vovlerá a descodificar y la funcionalidad del troyano se mantendrá intacta.
Lo podemos comprobar si activamos de nuevo Kaspersky e inspeccionamos el archivo tini2.exe. Vemos que no detecta nada.
También se ha comprobado que el nuevo ejecutable evade las alertas del antivirus Nod32.
Después podremos ejectuarlo con prudencia y comprobar que la funcionalidad del troyano se mantiene intacta.
Queda de esta forma desmostrada la necesidad de implementar por parte de los antivirus un sistema de detección de virus que vaya más allá de las firmas.
Esta prueba no deja de ser una prueba de concepto y mediante este método no se consigue evadir a todos los sitemas antivirus. Enviando el archivo que se utilizó para las pruebas a Virus Total hemos obtenido 8 alertas de un total de 36, es decir, fueron capaces de detectarlo un 22% del total. El tini.exe original generó un 100% de alertas (36 de 36):
Este entrada se ha desarrollado a partir de una presentación de la Shmoocon 2008 ("Hacking and Stuff") de Mati Aharoni. Podéis descargar un video de esta presentación desde aquí: Backtrack demo