6 may 2013

Antivirus K.O. Cifrar malware a mano

En estos tiempos de liberación de feromonas primaverales, uno se da cuenta más que nunca del tiempo que se pierde preparando trabajos extra-laborales. Puedes encerrarte en tu cuarto y pensar la manera idónea de sacar un curso adelante, o sentarte en la terraza al sol, cerveza en mano y con un toque etílico estimularte. Yo como ya saben, soy más de lo segundo, inclusive podemos decir que medito con más soltura incluyendo en mi navegador, pestañas abiertas entre las que la temática, poco o nada tienen que ver con mi objetivo. Fuente de distracción para otros, para mí inspiración ante la a veces insufrible temática que nos ocupa.

Esta entrada surge como complemento a las anteriores sagas de Antivirus K.O., y más bien se trata de simular el funcionamiento de un crypter pero de una forma manual, insertando una rutina en un malware cifrado, que descifre en su ejecución el código en memoria.

Este método es útil para cifrar secciones completas, con lo que el primer paso sería identificar la sección o secciones de código ejecutable, normalmente conocida como la sección text, aunque dependiendo del lenguaje y compilación este nombre puede variar.

Se tratará el stub de un crypter público, llamado OP Crypter de Xash, el cual descargue su código fuente en Delphi de internet, lo compilé y empecé a trabajar sobre este. En la siguiente imagen, se muestra como mediante LordPE, aparecen todas las secciones.

Esta imagen será importante para identificar el tamaño de la sección CODE, pues será parte de esta la que cifraremos. La suma en hexadecimal de las direcciones contenidas en ROffset (El inicio de la sección) y RSize (El tamaño de la sección), coinciden con la del final de esta sección.

400 + 4200 = 4600

Es posible verlo a simple vista con el valor contenido en el ROffset de la siguiente sección DATA.

Contando con algo de suerte, entre el alineamiento de ambas secciones, es posible hacerse con un pequeño espacio para incluir nuestra rutina. Con lo que el siguiente paso, sería el de incluir el Flag de escritura a dicha sección. De nuevo abriremos LordPE y en la sección CODE, haremos botón derecho “Edit Section Header” y tildaremos el check.

 Al guardar los cambios en el ejecutable, ya estará listo para acceder a debuggearlo y buscar el final de la sección CODE. Para realizar esta acción, se arrastrará el stub a Ollydbg, y sobre el código clic sobre “View – Executable file”. Al presionar Ctrl+G, se abrirá el buscador de Offsets e introduciremos 4600.

Si subimos hasta el final del código útil de la sección, será posible presionar el botón derecho para acceder al código desensamblado.

En este caso hemos tenido suerte, ya que tenemos espacio suficiente para introducir nuestra rutina. En caso de no tener hueco, podemos utilizar Topo v1.2, o añadir una sección nueva como hizo Francisco Oca en “Cifrando un ejecutable a mano” con netcat. Así que sustituiré parte del espacio libre por NOPs. Desde la dirección de memoria 100050A6 hasta 100050D5.

De tal manera, se dispondrá el espacio.

Para construir la rutina encargada del cifrado del ejecutable, serán necesarios algunos datos, los cuales es posible encontrar gracias a la primera imagen. Para convertir a partir de la posición del offset desde el cual empezará nuestro cifrado, en dirección virtual, es posible utilizar una simple fórmula matemática.

(Dirección física - ROffset) + VOffset + ImageBase = DirecciónVirtual

(400 – 400) + 1000 + 10000000 = 10001000

Otro dato importante será hacerse con la dirección donde finalizará el cifrado, en este caso he preferido incluir hasta cierta función perteneciente a la sección CODE, en vez de cifrar toda la sección.

El siguiente código será el que incluiremos para realizar el cifrado.

mov eax,10001000h ;Guardamos en eax la dirección de inicio del código a cifrar

xor byte ptr ds:[eax],0FF ;XOR FF a la dirección actual

inc eax ;Incrementamos el valor de eax

cmp eax,10003967h ;Comparamos si el valor de eax es igual a 10003967

JNZ SHORT 100050AB ;Saltamos de nuevo a la instrucción XOR (Bucle)

jmp 10004FACh ;Saltamos al Entry Point

Al incluir el código en el hueco, quedará de la siguiente manera:

Es ahora cuando necesitaremos que nuestra rutina se ejecute en primera instancia, con lo que la manera más sencilla es redireccionar el Entry Point a la primera instrucción de la misma, caso similar al que expliqué en “Moviendo el Entry Point”. Para eso, será útil LordPE y su opción de edición de este campo. 50A6 será el nuevo punto de entrada.

De esta manera estará todo preparado para que la rutina cifre la sección, con lo que introduciendo un BreakPoint en la última posición de nuestra rutina, se evitara el salto al Entry Point original, consiguiendo así, dejar la ejecución del stub parada justo al terminar la acción de cifrado.

Si vamos arriba del todo, encontraremos el inicio de la sección en la posición 10001000 completamente cifrada. La siguiente imagen muestra el antes y el después de pasar la rutina.

Una de las partes más importantes viene en este momento, pues necesitamos estar atentos para seleccionar y copiar todo el código cifrado al portapapeles. Con lo que será necesario arrastrar el ratón desde la posición 10003967 hasta la 10001000. Se realizará una copia binaria.

Si llevamos los datos copiados a un editor hexadecimal como HxD, podremos crear un archivo nuevo con el código desde el cual copiar en este formato. Después se sustituirá desde el Offset 400 hasta el 2D66 en el cual finaliza el cifrado, sobre el ejecutable con la rutina insertada pero sin cifrar. Gracias a que XOR es un algoritmo reversible, al ejecutarse el stub, este se descifrará en memoria y evitará las anteriores firmas antivirus, por las cuales el malware era detectado.

¡De esta forma habríamos cifrado un Crypter! Nada mejor para llevar a cabo cifrados de otros malware con él mismo.

Es posible incluir rutinas más interesantes, basadas en otros operadores. Por ejemplo instrucciones de rotación ROR/ROL o sumas y restas con ADD/SUB. La siguiente imagen muestra un servidor de Poison Ivy en su versión privada 2.1.4, siendo el mismo que utilizó [Zero] de elhacker.net con rutinas de cifrado y descifrado ampliadas.

Cifrado:

mov eax,401000h

xor byte ptr ds:[eax],0FF

inc eax

add byte ptr ds:[eax],020

inc eax

xor byte ptr ds:[eax],077

inc eax

ror byte ptr ds:[eax],002

inc eax

cmp eax,402690h

JNZ SHORT 0040269F        

jmp 402104h

Descifrado:

mov eax,401000h

xor byte ptr ds:[eax],0FF

inc eax

sub byte ptr ds:[eax],020

inc eax

xor byte ptr ds:[eax],077

inc eax

rol byte ptr ds:[eax],002

inc eax

cmp eax,402690h

JNZ SHORT 00402695

jmp 402104h

 

Saludos 4n4les! ;)

3 comentarios:

  1. [...] Arrancamos la semana con un artículo indispensable de nuestro compañero Germán: Antivirus K.O. Cifrar malware a mano [...]

    ResponderEliminar
  2. [...] Comenzamos la semana con Germán Sánchez, el anónimo en el pc… Nos trajo la manera de cifrar malware (it’s ok!). [...]

    ResponderEliminar