Bueno, el titulo lo dice casi todo. Solo me queda decir que se usa de este modo:
./shell_prueba shellcode
. Donde shellcode seria el fichero que nos devuelve el compilador de asm en binario

.
Sin mas, el codigo es muy simple... solo carga los bytes en memoria y utiliza el buffer para ejecutar el codigo como si fuera una funcion. Si estais en ubuntu compilad con -z execstack para que no os de problemas.
#include <malloc.h>
#include <stdio.h>
int longitud(FILE *archivo);
int main(int argc, char *argv[])
{
if(argc < 2)
{
puts("Necesita un parametro"); return 1;
}
int longi, i;
char *shellcode;
FILE
*archivo
=fopen(argv
[1], "rb"); longi=longitud(archivo);
shellcode
=(char *)malloc(longi
); for(i=0;i<longi;i++)
{
shellcode
[i
]=getc(archivo
); }
((void(*)())shellcode)();
return 0;
}
int longitud(FILE *archivo)
{
int longi;
fseek(archivo
, 0, SEEK_END
); fseek(archivo
, 0, SEEK_SET
); return longi;
}
Sa1uDoS