专栏/Python爬虫 - 猿人学爬虫刷题第五题详解

Python爬虫 - 猿人学爬虫刷题第五题详解

2021年03月23日 09:07--浏览 · --喜欢 · --评论
粉丝:1文章:6

题目地址:http://match.yuanrenxue.com/match/5


这题和cookie有关,那么依旧使用浏览器的无痕模式打开,并先选中【Preserve log】
查看其接口的请求内容

可以看到cookie有m参数和RM4hZBv0dDon443M参数两个加密参数,已经查询参数m和f,看起来有点像两个时间戳
首先从识别度比较高的RM4hZBv0dDon443M参数开始,在全局中搜索RM4hZBv0dDon443M参数,这里就不贴图了,因为发现啥也么有
那么此时比较值得分析的就是主页,格式化一下代码


这里可以发现有一段混淆的代码,复制出来使用之前用过的ob混淆专解测试版V0.1进行反混淆

这里就和第一题有点像,代码是在eval函数里面的,此时我们就要拿到解密后的代码,在三个eval前面都点一下,饭后刷新页面



此时成功断下,如果不行的话就重新开一个无痕模式重复上面步骤
然后在控制台分别输入【eval["toString"]()】和【$_zw["length"]】



可以得出函数最后运行的是这段代码,然后在控制台输入



此时可以得到解密后的js代码,复制出来格式化一下



此时就可以搜索到我们需要的RM4hZBv0dDon443M变量
这里网站给我们留下了一条路,我们发现在控制台会不断的打印【世上无难事,只要肯放弃】
而在我们解密后的js中也可以搜索到这段字符串,也就是说这段字符串是在我们解密后的代码里面执行打印的,此时只要点击右边的链接就可以进入到代码块了

找到我们需要的RM4hZBv0dDon443M变量,然后设置断点,并刷新,就可以成功断下


此时我们看到【_$8K['_$ss']】还是【undefined】,那么就继续执行,直到不为【undefined】的时候,此时RM4hZBv0dDon443M的值已经加密完成
此时我们在代码中搜索【_$ss】的话,又是啥也没有搜索到,那就转为搜索【_$8K[】,发现有61个结果,还行,不算很多,都过一遍,查找可能与【_$ss】有关的,跳过赋值的操作,只看被赋值的操作


可以找到1207行就是【_$8K['_$ss']】被赋值的操作,继续下断点,然后刷新


再次断下后可以看到【_$8K['_$ss']】是前面加密的结果,加密的算法使用的是AES/ECB/Pkcs7,,然后在控制台输入【_$8K[_$pe('0x6', 'OCbs')].toString()】来获取加解密的key

再次断下后可以看到【_$8K['_$ss']】是前面加密的结果,加密的算法使用的是AES/ECB/Pkcs7,,然后在控制台输入【_$8K[_$pe('0x6', 'OCbs')].toString()】来获取加解密的key

将16进制转换为2进制可以发现是一段字符串,并且像是base64编码的,那么再将它进行base64解码



可以看到最终得到的是一个类似与时间截的东西,经过对比发现其实这就是查询参数中的m参数去掉最后一位
因为AES是对称加密,所以可以用得到的key来看看加密前的内容是什么

from Crypto.Cipher import AES

from Crypto.Util.Padding import unpad

_ss = 'X+B1D1B6iiwDOZVNuWwP3wjJ3DfyVTh1+mvR8dZicNoQ4+tfI4QQ2Qpbe2IU4xXfYQMzGBT5qP4uR6lEUtY8kbmCITQJ7CkIum8vf5VxuEWy6nujLSXDlI/scpSr/J3/TrmXvzYFnqAziOoUBq7hGLXC6RLJhLi1MNyVV3HDKlUkwbFQ/iFusspgWs/tTdZkg1qkg95k5BW+/mgfiZSPNLms5aekP+IdTpdJM3Y2948='

cryptor = AES.new(key='MTYwMzI5MTg1NTU4'.encode(), mode=AES.MODE_ECB)

print(unpad(cryptor.decrypt(base64.b64decode(_ss.encode())), AES.block_size).decode())

# 6e6c4989f57580aa4a1ba51fe6901ed2,788d57895ac6376da4ea4cf54875e6ce,90aa7ce116c6c55311eccc1ddf868adb,90aa7ce116c6c55311eccc1ddf868adb,be4

可以看到是由5段字符串用逗号拼接后组成的,接着搜索【'_$pr'】,看看这些字符串是什么时候被加入进去的

因为【_$8K['_$pr']】是一个数组,那么主要看它的【push】方法,在这个方法的地方都下一个端点,其中可以发现都是调用的b函数


经过对比发现,第一次调用b函数的参数就是查询参数中的f参数,其他三个都是比第一个大的数即可,第五次调用b函数的参数就是查询参数中的m参数

后面发现前面四次和最后一次里面的参数有少许的变化,需要分别修改,分别保存为0501.js和0502.js



此时就可以编写代码来请求接口,加密的部分还是调用nodejs来计算


投诉或建议