Partage
  • Partager sur Facebook
  • Partager sur Twitter

Désobfuscation Javascript

Anonyme
    11 janvier 2021 à 23:39:14

    Bonjour !

    J'ai besoin d'aide pour désobfusquer ce code Javascript : 

    var ð= "\x71\x11\x24\x59\x8d\x6d\x71\x11\x35\x16\x8c\x6d\x71\x0d\x39\x47\x1f\x36\xf1\x2f\x39\x36\x8e\x3c\x4b\x39\x35\x12\x87\x7c\xa3\x10\x74\x58\x16\xc7\x71\x56\x68\x51\x2c\x8c\x73\x45\x32\x5b\x8c\x2a\xf1\x2f\x3f\x57\x6e\x04\x3d\x16\x75\x67\x16\x4f\x6d\x1c\x6e\x40\x01\x36\x93\x59\x33\x56\x04\x3e\x7b\x3a\x70\x50\x16\x04\x3d\x18\x73\x37\xac\x24\xe1\x56\x62\x5b\x8c\x2a\xf1\x45\x7f\x86\x07\x3e\x63\x47";function _(x,y){return x^y;}function __(y){var z = 0;for(var i=0;i<y;i++){z += Math.pow(2,i);}return z;}function ___(y){var z = 0;for(var i=8-y;i<8;i++){z += Math.pow(2,i);}return z} function ____(x,y){y = y % 8;Ï = __(y);Ï = (x & Ï) << (8-y);return (Ï) + (x >> y);}function _____(x,y){y = y % 8;Ï = ___(y);Ï = (x & Ï) >> (8-y);return ((Ï) + (x << y)) & 0x00ff;}function ______(x,y){return _____(x,y)}function _______(_________,key){________ = "";________2 = "";for(var i=0;i<_________.length;i++){c = _________.charCodeAt(i);if(i != 0){t = ________.charCodeAt(i-1)%2;switch(t){case 0:cr = _(c, key.charCodeAt(i % key.length));break;case 1:cr = ______(c, key.charCodeAt(i % key.length));break;}}else{cr = _(c, key.charCodeAt(i % key.length));}________ += String.fromCharCode(cr);}return ________;}function __________(þ){var ŋ=0;for(var i=0;i<þ.length;i++){ŋ+=þ["charCodeAt"](i)}if(ŋ==8932){var ç=window.open("","","\x77\x69\x64\x74\x68\x3d\x33\x30\x30\x2c\x68\x65\x69\x67\x68\x74\x3d\x32\x20\x30");ç.document.write(þ)}else{alert("Mauvais mot de passe!")}}__________(_______(ð,prompt("Mot de passe?")));

    En particulier les \x71\x11\x24... Car je les ai rencontré plusieurs fois

    Quelqu'un peut me dire en quoi c'est obfusqué et comment le désobfusqué ?

    • Partager sur Facebook
    • Partager sur Twitter
      21 janvier 2021 à 19:24:46

      Hello,
      Commence par utiliser un javascript beautifier online : https://beautifier.io/

      Ensuite tu remplaces les variables avec des caractères spéciaux par des chaines de caractères humaines + tu vires le code inutile:

      var key = "\x71\x11\x24\x59\x8d\x6d\x71\x11\x35\x16\x8c\x6d\x71\x0d\x39\x47\x1f\x36\xf1\x2f\x39\x36\x8e\x3c\x4b\x39\x35\x12\x87\x7c\xa3\x10\x74\x58\x16\xc7\x71\x56\x68\x51\x2c\x8c\x73\x45\x32\x5b\x8c\x2a\xf1\x2f\x3f\x57\x6e\x04\x3d\x16\x75\x67\x16\x4f\x6d\x1c\x6e\x40\x01\x36\x93\x59\x33\x56\x04\x3e\x7b\x3a\x70\x50\x16\x04\x3d\x18\x73\x37\xac\x24\xe1\x56\x62\x5b\x8c\x2a\xf1\x45\x7f\x86\x07\x3e\x63\x47";
      
      function pow(x, y) {
          return x ^ y;
      }
      
      function pow_suite(y) { //until y 2^1, 2^2, 2^n+1
          var z = 0;
          for (var i = 0; i < y; i++) {
              z += Math.pow(2, i);
          }
          return z;
      }
      
      function pow_suite_fancy(y) { //until (8-y) 2^i
          var z = 0;
          for (var i = 8 - y; i < 8; i++) {
              z += Math.pow(2, i);
          }
          return z
      }
      
      function custom_xor(x, y) {
          y = y % 8;
          i = pow_suite_fancy(y);
          i = (x & i) >> (8 - y);
          return ((i) + (x << y)) & 0x00ff;
      }
      
      function decrypt(key, password) {
          text = "";
          for (var i = 0; i < key.length; i++) {
              c = key.charCodeAt(i);
              if (i != 0) {
                  t = text.charCodeAt(i - 1) % 2;
      switch (t) { case 0: cr = pow(c, password.charCodeAt(i % password.length)); break; case 1: cr = custom_xor(c, password.charCodeAt(i % password.length)); break; } } else { cr = pow(c, password.charCodeAt(i % password.length)); } text += String.fromCharCode(cr);
      } return url; } function checkText(password) { var n = 0; for (var i = 0; i < password.length; i++) { n += password["charCodeAt"](i) } if (n == 8932) { var html_element = window.open("", "", "width=300,height=2 0"); html_element.document.write(password) } else { alert("Mauvais mot de passe!") } } checkText(decryptText(key, prompt("Mot de passe?")));


      On peut voir que le code faire un check de ton mot de passe en faisant un "xor" avec la clef passée au dessus.
      Visiblement si tu réussis il t'ouvre un message dans ton navigateur (avec le flag ou pour te dire que ta trouvé le bon mdp je suppose).

      La clef veut rien dire de spéciale (et c'est normal): 



      Par contre tu peux voir que ton url va faire 98 charactères de long.

      Et quelle se répète tous les \x71 (6 caractères), donc ton mot de passe fait surement 6 caractères.

      Try de brutforce les mots de passe sur 6 char et tu verras.

      Indice: la clef c'est surement de l'html donc ça commence avec les caractères : "<html>"

      -
      Edité par venom0218 21 janvier 2021 à 20:11:26

      • Partager sur Facebook
      • Partager sur Twitter
      "Skill will accomplish what is denied to force" (Mertvago,1995)
        22 janvier 2021 à 9:02:19

        Salut,

        Juste une remarque, parce que je vois que la première fonction s'appelle 'pow' et qu'elle implique l'opération suivante :

        x ^ y

        ^ n'est pas l'opérateur 'puissance/exposant' mais 'ou exclusif'. En javascript l'opérateur puissance est ** (double symbole multiplier) : 

        console.log(3 ^ 2) // ==> 1
        console.log(3 ** 2) // ==> 9

        -
        Edité par BrainError 22 janvier 2021 à 9:02:48

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          22 janvier 2021 à 14:22:31

          Merci pour vos réponses

          Je me demandais juste c'est quoi les /x11 ... 

          • Partager sur Facebook
          • Partager sur Twitter
            22 janvier 2021 à 15:01:31

            BrainError a écrit:

            ^ n'est pas l'opérateur 'puissance/exposant' mais 'ou exclusif'. En javascript l'opérateur puissance est ** (double symbole multiplier) : 


            Yes autant pour moi trop habitué au C++. Bien vu.

            K-C0d3 a écrit:

            Merci pour vos réponses

            Je me demandais juste c'est quoi les /x11 ... 

            C'est juste les caractères en code hexadecimal.
            Exemple: "\x77\x69\x64\x74\x68\x3d\x33\x30\x30\x2c\x68\x65\x69\x67\x68\x74\x3d\x32\x20\x30"

            Correspond à : "width=300,height=2 0"



            • Partager sur Facebook
            • Partager sur Twitter
            "Skill will accomplish what is denied to force" (Mertvago,1995)
            Anonyme
              4 février 2021 à 15:43:37

              Merci beaucoup !
              • Partager sur Facebook
              • Partager sur Twitter

              Désobfuscation Javascript

              × 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