Programmation C je suis "null"
Siro
-
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 !
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:
- Programmation C je suis "null"
- Application de programmation - Guide
- Comment ouvrir un fichier null ? - Guide
- Programmation envoi sms - Guide
- Programmation binaire - Guide
2 réponses
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!
Amuse toi bien!