Shell Code Generator v1.3
Introducción
Antes de nada, ¿qué es una Shellcode? ¿qué hace y para qué vale Shell Code Generator? Bueno, voy a intentar responder a la primera pregunta con mis propias palabras. Una buena definición es la que nos propone Wikipedia. Imagina un programa cualquiera que tiene una caja de texto donde te pone que escribas tu nombre y luego tiene un botón que comprueba si tu nombre está en su base de datos. Ejemplo sencillo ¿no?. Pues ahora piensa que en vez de poner tu nombre escribes una gran cantidad de letras sin sentido, ¿qué puede ocurrir? que el programa no esté preparado para manejar tal cantidad de letras y se produzca (por ejemplo) un "desbordamiento" de la pila. Como sabes, las letras que escribes en la caja de texto realmente en ASCII son bytes. Pues con todo esto vuelve a imaginar que esa gran cantidad de letras que has escrito antes NO son letras sin sentido sino que es código ensamblador y ese código , ayudado por el desbordamiento de la pila, será ejecutado. Este código (Shellcode) por ejemplo puede hacer que se abra el notepad. Entonces fíjate: desde un programa con una caja de texto y un botón hemos conseguido que se ejecute (Shell) el código (code) ensamblador y aparezca el bloc de notas. Una Shellcode es eso: es un recorte(trozo, parte) de código, normalmente en ensamblador ( si lo haces por ejemplo en C++, lo compilas y obtienes el código ensamblador) que es ejecuta para realizar una determinada función para la cuál ha dicho diseñado el código: en el ejemplo que hemos hecho, el código ha sido diseñado para abrir el bloc de notas...
Sin embargo, utilizando esta técnica también podemos usarla en beneficio del programador, por ejemplo: ¿Has pensado alguna vez cómo se puede ejecutar código en ensamblador desde Visual Basic 6? Usar un inline asm puede hacer tu programa de VB muchísimo más rápido. ¿Sabes, por ejemplo, cómo crear medidas contra Cracking en Visual Basic 6 usando esta técnica? Te mostraré cómo llamar sencillamente a IsDebuggerPresent.
Shell Code Generator v.1.3
Para escribir una Shellcode se realiza normalmente con opcodes que son el código directamente en ensamblador. Lo más común es verlo con el siguiente formato:
\x50\x58\x40\x48 (formato: \xvalor_hexadecimal)
La Shellcode anterior en un procesador de la familia x86, es en código ensamblador lo siguiente:
004130D4 50 push eax
004130D5 58 pop eax
004130D6 40 inc eax
004130D7 48 dec eax
Como puedes observar, realizar el paso de convertir este código ensamblador al formato de la Shellcode puede ser muy laborioso. Para eso está Shell Code Generator. Shell Code Generator v1.3 crea a partir de un archivo binario el formato adecuado de la Shellcode, es decir, a partir de un archivo con los siguientes datos: 50 58 40 48, crea otro archivo con \x50\x58\x40\x48 que es el que utilizaremos en nuestro programa o Snippet(recorte de código).
Este programa me parece muy útil e interesante. Está realizado para Windows en C, tiene el código fuente incluido y el autor original es ZorgioN que realizó en mayo de 2009 el programa hasta la versión 1.2. Le doy las gracias desde aquí por compartirlo. En enlace donde expone este programa es este: http://www.opensc.ws/snippets-unsorted/6251-win32-c-shell-code-generator.html. Como podéis observar he modificado unas cuantas cosas principalmente porque he querido que el formato final fuese compatible con Visual Basic para poder mostrar cómo ejecutar código ensamblador directamente en este compilador, que se verá en un tutorial aparte.
Shell Code Generator v1.3 - Código fuente
Muestro el código fuente por si alguien quiere echarle un vistazo. Lo iba a poner escrito, pero redimensiona toda la página así que lo pongo en descarga. En el mismo enlace podéis descargar el programa compilado con Visual C++ v8 y empacado con PESpin (el primero que se me ha ocurrido). Siguiendo la forma del original, no le he puesto icono para no depender de ningún archivo de recurso y simplemente con el código poder compilar todo. Las ventanas se crean en ejecución.
Descarga de los archivos:
???????????????
???????????????
???????????????
???????????????
??????????????? ???????
??????????????? ???????
??????????????? ???????
??????????????? ???????
??????????????? ???????
??????????????? ???????
??????????????? ??????
??????????????? ?????