Programmation C je suis "null"

Siro -  
 Siro -
Bonjour,
Voila je doit faire un tp de programation, étant absent une bonne partie de l'année je n'ai pu suivre mes cours de façon continue, alors je rame un peu. Je doit créer un programme qui décrypte des pass du fichier /etc/shadow (je précise que ce tp m'est donnée par mon prof qui n'a pas oublie de faire suivre ceci :
Article 323-1
(Ordonnance no 2000-916 du 19 septembre 2000 art. 3 Journal Officiel du 22
septembre 2000 en vigueur le 1er janvier 2002) (Loi no 2004-575 du 21 juin
2004 art. 45 I Journal Officiel du 22 juin 2004)
Article 323-2
Article 323-3
Article 323-3-1
Article 323-4
Article 323-5

Donc je suis conscient de ce que je fait et surtout averti.)

Voici le code que j'ai commenté, j'ai une probleme de thread a pa compilation, merci de me preciser si l'algo est correcte !



#define _XOPEN_SOURCE_
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <pthread.h> 

char *crypt (const char *clef, const char *salt);

//hash crypté du mot de passe
char pass[256]={0};

//salt du mot de passe crypté
char *salt;

/****************************************************/
/* Cette fonction teste tous les mots de passe
/* de taille taille et ayant les caractères
/* [a-zA-Z0-9]
/* ================================================ */
/* buff : tampon contenant le mot de passe
/* courant en train d'être construit et testé
/* taille : taille du mot de passe à rechercher
/* pos : position de la lettre en train de changer */
/* du mot de passe courant à tester
/****************************************************/
int brute(char* buff,int taille,int pos)
{
	//quand taille arrive à 0 : on a construit tout le mot de passe à tester
	if (taille==0)
	{
		//on peut compare le hash du mot de passe construit avec celui que l'on cherche
		char *p=(char*)crypt(buff,salt);
		if (strcmp(pass,p)==0){
			//si on a trouvé le bon mot de passe
			return 1;
		}
			//sinon, on continue
			return 0;
	}
	else
	{
	int i;
	//on fait varier chaque lettre du mot de passe parmi [a-zA-Z]
	for (i='a';i <= 'z';i++){
		buff[pos]=i;
		//on fait varier récursivement la jusqu'à la fin du mot
		if(brute(buff,taille-1,pos+1)==1)
			return 1;
	}
	for (i='A';i <= 'Z';i++){
		buff[pos]=i;
		//on fait varier récursivement la jusqu'à la fin du mot
		if(brute(buff,taille-1,pos+1)==1)
			return 1;
	}
	for (i='0';i <= '9';i++){
		buff[pos]=i;
		//on fait varier récursivement la lettre suivante jusqu'à la fin du mot
		if(brute(buff,taille-1,pos+1)==1)
			return 1;
	}

	return 0;
	}
}
/*********************************************************/
/* cette fonction extrait le salt du mot de passe crypté */
/* ===================================================== */
/* hash : hash MD5 ou DES du mot de passe
/* renvoie le salt dans un buffer alloué avec malloc
/*********************************************************/
char *ext_salt(char *hash)
{
	//buffer de retour
	char *ret;

	//taille du salt
	int len;

	//si mot de passe MD5
	if (strstr(hash,"$1$")==hash)
	{
		//$1$chaine$
		len=13;
	}
	//si mot de passe DES
	else
	{
		//deux caractères
		len=3;
	}
	//on alloue un buffer pour le salt
	ret=(char*)malloc(len*sizeof(char));
	//on copie le salt et on met un \0 à la fin
	strncpy(ret,hash,len-1)[len-1]='\0';
	return ret;
}

/***************************************************************/
/* cette structure nous permet d'extraire le user et le pass   */
/* ============================================================*/
/* pass : le mot de passe
/* user : le nom de l'utilisateur
/***************************************************************/
struct Password {
char * user;
char * pass;
};
typedef struct Password Password;


int decrypte(int i)
{
	//tampon pour contenir les mots de passe testés
	char buff[10]={0};
	//si la fonction renvoie 1 alors on a trouvé le mot de passe
	if (brute(buff,i,0)==1)
	{					
		printf("%s\n",buff);
		free(salt);
		return 0;
	}
}
//ce programme tente de décrypter un mot de passe MD5 par bruteforce
int main ()
{

	//longueur du mot de passe à rechercher
	int i;


	FILE * fic = fopen("shadow.txt", "r");
	Password p;
	char * user = malloc(sizeof(char)*50);
	char * pass = malloc(sizeof(char)*50);
	char * reste = malloc(sizeof(char)*50);
	int pid = getpid();

	while (!feof(fic))
	{
		fscanf(fic, "%[^:]:%[^:]:%[^\n] \n", user, pass, reste);
		printf("Lu : %s %s %s \n", user, pass, reste);
		fork();
		if (pid!=getpid()){
			printf("pid %d - je vais traiter %s et %s \n", getpid(),p.user,p.pass);
				//on demande le hash du pass
				//on extrait le salt
				salt=ext_salt(pass);
				//on cherche un mot de passe de 1 à 10 caractères
				for (i=1;i<=10;i++)
				{
					printf("Passage à des mots de passe de taille %d\n",i);
					
					// Fils utilise les threads pour décrypter
					// Création du thread
					pthread_t t;
					// Execution du thread
					pthread_create(&t,NULL,decrypte,i);
					printf("Le main dit : Le thread a été créé, maintenant il cherche\n");
					//sleep(10);
					// On attend la fin du thread
					pthread_join(t,0);
					printf("Main dit : le thread s'est éteint\n");



				}
				free(salt);
			break;
		}
	}

	return 0;
}




A voir également:

2 réponses

wowkiller
 
Si tu ne te souviens plus trop de tes cours, va sur ce site : https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c pour te souvenir de choses ou en apprendre. Il y a meme le c++.
Amuse toi bien!
1
Siro
 
Merci , mais je connais le site du zero qui m'a d'ailleur beaucoup aidé.
Mais puis je avoir ton point de vue sur l'algo ?
0