[Tutorial] Cavernas de código

Iniciado por astaroth7, 4 Agosto 2009, 16:31 PM

0 Miembros y 1 Visitante están viendo este tema.

astaroth7

Hoy voy a explicar como aprovechar las cavernas de código (codecaves) para añadir funciones a archivos ejecutables. En principio, en un EXE, al no ser el PE (Portable Executable) un formato muy eficiente, se deja zonas "en blanco". Con un poco de práctica podemos rellenar esas zonas, poner un salto (JMP) hasta allí y ejecutar nuestro código.

En este ejemplo voy a explicar como hacerlo manualmente para comprenderlo bien, pero se podría escribir un programa que facilitara la tarea. Vamos a hacer saltar un mensaje nada más abrir el bloc de notas, pero también podríamos añadir un programaque se baje algo de internet, un shellcode o un exploit que nos de root.

Bien, primero localiza el NOTEPAD.EXE en el directorio de Windows y haz una copia. Abre el OllyDbg y ejecútalo. Primero, vamos a buscar una zona "virgen" de código dentro, para poder excavar un poco e inyectar el nuestro. Lo que haremos será primero escribir los argumentos de la API MessageBox (más información aquí http://msdn.microsoft.com/en-us/library/ms645505(VS.85).aspx), llamarla pasándole esos argumentos y hacer un salto al principio del programa para que ejecute dicha función.

Bien, una vez que hemos corrido el programa con el Olly muevete un poco hacia abajo hasta encontrar un lugar cuyo código sea similar a este:


DB 00
DB 00
DB 00
...


Debe estar cerca del principio. Una vez hallado, marca sin miedo unas cuantas lineas con shift y el ratón y dale a editar (control+E). Escribe el texto en ASCII que quieras:



Dale a "OK" y verás en rojo lo modificado. En principio lo interpreta como código en ASM, por eso se ven comandos sin sentido. Actualizado haciendo Control+A y se verá así:



Para simplificar las cosas usaremos un solo texto para la ventana y para el texto, pero si quieres repite el proceso en otro lugar vacío para poner otra frase cualquiera.

Ahora que ya tenemos el argumento más importante de MessageBox podemos pasar a escribir la llamada a este. Recordemos como era:

int MessageBox(    
   HWND hWnd,
   LPCTSTR lpText,
   LPCTSTR lpCaption,
   UINT uType
);


En ASM, para pasar argumentos y hacer una llamda a una función tendría que ser así:

PUSH 0
PUSH 01008747
PUSH 01008747
PUSH 0
CALL MessageBoxA


Esto pone la ventana a nulo, y también el tipo de MessageBox para que solo tenga un botón. ATENCION: los dos números en hexadecimal del centro es el offset (la dirección) del texto que escribimos anteriormente. En mi caso es 0x01008747, pero en el tuyo podría ser otro.

Ahora busca otro trozo en blanco, marca una linea y dale a la barra espaciadora para editarlo, y empieza a añadir el código:



El cursor se irá desplazando automáticamente, ve escribiendo todo hasta completarlo:



Una vez lo tenemos apunta la dirección de nuestro código. En este ejemplo es 0x01008757. ¡No lo olvides! Ahora vamos al origen del programa, para poder hacer que salte a nuestro trocito. Botón secundario, Go To -> Origin:



Esto nos dejará en la primera linea del programa. Si directamente podemos un JMP (salto incondicional) a nuestra dirección se comería código original y por lo tanto importante. Así que marcar una cuantas lineas del principio y copialas aparte, en otro bloc de notas por ejemplo:



Ve ahora a la primera linea (PUSH 70 en este caso) y dale a la barra espaciadora. Escribe este código:

JMP 01008757

cuyo número será el que apuntamos anteriormente. Ahora nos quedará algo así:



Apunta el offset de la siguiente linea, aquí es 0x010073A4. Como puedes ver si comparamos con el código original que hemos copiado en el bloc de notas antes, nuestra edición se ha comido parte del programa original, así que hay que reimplantarlo. Vamos a nuestro código, haz Control+G y pon ahí la dirección a donde hacemos el salto (01008757).

Debajo del CALL MessageBoxA, ensambla de nuevo (tecla espacio) y añade el código que te comiste, así como un salto a la siguiente dirección. Quería así:


PUSH 70
PUSH 01001898
JMP 010073A4




Y nuestro codecave quedaría listo. Para terminar, haz clic en el botón secundario, "Copy to executable" -> "All modifications", pulsa el botón para guardar todas las modificaciones y cierra la ventana. Al hacer esto te pedriá una última confirmación, así que presiona "Sí" y "Aceptar" para terminar. Con esto nuestro programa modificado quedaría listo. Ve a donde lo tenías ejecutalo y verás el resultado.

¡Suerte!


Originalmente publicado en http://www.descifra.me/viewtopic.php?f=11&t=15

tena