En las entradas posteriores se profundizará sobre los ficheros ejecutables en Windows explicando el formato que tiene un exe, cómo añadir una sección, cómo añadir código ejecutable, qué es la IAT y cómo cargar funciones manualmente
y alguna otra cosa relacionada. Todo esto tiene un objetivo, ir
preparándonos para entender cómo funcionan los protectores de
ejecutables e ir programando poco a poco uno.
Y
para empezar que mejor que cifrar un ejecutable a mano de la forma mas
sencilla posible para después ya desarrollar el programa que haga el
proceso automáticamente. La idea es usar la función XOR para cifrar la
sección de código de un ejecutable, después insertar al inicio un
pequeño código en el mismo ejecutable que deshaga esta operación de
cifrado y por último ejecute el código una vez descifrado.
El proceso puede verse en este video
de la conferencia ShmooCon 2008 donde Mati Aharoni habla sobre cómo
saltarse la detección de los antivirus. Para ello usa la herramienta
netcat que es detectada por unos cuantos. Al final del proceso logra que
su Antivirus, AVG, no detecte el netcat.
Voy a hacer en esencia lo mismo pero con algunos cambios.
Como Mati, voy a usar el netcat, que se puede descargar de aquí. Nada mas bajarlo, lo he subido a Virustotal y actualmente es detectado por 28/43 antivirus.
Lo siguiente que voy a hacer es añadir una sección al netcat. Para ello uso mi querido 010 Editor. Me ha quedado así:
No
os olvidéis de cambiar el NumberOfSections, ImageSize y añadir
físicamente 1000 bytes al final del fichero. Si tenéis algún problema
añadiendo la sección revisad este post de Ferchu sobre cómo añadir una sección a un exe “y no morir en el intento”.
En
esta sección que acabamos de crear incluiremos el código que descifre
la sección de código del ejecutable y una vez finalizada esta tarea
salte a la misma. Para que lo primero que se ejecute en el programa sea
este código que ahora veremos es necesario modificar el EntryPoint del
ejecutable de netcat para que el programa inicie la ejecución en nuestra
sección.
En
este ejemplo el código que se usará para cifrar la sección será el
mismo que se use para descifrarla. Esto es posible porque vamos a usar
la función XOR para cifrar los bytes de la sección de código, y esta función tiene una característica curiosa y es que:
X XOR C = Y
Y XOR C = X
C es la clave que por ejemplo puede ser 0xBB. X es uno de los bytes de la sección de código, una vez cifrado con la clave C obtenemos Y, que será el byte cifrado. Para descifrarlo solo tenemos que volver a aplicar la función XOR con la misma clave.
La
sección de código en el ejecutable de netcat es la primera sección,
llamada “.text”. Dicha sección se encuentra en este rango de memoria
virtual: 401000h-40B000h.
Y con todo esta ahora
ya vamos con el código ensamblador que cifrará/descifrará la sección. La
idea es situarnos al comienzo de la sección e ir cifrando cada byte de
la misma hasta que lleguemos al final. Este código realiza esa tarea:
1
2
3
4
5
6
| MOV EAX, 401000 ;Inicio de la sección XOR [EAX], BB ;Clave usada para la función xor BB INC EAX CMP EAX, 40B000 ;Fin de la sección JNZ 00410005 ;Si no es el fin de la sección seguir en el bucle JMP 00404AC3 ;EP original |
Ahora
tenemos el netcat con una nueva sección que contiene el código para
cifrar/descifrar. Lo abrimos con OllyDbg y ejecutamos el bucle para que
cifre toda la sección “.text”. Para ello lo mejor es poner un breakpoint
en el último JMP y darle a ejecutar.
Una vez parado el Olly en el JMP, podemos ver como la sección ”.text” se encuentra cifrada:
A
la izquierda vemos el netcat original, a la derecha el cifrado. Ahora
solo nos queda guardar el ejecutable en este estado, con al sección
cifrada. Para ello en OllyDbg selecionamos toda la sección y damos a
“Copy to executable > Selection”:
Y en la nueva ventana “Save file”.
Ahora
ya tendremos todo listo, el netcat con la sección de código cifrada,
una nueva sección con el código que la descifrará y el EP apuntando
allí. Ahora al ejecutarlo se descifrara la sección y la ejecutará como
se haría normalmente.
Subo aquí el netcat tal cual me ha quedado a mi.
Esta versión cifrada la detectan 19/43 antivirus.
Antes eran 28. Uno de los que no lo detectan es AVG, el mismo que
utilizó Mati Aharoni en su conferencia. Hace años seguramente hubiesen
sido mas los AV que no hubiesen detectado este netcat modificado, pero
hoy en día muchos antivirus son capaces de mediante emulación o análisis
heurísticos detectar que se usa un cifrado XOR y revertirlo para
analizar el ejecutable. Otros tantos no detectaban el netcat, ya que en
si es una herramienta para “hacking”, pero si detectan esta variante
como un programa empaquetado “Malicious Packer”. Hay varias cosas en las
que puede fijarse un antivirus para sospechar que es un programa
cifrado, tiene 2 secciones con permisos de ejecución, lo cual no suele
ser muy normal, la sección donde apunta el EP no es la primera, lo que
tampoco es habitual y la sección “.text” no parece contener
instrucciones ejecutables.
En siguientes entradas programaré esto en C y se verán los problemas que pueden surgir con este método.
No hay comentarios:
Publicar un comentario