腾讯滑块(1-13,js逆向)

前言:之前打算写的猿人学比赛题系列因为种种原因耽搁了,主要还是比完赛之后热情就少了很多,看到评论区有人说做了这么久才做出一题,这里需要狡辩一下,我虽然菜但是还没到那种地步,比赛两天时间里我跟队友是做了七题的,等以后有时间再更猿人学比赛题吧,先看tx的

url:aHR0cHM6Ly9zc2wuY2FwdGNoYS5xcS5jb20vdGVtcGxhdGUvcGNfcXFfY2FwdGNoYS5odG1sP2FpZD0yMDI4NjY1NzI0
参考文章: 
1、https://www.52pojie.cn/thread-1521480-1-1.html
2、https://mp.weixin.qq.com/s/C8gB-D6EUliPXoMgjk0Bag
3、https://mp.weixin.qq.com/s/EmwuL3ToKwDFwCILZTM1AQ
4、https://blog.csdn.net/weixin_43411585/article/details/123810961
建议把这四篇都看一下,写得很好,要学会站在巨人的肩膀上

1、找插桩点(10处地方)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、分析日志
a.通过回溯追踪得到大致方向
先拉到日志的最后可以看到这个
在这里插入图片描述
这种操作一共有四处,就是说有四段明文经过加密之后得到四个密文,最后把密文拼接就是最终的collect了,明文部分先按下不表,来分析明文是怎么通过一系列操作得到密文的
b.多的不说,开肝!
在上一张截图的地方往上看一下
在这里插入图片描述

可以看到那一串看着像乱码的东西是四个数字经过String.fromCharCode得到,然后再逐个拼接的,并且这里也可以得到这四个数字的由来
在这里插入图片描述
那么再往上走,看下8591073566是怎么来的
从这里开始多加个插桩点,这个插桩点伺机而停,不然控制台会崩
在这里插入图片描述
这时候就会出现,根本找不到这个数字由来的算法,再往上倒推开始异常困难了,十几万行日志根本遭不住,换个思路,找到明文然后往下推,上文提到的四处明文,发现开头一直都是{“cd”:,那就全局搜他
在这里插入图片描述
很明显{–>123,"–>34,是经过charCodeAt得到,结合看到的<< 0、8、16、24,可以得到算法
在这里插入图片描述
并且可以在当前日志往下看个十几行发现也有这种操作,很明显这是两个四位字符串为一组去做加密的
在这里插入图片描述
这两个四位字符串最终得到的两个数字分别是1684218491、844839458,接下来就是tx的难点xtea算法了,这里建议先找个tea算法了解个大概,对一些符号运算混个眼熟,然后再看下面的日志

现在开始解剖tea,这里开始先对num2(844839458)进行了操作

 844839458 '<<' [4] 'result is' 632529440
 844839458 '>>>' [5] 'result is' 26401233
 632529440 '^' [26401233] 'result is' 606174193
 606174193 '+' [844839458] 'result is' 1451013651
 得到左边的算法-->((num2 << 4) ^ (num2 >>> 5)) + num2)

将上面得到的数字与key亦或后再累加num1(1684218491)就得到第一轮的num1了
在这里插入图片描述
通过上面两张图的分析可以得到

//这里的sum初始值为0
num1 += (((num2 << 4) ^ (num2 >>> 5)) + num2) ^ (sum + key[sum & 3]);

接着分析,这里出现了一下关键数字delta–>2654435769,就是通过这个数字确定xtea算法的
在这里插入图片描述
由上面这张图可以得到

 sum += delta;
 num2 += (((num1 << 4) ^ (num1 >>> 5)) + num1) ^ (sum + key[(sum >>> 11) & 3]);

这时候大致的算法已经出来了,然后再耐心的往下翻翻日志,会发现他一直在循环这个操作,直至明文取完(还会补位空字符)

function teaEncryptBlock(num_lis) {
    var num1 = num_lis[0];
    var num2 = num_lis[1];
    var sum = 0;
    key = [1466852942, 1768312662, 1715955288, 1498245202];
    var delta = 2654435769;
    for (var i = 0; i < 32; i++) {
        num1 += (((num2 << 4) ^ (num2 >>> 5)) + num2) ^ (sum + key[sum & 3]);
        sum += delta;
        num2 += (((num1 << 4) ^ (num1 >>> 5)) + num1) ^ (sum + key[(sum >>> 11) & 3]);
    }
    return [num1, num2];
}

到这里可能大家会迷糊,我画个图就很好理解了
在这里插入图片描述
在这里插入图片描述
至此加密部分已经完成了,接下来讲讲明文
3、明文顺序
先来看看明文长什么样,atr2和atr4都是轨迹,其他文章常说的tx38位数组其实就是atr1+atr3+atr4拼接而成的
在这里插入图片描述
通过多次调试会发现,这38位数组每次的顺序都不一样,这里很遗憾的说下,对于作者而言tx滑块没办法做到真正意义上的纯算,我这里的处理方式是先让这个js跑起来,然后通过正则在js里添加点内容最后返回明文再对明文做点处理最后走算法
(1)如何让js跑起来,可以选择jsdom,或者补一些简易的环境,先保证能正常出结果
(2)对js进行改造,在下载这个js时,通过正则找到这处地方,然后加上以下代码,这时候list_数组会不断有明文push进来
在这里插入图片描述
然后再对list_进行去重、筛选,就会得到明文了
在这里插入图片描述
(3)我都补环境了为啥还要搞算法,不多此一举嘛,此言差矣,注意我上面说的是补一些简易的环境,tx有非常多的dom操作补起来会很麻烦,所以你在补这个简易环境的时候,只有一个宗旨就是不报错就行,别管补得对不对,最后我们拿到明文后,只需要去拿一组浏览器正确的明文跟自己生成的对比、替换即可

至此整个腾讯滑块的流程就分析完了,本来还想把支付的encrypt_msg也讲一下的,发现已经4000多字,累了累了下次有机会再说吧,拜拜~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值