Site hosted by Angelfire.com: Build your free website today!

-------------------------- CORTAR POR AQUI --------------------------------

 

/*********************************************************************************/

/* cliente.c                                                                     */

/* Envio y recibo de mensajes con calculo de distancias, para hackerslab level13 */

/* By Jafar 2001                                                                 */

/*********************************************************************************/

 

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <netinet/in.h>

#include <netdb.h>

#include <math.h>

 

#include "comun.h"

#include "proto.h"

int respuesta;

 

int calcula(int origen, int destino)

{

 int capa1,capa2,bucle,contador,despla,despla1,despla2,total;

 int x1,x2,y1,y2,xdis,ydis;

 total=1;

 bucle=2;

 contador=0;

 despla=0;

 

 /* miramos en que plano esta el dato1 y dato2 con sus desplazamientos */

 for(;;)

                {

                if (contador == 6*total){

                                                                                total++;

                                                                                despla=0;

                                                                                contador=0;

                                                                   }

                if (bucle == origen) {

                                                                                capa1=total;

                                                                                despla1=despla;

                                                         }

                if(bucle == destino){

                                                                                capa2=total;

                                                                                despla2=despla;

                                                                                break;

                                                        }

                bucle++;

                despla++;

      contador++;

                }

                // Calculos de las posiciones en el espacio sin desplazamientos

                if(capa1>1){x1=capa1-1;}else x1=0;

                y1=-1-capa1;

                if(capa2>1){x2=capa2-1;}else x2=0;

                y2=-1-capa2;

                // Ahora calcularemos los desplazamientos del objetivo 1

                if(despla1>0) // Bajada diagonal izquierda

                {

                                for(bucle=0;bucle<capa1-1;bucle++)

                                {

                                if(bucle==despla1)break;

                                x1--;

                                y1--;

                                }

                }

                if(despla1>=capa1) // Subida diagonal izquierda

                {

                                for(bucle=capa1-1;bucle<(capa1*2)-1;bucle++)

                                {

                                if(bucle==despla1)break;

                                x1--;

                                y1++;

                                }

                }

                if(despla1>=capa1*2) // Subida vertical

                {

                                for(bucle=(capa1*2)-1;bucle<(capa1*3)-1;bucle++)

                                {

                                if(bucle==despla1)break;

                                y1=y1+2;

                                }

                }

                if(despla1>=capa1*3) // Subida diagonal derecha

                {

                                for(bucle=(capa1*3)-1;bucle<(capa1*4)-1;bucle++)

                                {

                                if(bucle==despla1)break;

                                x1++;

                                y1++;

                                }

                }

                if(despla1>=capa1*4) // Bajada diagonal derecha

                {

                                for(bucle=(capa1*4)-1;bucle<(capa1*5)-1;bucle++)

                                {

                                if(bucle==despla1)break;

                                x1++;

                                y1--;

                                }

                }

                if(despla1>=capa1*5) // Bajada vertical

                {

                                for(bucle=(capa1*5)-1;bucle<despla1;bucle++)

                                {

                                y1=y1-2;

                                }

                }

 

                // Ahora calcularemos los desplazamientos del objetivo 2

                if(despla2>0) // Bajada diagonal izquierda

                {

                                for(bucle=0;bucle<capa2-1;bucle++)

                                {

                                if(bucle==despla2)break;

                                x2--;

                                y2--;

                                }

                }

                if(despla2>=capa2) // Subida diagonal izquierda

                {

                                for(bucle=capa2-1;bucle<(capa2*2)-1;bucle++)

                                {

                                if(bucle==despla2)break;

                                x2--;

                                y2++;

                                }

                }

                if(despla2>=capa2*2) // Subida vertical

                {

                                for(bucle=(capa2*2)-1;bucle<(capa2*3)-1;bucle++)

                                {

                                if(bucle==despla2)break;

                                y2=y2+2;

                                }

                }

                if(despla2>=capa2*3) // Subida diagonal derecha

                {

                                for(bucle=(capa2*3)-1;bucle<(capa2*4)-1;bucle++)

                                {

                                if(bucle==despla2)break;

                                x2++;

                                y2++;

                                }

                }

                if(despla2>=capa2*4) // Bajada diagonal derecha

                {

                                for(bucle=(capa2*4)-1;bucle<(capa2*5)-1;bucle++)

                                {

                                if(bucle==despla2)break;

                                x2++;

                                y2--;

                                }

                }

                if(despla2>=capa2*5) // Bajada vertical

                {

                                for(bucle=(capa2*5)-1;bucle<despla2;bucle++)

                                {

                                y2=y2-2;

                                }

                }

                // Ahora hacemos los calculos pertinentes para la distancia x e y

                if(x1==x2)xdis=0;

                if(y1==y2)ydis=0;

                //Ajustamos las diferencias en X

                if(x1>x2)

                {

                                if(x1<0)

                                {

                                                xdis=abs(x1)-abs(x2);

                                }

                                if(x1>=0)

                                {

                                                if(x2>=0) xdis=abs(x1)-abs(x2);

                                                if(x2< 0) xdis=abs(x1)+abs(x2);

                                }

                }

                if(x2>x1)

                {

                                if(x2<0)

                                {

                                                xdis=abs(x2)-abs(x1);

                                }

                                if(x2>=0)

                                {

                                                if(x1>=0) xdis=abs(x2)-abs(x1);

                                                if(x1< 0) xdis=abs(x2)+abs(x1);

                                }

                }

                //Ajustamos las diferencias en Y

                if(y1>y2)

                {

                                if(y1<0)

                                {

                                                ydis=abs(y1)-abs(y2);

                                }

                                if(y1>=0)

                                {

                                                if(y2>=0) ydis=abs(y1)-abs(y2);

                                                if(y2< 0) ydis=abs(y1)+abs(y2);

                                }

                }

                if(y2>y1)

                {

                                if(y2<0)

                                {

                                                ydis=abs(y2)-abs(y1);

                                }

                                if(y2>=0)

                                {

                                                if(y1>=0) ydis=abs(y2)-abs(y1);

                                                if(y1< 0) ydis=abs(y2)+abs(y1);

                                }

                }

                // Ahora veremos que tipo de distancia tenemos para calcular el tema

                // Primer caso

                if(abs(xdis)>=abs(ydis) && xdis != 0)

                {

                respuesta=abs(xdis);

                }

                //segundo caso

                else if(xdis==0)

                {

                respuesta=abs(ydis)/2;

                }

                else

                // Tercer caso

                {

                respuesta=abs(xdis)+((abs(ydis)-abs(xdis))/2);

                }

 

      printf("x1: %d \n", x1);

      printf("y1: %d \n", y1);

      printf("capa1: %d \n", capa1);

      printf("desplazamiento 1: %d \n", despla1);

      printf("x2: %d \n", x2);

      printf("y2: %d \n", y2);

      printf("capa2: %d \n", capa2);

      printf("desplazamiento 2: %d \n", despla2);

      printf("xdis: %d \n", xdis);

      printf("ydis: %d \n", ydis);

      printf("distancia: %d \n", respuesta);

}

 

 

int abre_socket(hostname, port)

  char *hostname;

  int port;

{

  int skt;

  struct sockaddr_in sktin;

  struct hostent *host;

 

  /* crea el socket, si da error, acaba el programa */

  if ( (skt = socket( AF_INET , SOCK_STREAM , 0 /* protocol */)) < 0)

    { fprintf(stderr,

         "* ERROR : No se ha podido crear el socket (pid=%d)\n",getpid());

       exit(-1); /* termina el programa: ERROR */

    }

 

  /* nombra el socket */

  memset(&sktin, 0, sizeof(sktin)); /* rellena con el valor 0 */

  sktin.sin_family = AF_INET;

 

  /* asigna el puerto a donde nos conectaremos */

  sktin.sin_port = htons(port);

 

  /* pasa el nombre del host a direccion IP */

  /* direccion logica */

  if (host = gethostbyname(hostname))

    memcpy(&sktin.sin_addr, host->h_addr, host->h_length);

  /* decimales separados por puntos: direccion numerica */

  else if ((sktin.sin_addr.s_addr = inet_addr(hostname)) < 0 )

    { fprintf(stderr,

         "* ERROR : No conozco el host %s (pid=%d)\n" ,

         hostname , getpid());

       exit(-1); /* termina el programa: ERROR */

    }

 

  /*  conectar el socket */

  if (connect(skt, (struct sockaddr *)&sktin, sizeof(sktin)) < 0 )

    { fprintf(stderr,

         "* ERROR : No consigo conectar con el host %s:%d (pid=%d)\n" ,

         hostname , port, getpid());

       exit(-1); /* termina el programa: ERROR */

    }

  return (skt);

}

 

int main(argc,argv,envp)

  int argc;

  char *argv, *envp;

{

  int skt, bufpos,bucle,paquete;

  char buf[TAM_BUFFER];

  // Estructuras para hackerslab

  t_query recibo; // usada para datos recibidos del servidor

  t_reply mando;  // usada para mandar respuestas

  /* abre el socket */

  skt=abre_socket(SERVERHOST, SERVERPORT);

  // Password Actual

  strcpy(mando.current_pass,"chl1296rh");

 

 

  /* proceso central */

  for(paquete=1;paquete<4;paquete++)

  {

  /* recepcion del primer paquete */

  if ((bufpos=read(skt, &recibo, sizeof(recibo))) < 0)

    { fprintf(stderr,

         "* ERROR : No consigo leer del socket %d (pid=%d)\n" ,

         skt , getpid());

    }

  else

      {

                                printf("Paquete recibido de hackerslab \n");

                                printf("------------------------------ \n");

                                printf("flag: %d \n", recibo.flag);

                                printf("origen: %d \n", recibo.query_a);

                                printf("destino: %d \n", recibo.query_b);

                                printf("Password siguiente: %s \n",recibo.next_pass);

                                printf("------------------------------ \n \n");

     }

   if(recibo.flag==2)

   {

                printf("-------------------------------- \n");

                printf("Respuesta al paquete %d fallada\n",paquete-1);

                printf("-------------------------------- \n");

                /* cierra el socket */

                if (close(skt) < 0)

                {

                fprintf(stderr,"* ERROR : Al cerrar el socket %d (pid=%d)\n" ,skt , getpid());

      exit(-1); /* termina el programa: ERROR */

      }

 

      /* termina el programa: OK */

      return 0;

   }

 

  /* Hacemos la solucion a la pregunta */

    printf("Calculando respuesta %d .... \n \n",paquete);

    respuesta=0;

    if(recibo.query_b > recibo.query_a)calcula(recibo.query_a, recibo.query_b);

    if(recibo.query_a > recibo.query_b)calcula(recibo.query_b, recibo.query_a);

 

  /* mandamos la primera respuesta */

   printf("Mandando paquete %d .... \n \n",paquete);

   mando.answer= respuesta;

 

  if (write(skt,&mando,sizeof(mando)) < 0)

    { fprintf(stderr,

         "* ERROR : No consigo escribir en el socket %d (pid=%d)\n" ,

         skt , getpid());

                printf(" Error numero %d \n", skt);

    }

  else

      {

                                printf("Paquete mandado a hackerslab \n");

                                printf("------------------------------ \n");

                                printf("Respuesta: %d \n", mando.answer);

                                printf("Password actual: %s \n",mando.current_pass);

                                printf("------------------------------ \n \n");

                                printf("En espera recibir paquete %d .... \n \n",paquete);

     }

 

  } // Fin del Bucle de 3 envios

 

  /* recepcion del paquete final con el password */

  if ((bufpos=read(skt, &recibo, sizeof(recibo))) < 0)

    { fprintf(stderr,

         "* ERROR : No consigo leer del socket %d (pid=%d)\n" ,

         skt , getpid());

    }

  else

      {

                                printf("Paquete recibido de hackerslab \n");

                                printf("------------------------------ \n");

                                printf("flag: %d \n", recibo.flag);

                                printf("origen: %d \n", recibo.query_a);

                                printf("destino: %d \n", recibo.query_b);

                                printf("Password siguiente: %s \n",recibo.next_pass);

                                printf("------------------------------ \n \n");

     }

 

  /* cierra el socket */

  if (close(skt) < 0)

    { fprintf(stderr,

         "* ERROR : Al cerrar el socket %d (pid=%d)\n" ,

         skt , getpid());

       exit(-1); /* termina el programa: ERROR */

    }

 

  /* termina el programa: OK */

  return 0;

}

 

-------------------------- CORTAR POR AQUI --------------------------------

 

Y listo, tenemos el programa asi que manos a la obra, conectamos, llamamos a la

aplicacion:

./cliente > resultado

asi veremos el texto durante el proceso y..............

 

Paquete recibido de hackerslab

------------------------------

flag: 0

origen: 2598

destino: 8021

Password siguiente: 

------------------------------

 

Calculando respuesta 1 ....

 

x1: 29

y1: -3

capa1: 29

desplazamiento 1: 160

x2: -12

y2: -92

capa2: 52

desplazamiento 2: 63

xdis: 41

ydis: -89

distancia: 65

Mandando paquete 1 ....

 

Paquete mandado a hackerslab

------------------------------

Respuesta: 65

Password actual: chl1296rh

------------------------------

 

En espera recibir paquete 1 ....

 

Paquete recibido de hackerslab

------------------------------

flag: 0

origen: 3383

destino: 1416

Password siguiente: 

------------------------------

 

Calculando respuesta 2 ....

 

x1: -7

y1: -37

capa1: 22

desplazamiento 1: 28

x2: 18

y2: -50

capa2: 34

desplazamiento 2: 15

xdis: 25

ydis: -13

distancia: 25

Mandando paquete 2 ....

 

Paquete mandado a hackerslab

------------------------------

Respuesta: 25

Password actual: chl1296rh

------------------------------

 

En espera recibir paquete 2 ....

 

Paquete recibido de hackerslab

------------------------------

flag: 0

origen: 2810

destino: 1856

Password siguiente: 

------------------------------

 

Calculando respuesta 3 ....

 

x1: -25

y1: -15

capa1: 25

desplazamiento 1: 54

x2: 12

y2: -50

capa2: 31

desplazamiento 2: 18

xdis: 37

ydis: -35

distancia: 37

Mandando paquete 3 ....

 

Paquete mandado a hackerslab

------------------------------

Respuesta: 37

Password actual: chl1296rh

------------------------------

 

En espera recibir paquete 3 ....

 

Paquete recibido de hackerslab

------------------------------

flag: 1

origen: 0

destino: 0

Password siguiente: To the top

------------------------------

Eh bualaaaaaaaaaaa, ahi tenemos la pass para el ultimo level.

al final aqui esta mi registro que quedo en hackerslab hasta que al koreano le

toque los webos y los borre todos, jajajjaa

 

552  jafar  2000-12-27  09:39:15  2001-02-14 23:56:06  14

 

Bueno, adios a todos, espero que os haya servido de algo mi documento, tb

espero que no seais demasiados crueles si meti alguna pifia mientras redacte el

documento y tan solo os pido que sean buenos y no dejen de jugar a todo lo que

puedan.

 

                                                                                                                                                                Jafar 2001 rootering@yupimail.com

 

*EOF*