Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un calcul compliqué

des chiffres et des lettres

Sujet résolu
    22 juillet 2021 à 4:07:40

    Bonjour.

    Il y a un problème que je n'arrive pas a résoudre.

    J'ai une variable nommé FinalValue initialisé a 0
    A la fin de mon programme cette valeur sera comparé a 0x1746e (hexa)

    je peux enchainer autant de fois des fonctions toute prête nommé print0 .. 9

    Je n'ai aucune idée de comment gérer ce calcul rationnellement :s

    Si vous trouvez et si vous trouvez avec une méthode... n'hésitez pas a m'expliquer :). Peut être que c'est impossible... qu'il faut écrire un script pour tester toute les possibilité.

    FinalValue = 0

    FinalValue == 0x1746e ==> WIN (95342)
    -----------
    print7 : do nothing

    print8 : FinalValue = FinalValue + 0x14cc5

    print9 : FinalValue = FinalValue * (FinalValue % 3);

    print4 :
      lVar3 = (FinalValue * 100 + 50000) % 0xd;
      lVar1 = lVar3 + 0x44;
      if (lVar1 < 0x4c) {
        FinalValue = lVar3 + 0x92;
      }
      else {
        FinalValue = lVar1 * 10;
      }
     
    print5 : FinalValue = FinalValue + 10000;

    print6 :
      FinalValue = FinalValue + 0x11112222;
      if (0x1ea7be3f < (long)FinalValue) {
        FinalValue = FinalValue ^ 0xdeadc03e;
      }
      FinalValue = (long)FinalValue / 0x4d;

    print1 : FinalValue = (FinalValue % 7) * 100;

    print2 : FinalValue = FinalValue - 1337;

    print3 :
      lVar1 = (FinalValue * 88 + 8) * 5000;
      FinalValue = lVar1 / 15;
     
    print0 : FinalValue = FinalValue + 0x1000441;

    -
    Edité par -Crixus- 22 juillet 2021 à 4:41:45

    • Partager sur Facebook
    • Partager sur Twitter

    "Etre vrai, peu le peuvent."
    Friedrich Nietzsche

      22 juillet 2021 à 4:54:35

      Moi je ne comprend pas ... ce que tu ne comprends pas.
      Explique plus clairement ton problème et ce que tu veux obtenir.
      Tu codes dans quel langage? Je ne reconnais pas ce langage.
      Tu dis toi-même que 0x1746e est un nombre hexadécimal. C'est normal d'y trouver des lettres de 'a' à 'f'.
      Ça donne 95342 en décimal. Je triche, je l'ai fait avec Python ...
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        22 juillet 2021 à 13:25:50

        Je crois deviner... Il s'agit du jeu des chiffres et des lettres. On doit obtenir 0x1746e à partir de 0 en enchaînant les fonctions 'print0' à 'print9'. Et la question est de savoir comment y parvenir autrement qu'au hasard, c'est bien ça ?

        Peut-être faudrait-il commencer par déterminer ce que font exactement les fonctions ?

        • Partager sur Facebook
        • Partager sur Twitter
          22 juillet 2021 à 15:02:48

          Hello !

          Yes robun, c'est bien ca.

          c'est un jeu de cracking. Un pad avec des chiffre.

          Quand on on clique sur les chiffres sa modifie une variable et affiche le numéro sur lequel on a cliqué.
          Quand on valide sa test l'égalité avec 0x1746e
          Quand on delete sa remet la valeur de la variable a 0 et supprime tout les chiffres/lettre sur l'écran.

          J'ai donc réussit a comprendre le comportement de l'application... mais je ne sais pas comment résoudre le problème sauf éventuellement en le brut force.

          Les fonctions sont claire... si je fait print5 print5 print8 print0 sa me donne (((0+10 000)+10 000) + 0x14cc5) + 0x1000441

          Si je clique sur confirm :

          if(FinalValue ==0x1746e) print("bravo")
          else print("that's unfortunate)

          J'ai bien conscience que les fonctions ne dont pas codé pour être compilé... mais ma question est comment les résoudre de tête.

          -
          Edité par -Crixus- 22 juillet 2021 à 15:09:00

          • Partager sur Facebook
          • Partager sur Twitter

          "Etre vrai, peu le peuvent."
          Friedrich Nietzsche

            22 juillet 2021 à 17:42:13

            On enchaine les opérations Print0 à print9,   chacune peut éventuellement être exécutée plusieurs fois si j'ai bien compris. 

            Dans quel cadre as tu trouvé cette énigme ?

            Si c'est un jeu, où de manière générale,il faut être astucieux, alors il doit y avoir une solution en 5 ou 6 opérations.

            Si c'est un jeu où il faut être un bon programmeur, alors la solution la plus courte est probablement en 15 ou 20 calculs et donc introuvable à la main.

            Je n'ai pas du tout envie de me lancer dans une des 2 pistes, si tout le contexte de ton jeu dit que c'est l'autre piste !

            • Partager sur Facebook
            • Partager sur Twitter
              22 juillet 2021 à 17:50:40

              https://crackmes.one/crackme/60e7572433c5d42814fb31b7

              J'ai trouvé la solution par brute force.

              Je ne crois pas qu'il faille la faire de "tête". Ca me parait trop complexe et le bruteforce trop rapide (presque instantané).

              Le solution est a lire de droite a gauche soit :

              31485

              #include <stdio.h>
              #include <stdlib.h>
              #include <time.h>
              
              int main(void) {
              
              
              
              	long FinalValue = 0;
              
              
              	void print7(){
              	}
              
              	void print8(){
              		FinalValue = FinalValue + 0x14cc5;
              	}
              
              	void print9(){
              		FinalValue = FinalValue * (FinalValue % 3);
              	}
              
              	void print4(){
              		int lVar3 = (FinalValue * 100 + 50000) % 0xd;
              		int lVar1 = lVar3 + 0x44;
              		if (lVar1 < 0x4c) {
              			FinalValue = lVar3 + 0x92;
              		}
              		else {
              			FinalValue = lVar1 * 10;
              		}
              	}
              
              	void print5(){
              		FinalValue = FinalValue + 10000;
              	}
              
              	void print6(){
              		FinalValue = FinalValue + 0x11112222;
              		if (0x1ea7be3f < (long)FinalValue) {
              			FinalValue = FinalValue ^ 0xdeadc03e;
              		}
              		FinalValue = (long)FinalValue / 0x4d;
              	}
              
              	void print1(){
              		FinalValue = (FinalValue % 7) * 100;
              	}
              
              	void print2(){
              		FinalValue = FinalValue - 1337;
              	}
              
              	void print3(){
              		int lVar1 = (FinalValue * 88 + 8) * 5000;
              		FinalValue = lVar1 / 15;
              	}
              
              	void print0(){
              		FinalValue = FinalValue + 0x1000441;
              	}
              
              	for(int i = 0; i<99999; i++){
              
              		int j = i;
              		do{
              			int f = j%10;
              			switch (f) {
              			case 1:
              				print1();
              				break;
              			case 2:
              				print2();
              				break;
              			case 3:
              				print3();
              				break;
              			case 4:
              				print4();
              				break;
              			case 5:
              				print5();
              				break;
              			case 6:
              				print6();
              				break;
              			case 7:
              				print7();
              				break;
              			case 8:
              				print8();
              				break;
              			case 9:
              				print9();
              				break;
              			default: // case 0
              				print0();
              				break;
              			}
              
              			j = j/10;
              
              		}while(j > 0);
              
              		if(FinalValue == 0x1746e){
              			printf("%d", i);
              			break;
              		}else {
              			FinalValue = 0;
              		}
              	}
              
              
              	return EXIT_SUCCESS;
              }
              



              • Partager sur Facebook
              • Partager sur Twitter

              "Etre vrai, peu le peuvent."
              Friedrich Nietzsche

              Un calcul compliqué

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown