logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C++] boucle
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [C++] boucle  (Lu 7924 fois)
comtezero

Profil challenge

Classement : 2123/54327

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« le: 21 Septembre 2005 à 19:56:40 »

J'inaugure ce forum par ce message pour ceux qui peuvent m'aider ,
Donc pour savoir si dans plusieurs boucles il est possible de mettre un if et comme actions a effectuer revenir au début de la boucle sans la remettre à 0. Je ne sais pas comment faire revenir au début de la boucle et si cela va la remttre à 0 ,

j'espere avoir été assez clair .

@++++
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
Nox
Profil challenge

non classé(e).

Membre Complet
***
Hors ligne Hors ligne
Messages: 142


Voir le profil
« #1 le: 29 Septembre 2005 à 22:56:06 »

Je pense que tu dois utiliser l'instruction GOTO
Journalisée

<-< Nox | Kernox >->

www.Kernox.ze.cx
Invit
Invité
« #2 le: 30 Septembre 2005 à 02:39:54 »

Ben GOTO c'est un **No Sms** peu à éviter quand même... sauf cas rarissimes, y'a toujours moyen de tourner le code différement

Tu cherches à faire quoi exactement Comtezero ?
Journalisée
comtezero

Profil challenge

Classement : 2123/54327

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« #3 le: 01 Octobre 2005 à 17:06:44 »

Ce que j'aurais voulu faire c'est un genre de générateur de mot pour essayer de faire un brute force, pour gagner tu temps si par exemple le mot est zzzaaa ne pas aller jusqu'a le generer en entier mais tester si il y a zzz puis si **No Sms** bon passé directement au mot d'apres zzzaab sans avoir fait le mot dans les boucles.
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
Nox
Profil challenge

non classé(e).

Membre Complet
***
Hors ligne Hors ligne
Messages: 142


Voir le profil
« #4 le: 01 Octobre 2005 à 18:52:22 »

un if devrait resoudre ton probleme sinon utilise un break; pour sortir de la boucle
Journalisée

<-< Nox | Kernox >->

www.Kernox.ze.cx
Invit
Invité
« #5 le: 02 Octobre 2005 à 16:02:21 »

Nan nan mais tu peux pas faire ça Comtezero, quand tu teste un mot de passe, il est testé sur l'ensemble de ses caractères, pas uniquement sur les 3 premiers par exemple (y'a qu'un certain "LanMan" qui permet ce genre de découverte mdrrr ).

Tout tient en fait dans le code de la partie à bruteforcer, si les différents caractères qui composent le mot de passe sont inter-dépendants (comme dans le Js8 par exemple...) ce n'est pas possible, ce genre de procédé est possible quand (par exemple et pour insister un peu sur l'ami lanman-cro$oft hihi) tu passes au programme de vérification non seulement le mot de passe à vérifier mais également la longueur du mot de passe par exemple, ce qui fait qu'en passant une longueur de mot de passe de 1, on trouve la première lettre qu'on stocke dans le "bon" mot de passe en cours de génération, puis on passe une longueur de 2 avec la première lettre qu'on a trouvé précédement dont on est sur qu'elle est bonne etc.

Ca fonctionne aussi avec des brute-forcer comme l'ami Jack nest-ce pas, lorsqu'il BF un hash MD5 par exemple, en fait il s'agit d'attaques par diffing, à savoir on génère des hash plus ou moins aléatoires que l'on compare avec celui que l'on cherche à trouver.
Plutot que de chercher absolument le même hash rigoureusement, on se base sur la comparaison obtenue, moyennant de savants calculs dont je serais bien en peine d'expliquer quoique ce soit , pour trouver plus ou moins une à une les différentes lettres du mot de passe original (les aspirines sont à gauche en sortant...).

En revanche, pour tout autre type de BF (autre que les attaques qui spécifient la longueur de mot de passe et les attaques bien spécifiques contre des algorithmes mathématiques donnés, notament certains hashages) je vois tout à fait le résultat que tu attends mais ça ne se voit que dans les films

Si on prends l'exemple d'un BF contre un htaccess (à ne pas faire hein, les IDS veillent au grain en général...) on est bien obligé d'envoyer le mot de passe complet au serveur pour qu'il le vérifie, et le serveur ne renvoie que "Toa tu passes" ou "Toa tu passes po", à aucun moment on ne peut savoir si la 1ère, la 4ème ou la dernière lettre du pass ont été validées... (encore heureux )

nb : Certaines attaques de ce type restent possibles malgré tout selon certaines conditions contre des softs spécifiques et en local sur une machine bien entendu, en mesurant le temps de vérification du programme d'authentification, mais autant dire que c'est de la haute voltige...

re-nb : euh... pour en revenir au code en C/C++ à proprement parlé, je t'en avais déjà plus ou moins causé pour le js8 notament je crois, http://www.newbiecontest.org/punbb/viewtopic.php?id=85&p=2 post #38, où tu as un exemple de code pour des boucles sans longueur fixe (il est pas exact après relecture mais à très peu de choses près, l'algo est bon), je sais pas si ça peut t'aider...
Journalisée
comtezero

Profil challenge

Classement : 2123/54327

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« #6 le: 02 Octobre 2005 à 16:13:13 »

En faite ce que je voulais faire c'est vu qu'en beaucoup de personne utilise des mots et non des {'78dogj==}# je voulias tester pendant que je genere X lettres au milieu de la génération pour voir si ca ressemble de prés ou loin à un mot ( pas de zzzz par exemple) et non envoyer une partie du mot pour voir si il fait partie de la base de donnée quand je parle de tester en plein milieu je reste en locale je n'envoie pas de données sur le serveur.

Citation
Nox
    Hier 19:52:22

un if devrait resoudre ton probleme sinon utilise un break; pour sortir de la boucle
Est-ce que cela fait quand meme incrémenter les boucles ou ca ferme purement la génération sans passer au mot suivant et continue toujours à vouloir générer le meme mot ?

nb :


{
   for (deuxième lettre)
   {
        for (troisième lettre)
        {
                etc... puisk on sait qu'on a que 6 lettres...
                code[0] = première lettre; code[1] = deuxième etc..;
                ma_procedure_tirée_du_js (code);
        }
   }
}

Voila le code que tu as mis, ce que je voudrais faire serait un truc du genre :


{
   for (deuxième lettre)
   {
        for (troisième lettre)
        {
            for ( quatrieme lettre)
                        If les4lettres=aaaa ou zzzz
                                   
 alors retour au début et incremente quand meme les preimeres lettres
                                    sinon continu
                   
 etc... puisk on sait qu'on a que 6 lettres...
                code[0] = première lettre; code[1] = deuxième etc..;
                ma_procedure_tirée_du_js (code);
        }
   }
}
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
Invit
Invité
« #7 le: 02 Octobre 2005 à 16:29:20 »

Citation de: Comtezero
En faite ce que je voulais faire c'est vu qu'en beaucoup de personne utilise des mots et non des {'78dogj==}# je voulias tester pendant que je genere X lettres au milieu de la génération pour voir si ca ressemble de prés ou loin à un mot ( pas de zzzz par exemple) et non envoyer une partie du mot pour voir si il fait partie de la base de donnée quand je parle de tester en plein milieu je reste en locale je n'envoie pas de données sur le serveur.
Oui oui, j'avais bien compris, mais ça n'empeche que le programme qui vérifie le mot de passe te dira pas si celui que tu lui file ressemble de près ou de loin, y te dira pas "match à 47%", y dira juste "oui" ou "non", donc comment savoir ce qui est bon ou pas dans ton mot de passe
Journalisée
Flodelarab
Profil challenge

non classé(e).

Néophyte
*
Hors ligne Hors ligne
Messages: 8


Voir le profil
« #8 le: 06 Novembre 2005 à 14:15:11 »

Interessant sujet.

pour JS8 moi j'aurais voulu faire des boucles de boucles mais **No Sms** possible. (car je ne ve pas 26*6 opérations mais 26^6 opérations :-) )

Maintenant 2 reponses:

1 Le C++ ne sait pas ce qu'est une boucle
2 Ce que tu dis est possible avec un dico

1 Le C++ initialise une variable, définit une butée, et fait une (ou plusieurs) action(s) (en general incrementation)
En brut c comme si tu ecrivais:

@debut
i=0
...code...
if (butée atteinte) jump fin
i++
jump @debut
@fin

partant de la, tout est permis a l'interieure de la boucle.
Pas de reinitialisation ou truc comme ça. C++ n'a pas conscience de la repetition.
Le truc le moins propre possible est de modifier i. genre i=butée+1 pour finir pseudo-naturellement la boucle a la fin du traitement
Mais tout le monde aura compris qu'un while et preferable dans ce genre de traitement ou le nombre d'operations est inconnu.


2
avec un dico tu récupere tous les mots a 6 lettres et tu les testent dans la moulinette.
Tu inverses le procédé utilisé par les autres (par moi en tous cas) qui consiste a sortir les 20000 mots et a voir rapidement tous ceux qui ne veulent rien dire :-)
Journalisée
comtezero

Profil challenge

Classement : 2123/54327

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« #9 le: 06 Novembre 2005 à 14:23:53 »

le c++ ne sait pas faire de boucle
Moi j'en ai imbriqués 6 les une dans les autres les goto ca sert a rien.
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
Invit
Invité
« #10 le: 06 Novembre 2005 à 19:22:51 »

Citation de: Flodelarab
pour JS8 moi j'aurais voulu faire des boucles de boucles mais **No Sms** possible. (car je ne ve pas 26*6 opérations mais 26^6 opérations :-) )
C'est le cas, 6 boucles imbriquées de 26 passages ça fait bien 26^6 traitements au final

Citation
1 Le C++ ne sait pas ce qu'est une boucle
Le C++ connait for(;, "for" est une instruction de bouclage donc C++ connait les boucles, manquerait plus que ça on serait bien emm3rdé

Citation
2 Ce que tu dis est possible avec un dico
Eh ouais mais encore faut-il être sûr que la solution sera dedans (ça fait référence à l'épreuve de JavaScript n°8 hein, y'a tout un débat dessus sur le forum) donc avoir un bon dictionnaire, et puis c'est à mon avis plus interressant de coder un brute-forcer où on est obligé de retranscrire l'algorithme de vérification à l'origine en JavaScript en C ou en C++, mais sur le fond c'est clair que ça va plus vite, autant tester cette méthode en amont pour peut-être gagner du temps.

Citation
1 Le C++ initialise une variable, définit une butée, et fait une (ou plusieurs) action(s) (en general incrementation)
En brut c comme si tu ecrivais:

@debut
i=0
...code...
if (butée atteinte) jump fin
i++
jump @debut
@fin
c'est beau l'algorithmie...
En somme ça veut dire (et c'est assez faux également, faut le savoir) qu'une fois compilé, le code machine préfèrera un code du style :
Code:
   mov cx, 0
@debut
   [traitement]
   cmp cx, butee
   jz @suite
   inc cx++
   jmp @debut
@suite
   ...
plutot que :
Code:
   mov cx, butee
@debut
   [traitement]
   or cx, cx
   loopnz @debut
   ...
Qui fait gagner à la fois des instructions et du temps machine (si si, "loop" fait gagner du temps machine depuis le 80486 )
Hors la plupart (pour ne pas dire la totalité) des compilateurs aujourd'hui génèrent un code dit "optimisé" et même si c'est pas toujours vrai, la première implémentation en tant que telle ne peut absolument pas être considérée comme optimisée, c'est une abstraction algorithmique qui ne prend pas en compte la réalité des cycles d'horloges et du temps d'exécution des instructions sur les processeur à base de jeu Intel.

Citation
tout le monde aura compris qu'un while et preferable dans ce genre de traitement ou le nombre d'operations est inconnu.
Héhé, l'idée est là, mais pareil, il s'agit (à mon avis) de sortir une liste des solutions possibles sans pour autant les valider à chaque fois et pour cause, on a que deux moyens pour valider la solution; faire des requêtes directement sur le site et récuperer le cas échéant un code HTTP 200 ou 404 (j'ai essayé il n'a pas aimé), selon le langage utilisé c'est pas gagné parcequ'il faut également se cogner la communication HTTP avec les cookies etc.
Ou alors passer la liste des solutions trouvées par force brute au dico et on en revient toujours à la même chose, avec un peu de chances on aura la bonne solution dans le dico mais rien de sûr.
De plus, utiliser directement un dictionnaire fera gagner beaucoups de temps dans la foulée, donc l'opération de brute-forcing ne sert à rien...
Pour en revenir à ça, et dans ce sens, un while ne sert pas à grand chose vu que le traitement n'est censé s'arreter que quand la liste est totalement crée... Dans la pratique on peut afficher les résultats en même temps que le programme cherche et tomber sur la solution par hasard tandis que le code tourne encore, auquel cas on peut (voire on est plus ou moins obligé même si c'est pas propre) vérifier le clavier et dès qu'une touche est enfoncée avoir un GOTO qui nous rebalance à la suite du code (ouai parcequ'un break suffira pas là dans plusieurs FOR imbriqués) ou effectivement tout passer sous condition while et rajouter une condition, mais on perd à chaque vérification de la condition énormément de temps également et si la structure est un peu plus correcte ou plutot conventionnelle, il n'en reste pas moins que c'est un peu lourd comme code au final...

En somme le dictionnaire selon moi c'est à tester en premier lieu, avec un balez de dico, ptet ça passe, mais à l'origine on est pas censé savoir que le mot qu'on cherche est compréhensible, donc dans tous les cas c'est pas une très bonne solution. Les attaques par force brute étant ultra grillées dans un contexte réel, il y a très peu de cas où celà s'applique de manière réellement efficace.
(J'en ai trouvé une dernièrement, sur un site vulnérable, lequel m'affiche la liste d'utilisateurs (fixe) du site mais pas les mots de passe, sachant que le site va sans doute pas bouger, ça vaut le coups de brute forcer le compte d'un utilisateur en prenant bien soin d'espacer les requêtes pour éviter de se faire détecter par les logs ou les sondes d'intrusion, et encore... il suffit que les mots de passes soient renouvelés fréquemment et/ou qu'il fasse genre un minimum de 6 caractères alphanumériques avec caractères spéciaux "*!$%?-#&" et on est pas pret de mettre la main dessus...)

BufferBob.
Journalisée
comtezero

Profil challenge

Classement : 2123/54327

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1001


Voir le profil WWW
« #11 le: 06 Novembre 2005 à 21:19:11 »

Monsieur BufferBob a parlé et coorigé  certains détails.

Merci a toi de passer un peu de temps à faire ces posts.
Journalisée

·´¯`·­»Comtezero«­·´¯`·

http://www.masstek.org
neoflo
Profil challenge

Classement : 8123/54327

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #12 le: 11 Décembre 2005 à 16:15:54 »

Je comprend pas trop ce que tu veux faire, mais l'instruction break; permet de sortie d'une boucle sans changer aucune variable. ça marche dans un while ou dans un for.

Sinon, ton histoire de générateur, imagine que tu doivent le faire avec des entiers:


Code:
int chaine;

while(chaine!=pass) {
  chaine++;
}

printf("%d ", chaine);
Et oui, avec des entiers, ça semble simple et bien si tu veux le faire avec des caractères, il suffit de faire un équivalent du ++ pour les chaines que l'on va appeler chaineplusplus(char* chaine); CAD
a devient b... et z devient aa
pour faire ça, hi hi, il suffit d'utiliser une fonction qui transforme un caractère en code ascii.On va dire qu'elle s'appelle ascii, prend un caractère et renvoit un entier. Et ascii2 qui fait le contraire.
(En fait, en C, c'est simplement
int ascii(char c) { return (int) c} et le contraire pour ascii2.

Pour ça, on va créer deux fonctions:
int transcription_en_entier (char* chaine) qui va transformer une chaine en entier.
C'est à dire que  transcription_en_entier(a)= ascii(a),  transcription_en_entier(ab) = ascii(a)*256+ascii(b)
Une fonction char* transcription_en_caractere (int i) qui va faire le contraire

Code:
int transcription_en_entier (char* chaine)  {
  char * tempo;
  int i;
  int transcription;
  strcpy(tempo, chaine);
  strrev(tempo);
 
  for (i=0; i<strln(tempo); i++)
    transcription += 256^i+ascii(tempo[i]);
  return transcription;
}
Code:
char* transcription_en_caractere (int atranscrire) {
 int i;
 int tempo = atranscrire;
 char* transcription;
 while(tempo !=0) {
   strcat(transcription, ascii2(tempo % 256);
   tempo / 256; //C bien le reste de la division euclidienne
  }
  strrev transcription;
return transcription,
}
Ainsi, on a facilement notre fonction:

Code:
void chaineplusplus(char* chaine) {
 int i;
 i = transcription_en_entier(chaine);
 i++;
 chaine = transcription_en_caractere(i);
}
NB: Je suis pas sûr que ça compile, il y a peut-être un décalage d'indice un moment, enfin, jviens de l'écrire ici, et j'ai pas envie de tester, mais le principe est là. En tout cas, c'est sûr que ça ne peut marcher car je boucle avec les 256 caractère du code ascii dont le caractère fin de chaine, dc les fonctions str... va pas faire la bonne chose.

Je ne dis pas que **No Sms** meilleur méthode, mais en tout cas, elle illustre bien une décomposition d'une fonction principale initiale assez complexe, mais dont le principe est simple en sous-fonction plus simple
Journalisée

Pages: [1]
  Imprimer  
 
Aller à: