Ejecutar shellcode en C

Iniciado por mester, 3 Marzo 2017, 16:01 PM

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

mester

Hola.

Estoy intentando ejecutar una shellcode que genero con el programa xxd de esta manera:

xxd -i executable >> some.c


Una vez tengo la shell generada en el fichero some.c intento ejecutarlo de esta manera:

unsigned char shell[] = { ... };

void (*sh)();

sh = (void (*)())shell;
(void)(*sh)();


Al compilar el programa no da ningún error. Cuando lo ejecuto me da violacion de segmento.

También he probado cargando en memoria el programa de esta manera:

void *f = mmap ( 0, sizeof ( shell ), PROT_READ|PROT_WRITE|PROT_EXEC,
                               MAP_PRIVATE|MAP_ANON, -1, 0 );

memcpy ( f, shell, sizeof ( shell );

void (*sh)() = (void (*)())f;
(void)(*sh)();


Y me pasa lo mismo xd. ¿Cómo puedo ejecutar codigo en hexadecimal en C? Es decir, lo que viene a ser coger el codigo en lenguaje máquina codificado en hex y ejecutarlo en otro programa en C.

Yo creo que lo que tengo que hacer es cargarlo en memoria y ejecutar esa posicion de memoria, pero no sé qué hago mal en este proceso ni el por qué de la violación de segmento.

Gracias de antemano.
Justicia es dar a cada uno lo que se merece

ivancea96

¿Cómo generaste el executable? Estás llamando a una función, así que tiene que ser una función. No vale un executable en formato ELF.

Borito30

La mejor manera de inyectar código es usando el ataque AtomBombing es practicamente indetectable para la mayoría de antivirus. Pero también es valido cargar un shellcode memoria o usar un código cave. Por cierto no comprendo muy bien el código cave es lo mismo que una inyeccion de código o es algo diferente? Esque no comprendo muy bien que deferencia hay entre un código cave o inyectar código basicamente son lo mismo o estoy equivocado?
Estoy en contra del foro libre y la Sección de juegos y consolas (distraen al personal)

integeroverflow

#3
Cita de: mester en  3 Marzo 2017, 16:01 PM
Hola.

Estoy intentando ejecutar una shellcode que genero con el programa xxd de esta manera:

xxd -i executable >> some.c


Una vez tengo la shell generada en el fichero some.c intento ejecutarlo de esta manera:

unsigned char shell[] = { ... };

void (*sh)();

sh = (void (*)())shell;
(void)(*sh)();


Al compilar el programa no da ningún error. Cuando lo ejecuto me da violacion de segmento.

También he probado cargando en memoria el programa de esta manera:

void *f = mmap ( 0, sizeof ( shell ), PROT_READ|PROT_WRITE|PROT_EXEC,
                              MAP_PRIVATE|MAP_ANON, -1, 0 );

memcpy ( f, shell, sizeof ( shell );

void (*sh)() = (void (*)())f;
(void)(*sh)();


Y me pasa lo mismo xd. ¿Cómo puedo ejecutar codigo en hexadecimal en C? Es decir, lo que viene a ser coger el codigo en lenguaje máquina codificado en hex y ejecutarlo en otro programa en C.

Yo creo que lo que tengo que hacer es cargarlo en memoria y ejecutar esa posicion de memoria, pero no sé qué hago mal en este proceso ni el por qué de la violación de segmento.

Gracias de antemano.

eso sucede porque el compilador proteje por defecto la stack para que no sea ejecutable en caso de buffers overflow, etc...

compila con las siguientes flags:

gcc ejecutar-shellcode.c -o ejecutar-shellcode -fno-stack-protector -x execstack

EDIT: tambien puede ser que tu shellcode contenga instrucciones invalidas, podrias mostrar el codigo asm del shellcode y como lo extraes?