反向javascript破解加密方法算法

逆向工程 混淆 javascript
2021-06-26 08:33:17

这个crackme包含一个屏幕上的文本输入元素和一个验证按钮

您输入的值设置为_inputValue,事后你点击一个按钮,功能执行,在最后几行,如果selectedOption是2,将打印“Congratz”,否则有在5个不良选项optionsArr

拆包清洗后的主要功能是:

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;
//            for (var i2 = 0; i2 < 256; i2++) {
//                var secret = 'click';
//                varX = (varX + arr[i2] + secret.charCodeAt(i2 % 5)) % 256;
//                arr[i2] ^= arr[varX];
//                arr[varX] ^= arr[i2];
//                arr[i2] ^= arr[varX];
//            }
            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];
            var idx = varX = 0;
            var cmpStr = '';
            for (var i3 = idx; i3 < inputVal.length; i3 += 2) {
                idx = (idx + 1) % 256;
                varX = (varX + arr[idx]) % 256;
                arr[idx] ^= arr[varX];
                arr[varX] ^= arr[idx];
                arr[idx] ^= arr[varX];
                var curHex = inputVal.substr(i3, 2);
                var hex2int = parseInt(curHex, 16);
                var charCode = hex2int ^ arr[(arr[idx] + arr[varX]) % 256];
                cmpStr += String.fromCharCode(charCode);
            }
            var selectedOption = cmpStr.charCodeAt(cmpStr.charCodeAt(0) % cmpStr.length) % 6;

            if (cmpStr != 'input128' && 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>

我了解解密后的输入需要为“input128”,如何反转加密“input128”的过程?

  • 顺便说一句,它使用 rc4 加密
2个回答

为了扩展EWD-0-关于 RC4 的可逆性,我尝试了以下方法:

从您的实际代码并稍微反转它以获得“input128”编码:

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];
var idx = varX = 0;
var cmpStr = '';
for (var i3 = idx; i3 < 'input128'.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 = 'input128'.charCodeAt(i3);
  var charCode = hex2int ^ arr[(arr[idx] + arr[varX]) % 256];

  cmpStr += charCode.toString(16)+" ";
}
console.log(cmpStr);

循环中的主要区别是按 1 步按字符运行,并将每个字符代码与相应的键值进行异或。然后将其编码为十六进制,因为您的原始代码确实读取了十六进制值(按步骤 2 运行的循环)以获取字符代码(curHexthen hex2int)。

这给了我: 95 69 18 b1 82 8 c1 59

您只需要0在第 6 个条目中添加 a并删除要填充的空格inputValue,您就会在cmpStr.

RC4 是一种对称密钥算法。所以给“input128”作为你的输入。然后调试代码以查看在“input128”上应用算法后生成的内容。那将是您必须提供的原始输入。

对称密钥算法:

明文 + 密钥 = 密文

密文+密钥=明文