2017-10-26 3 views
-2

暗号化方法を識別する方法はありますか?javascriptのcrackme暗号化アルゴリズムのアルゴリズムを確認

は、彼らがRC4

を使用してこのcrackme例では、アップデートが明確にするために「input128」の値

を抽出して、いくつかのサイトでの暗号化方法を反復私に数時間を要した: 上のテキスト入力要素があります(_inputValueに設定されている値)を入力した後、ボタンをクリックすると、最後の行で関数が実行されます。selectedOptionが2の場合、「良い」と表示されます。 それ以外の場合は5 optionsArrの不正なオプション。主な機能を開梱し、洗浄後の

は次のとおりです。

var mainFunction = function(e) { 
    var arr256 = new Array(); 
    for (var index = 0; index < 256; index++) arr256[(index).toString()] = index; 
    var varX = 0; 
    var _inputValue = document.getElementsByTagName('input')[0]['value']; 
    for (var index = 0; index < 256; index++) { 
     var secret = 'click'; 
     varX = (varX + arr256[(index).toString()] + secret.charCodeAt(index % 5)) % 256; 
     arr256[(index).toString()] ^= arr256[(varX).toString()]; 
     arr256[(varX).toString()] ^= arr256[(index).toString()]; 
     arr256[(index).toString()] ^= arr256[(varX).toString()]; 
    } 
    index = varX = 0; 
    var cmpStr = ''; 
    for (var index2 = index; index2 < _inputValue.length; index2 += 2) { 
     index = (index + 1) % 256; 
     varX = (varX + arr256[(index).toString()]) % 256; 
     arr256[(index).toString()] ^= arr256[(varX).toString()]; 
     arr256[(varX).toString()] ^= arr256[(index).toString()]; 
     arr256[(index).toString()] ^= arr256[(varX).toString()]; 
     var parsedInt = parseInt(_inputValue.substr(index2, 2), 16); 
     var idxAtArr = arr256[(index).toString()]; 
     var xAtArr = arr256[(varX).toString()]; 
     var secondVal = arr256[((idxAtArr + xAtArr) % 256).toString()]; 
     var xorVal = parsedInt^secondVal; 
     cmpStr += String.fromCharCode(xorVal); 
    } 
    var selectedOption = cmpStr.charCodeAt(cmpStr.charCodeAt(0) % cmpStr.length) % 6; 
    if (cmpStr != 'input128' && selectedOption == 2) selectedOption++; 
    optionsArr[(selectedOption).toString()](); 
}; 
+0

苦痛だった進に変換RC4それだけで使用していないので、強制的に。 [help/on-topic]ははっきり言っています*本、ツール、ソフトウェアライブラリ、チュートリアル、その他のオフサイトリソースを推薦する**を探すことを求める質問は、Stack Overflowの話題にはなりません回答と迷惑メール* –

+0

あなたはツールを求めていました。あなたは今ではありません。編集に感謝します。クローズされた投票が取り下げられ –

+2

私はクローズ投票を削除しました。誰にも実行されません。あなたはトピック以外の質問を投稿しました。私はそれを閉じるように投票しました(理由を説明するのに十分なほど礼儀正しかった)。あなたはトピックにそれを作るために編集しました、私は近い投票を削除しました。 downvoteが私のものだと仮定しています。仮定は良い考えではなく、あなたが告発したときにしばしば侮辱することができます。私は近い投票を説明した。私はどこで下降していると言いましたか? –

答えて

1

最初&クリーンなソリューション

Password: <input/><br/> 
<button>Check</button> 
<script id="urchin"> 
    (function() { 
     var optionsArr = [ 
      function() { 
       console.warn("boo") 
      }, 
      function() { 
       console.warn(":(") 
      }, 
      function() { 
       console.log("Congratz!") 
      }, 
      function() { 
       console.warn("allmost there") 
      }, 
      function() { 
       console.warn("muhaha") 
      }, 
      function() { 
       console.warn("nahhh") 
      }, 
      function() { 
       console.warn("not even close") 
      } 
     ]; 
     var mainFunction = function() { 
      var arr = []; 
      for (var i = 0; i < 256; i++) { 
       arr[i] = i; 
      } 
      var inputVal = document.getElementsByTagName('input')[0].value; 
      var varX = 0; 
      var secret = 'click'; 
      for (var i2 = 0; i2 < 256; i2++) { 
       varX = (varX + arr[i2] + secret.charCodeAt(i2 % 5)) % 256; 
       arr[i2] ^= arr[varX]; 
       arr[varX] ^= arr[i2]; 
       arr[i2] ^= arr[varX]; 
      } 
      var idx = varX = 0; 
      var cmpStr = ''; 
      var key = 'input128'; 
      for (var i3 = idx; i3 < key.length; i3 += 1) { 
       idx = (idx + 1) % 256; 
       varX = (varX + arr[idx]) % 256; 
       arr[idx] ^= arr[varX]; 
       arr[varX] ^= arr[idx]; 
       arr[idx] ^= arr[varX]; 

       var hex2int = key.charCodeAt(i3); 
       var charCode = hex2int^arr[(arr[idx] + arr[varX]) % 256]; 

       var hexCharCode = charCode.toString(16); 
       if (hexCharCode.length == 1) hexCharCode = '0' + hexCharCode; 

       cmpStr += hexCharCode; 
      } 
      alert('code is ' + cmpStr); 
      var selectedOption = cmpStr.charCodeAt(cmpStr.charCodeAt(0) % cmpStr.length) % 6; 

      if (cmpStr != key && selectedOption == 2) selectedOption++; 
      optionsArr[selectedOption](); 
     }; 
     var btn = document.getElementsByTagName('button')[0]; 
     if (typeof(btn.addEventListener) != typeof(mainFunction)) { 
      btn.attachEvent('onclick', mainFunction); 
     } else { 
      btn.addEventListener('click', mainFunction, true); 
     } 
     btn = document.getElementById('urchin'); 
     btn.parentNode.removeChild(btn); 
    })(); 
</script> 

か野獣それはまた、あなたがここにツールを求めることはできません

Password: <input/><br/> 
<button>Check</button> 
<script id="urchin"> 
    (function() { 
     var optionsArr = [ 
      function() { 
       console.warn("boo") 
      }, 
      function() { 
       console.warn(":(") 
      }, 
      function() { 
       console.log("Congratz!") 
      }, 
      function() { 
       console.warn("allmost there") 
      }, 
      function() { 
       console.warn("muhaha") 
      }, 
      function() { 
       console.warn("nahhh") 
      }, 
      function() { 
       console.warn("not even close") 
      } 
     ]; 

     function decryptFunc(inputVal, arr) { 
      var idx = 0, idx2 = 0; 
      var decrypt = ''; 
      for (var i4 = idx; i4 < inputVal.length; i4 += 2) { 
       idx = (idx + 1) % 256; 
       idx2 = (idx2 + arr[idx]) % 256; 
       arr[idx] ^= arr[idx2]; 
       arr[idx2] ^= arr[idx]; 
       arr[idx] ^= arr[idx2]; 
       var curHex = inputVal.substr(i4, 2); 
       var hex2int = parseInt(curHex, 16); 
       var charCode = hex2int^arr[(arr[idx] + arr[idx2]) % 256]; 
       decrypt += String.fromCharCode(charCode); 
      } 
      return decrypt; 
     } 

     var mainFunction = function() { 
      var arr = []; 
      for (var i = 0; i < 256; i++) { 
       arr[i] = i; 
      } 
      var inputVal = document.getElementsByTagName('input')[0].value; 
      var i2 = 0; 
      var secret = 'click'; 
      var originalKey = 'input128'; 

      for (var i3 = 0; i3 < 256; i3++) { 
       i2 = (i2 + arr[i3] + secret.charCodeAt(i3 % 5)) % 256; 
       arr[i3] ^= arr[i2]; 
       arr[i2] ^= arr[i3]; 
       arr[i3] ^= arr[i2]; 
      } 

      var decrypt = null; 
      var codeFound = false; 
      var s = ''; 
      var idx = 1; 
      while (!codeFound) { 
       for (var h = 0; h < 256; h++) { 
        var hexLetter = h.toString(16); 
        var cmpKey = s + hexLetter; 
        decrypt = decryptFunc(cmpKey, arr); 
        // restore arr 
        arr = [99, 116, 115, 37, 16, 120, 211, 90, 197, 22, 166, 63, 146, 59, 123, 237, 93, 44, 76, 118, 168, 91, 55, 187, 62, 220, 135, 49, 127, 185, 153, 8, 66, 155, 152, 181, 117, 149, 31, 87, 169, 6, 172, 34, 101, 134, 107, 157, 199, 231, 124, 2, 243, 35, 241, 139, 68, 3, 159, 86, 77, 225, 105, 29, 144, 19, 32, 42, 227, 147, 133, 15, 160, 73, 190, 148, 82, 97, 170, 201, 212, 14, 18, 13, 193, 121, 143, 141, 182, 122, 21, 108, 112, 111, 217, 60, 250, 27, 137, 244, 191, 38, 171, 214, 248, 132, 228, 43, 232, 213, 223, 129, 28, 64, 247, 205, 138, 95, 202, 235, 61, 119, 224, 88, 238, 206, 230, 94, 195, 5, 179, 54, 72, 92, 136, 98, 188, 200, 173, 226, 198, 4, 71, 196, 126, 9, 69, 110, 84, 48, 85, 210, 30, 180, 229, 216, 162, 56, 75, 0, 67, 253, 163, 167, 53, 26, 7, 12, 174, 57, 130, 194, 209, 165, 1, 140, 183, 70, 23, 89, 150, 25, 145, 104, 233, 74, 142, 151, 222, 65, 207, 96, 154, 218, 106, 131, 255, 109, 254, 33, 113, 164, 203, 40, 246, 83, 192, 236, 189, 78, 158, 234, 177, 175, 161, 251, 100, 221, 219, 103, 50, 41, 242, 10, 249, 240, 20, 184, 24, 80, 52, 51, 81, 11, 156, 245, 114, 239, 186, 125, 17, 204, 128, 47, 36, 39, 215, 208, 46, 176, 178, 58, 45, 102, 252, 79]; 
        if (decrypt == originalKey.substr(0, idx)) { 
         console.log(cmpKey, decrypt); 
         if (hexLetter.length == 1) hexLetter = '0' + hexLetter; // zero padding to convert to hex 
         s += hexLetter; 
         idx++; 
         break; 
        } 
       } 
       if (decrypt == originalKey) { 
        codeFound = true; 
        console.log('code is', s); 
       } 
      } 

      var selectedOption = decrypt.charCodeAt(decrypt.charCodeAt(0) % decrypt.length) % 6; 
      if (decrypt != originalKey && selectedOption == 2) selectedOption++; 
      optionsArr[selectedOption](); 
     }; 
     var btn = document.getElementsByTagName('button')[0]; 
     if (typeof(btn.addEventListener) != typeof(mainFunction)) { 
      btn.attachEvent('onclick', mainFunction); 
     } else { 
      btn.addEventListener('click', mainFunction, true); 
     } 
     btn = document.getElementById('urchin'); 
     btn.parentNode.removeChild(btn); 
    })(); 
</script> 
0

は私にRC4ように見えます。この実装を除いて、何らかの理由でキーをわずか5文字に制限します。

+0

あなたはそのことをどのように説明しましたか? – IddoE

+0

以前に実装していたので、見たときに認識しました –

関連する問題