当前位置: 首页 > news >正文

JS逆向 - spiderdemo T6题(JSVMP喵喵盾、protobuf、css)纯算

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 小结

概要

提示:仅供学习,不得用做商业交易,如有侵权请及时联系

逆向:JS逆向 - spiderdemo T6题(JSVMP喵喵盾、protobuf、css)纯算

URL:aHR0cHM6Ly93d3cuc3BpZGVyZGVtby5jbi9hdXRoZW50aWNhdGlvbi9qc3ZtcF9jaGFsbGVuZ2UvP2NoYWxsZW5nZV90eXBlPWpzdm1wX2NoYWxsZW5nZQ==

在这里插入图片描述

整体架构流程

提示:分析加密参数

1、首先打开F12观察发包情况:

在这里插入图片描述
在这里插入图片描述

2、根据题目的提示,我们可以知道表单数据和响应数据看到是protobuf处理了的,观察一下启动器(堆栈),看看有没有什么线索

在这里插入图片描述

3、好家伙,就这个混淆(vmp),单步调试都调试不了,很多小伙伴这个时候想放弃了,或者想着去补环境了,这里只能说补环境更难,喵喵盾的检测不是一般的恶心

4、这个时候,看看断XHR有没有什么线索吧!

在这里插入图片描述

5、我们把这些数组的对象展开看看,有没有什么线索吧:

在这里插入图片描述
在这里插入图片描述

6、根据上面我们可以看到:body提交的是一个Uint8Array的长度位512的数据,还可以看到:

{"pageNumber": 1,"challengeType": "jsvmp_challenge","authToken": "Rs60Gllw8rYyfk7K1FaGprH/+x8diToyss47uH4e6hucr6nCZ2WOn284AYzIb7muwsUR+tC3+5VczL1XnTNPSCmF88iGPDqt+1Av6Z2bW8504so776l29hCzW50nnpyH/RCejyaA9iWnurNEoqEIU6bPafGAWHSSIhdH38UTeuA=","timestamp": 1761202259,"fingerprint": {"userAgent": "aKKzVH4pI/OPdZRgyLibDBzCrfbH4cBI1HRyzuVCIP/jyP6F6W8eSrG6gwRzsqZZ6sib21K8rYMdnOjdtNUY7yVhzF5wv4vyQ0TQ1LH6v4i3/EGPNewQ1KFbub02bkfvqTeXeQx9doFpBjbGEl1rYtHbHas33+n7n8Ka1CaKnPI=","language": "zh-CN","screenResolution": "1536x864","colorDepth": "24","timezoneOffset": -480,"cookiesEnabled": true,"plugins": "PDF Viewer, Chrome PDF Viewer, Chromium PDF Viewer, Microsoft Edge PDF Viewer, WebKit built-in PDF","sessionStorage": true,"javaEnabled": false}
}

7、看到这里是不是很眼熟了,刚刚我们表单的数据是不是也有这些呢我们,这时候我们直接跳过断点,看看刚刚请求的表单:

在这里插入图片描述

8、好家伙,大致是差不多的,回到刚刚的那个Uint8Array的长度位512,我们直接给它转换一下,通过String.fromCharCode

在这里插入图片描述

9、其实就是一致的,那么我们知道它是一个protobuf,是不是可以通过这个Uint8Array的长度位512去给它返回序列化一下呢:blackboxprotobuf 我们
可以py里面的序列化库给它解析一下

10、这里推荐大家去看一下万方的protobuf文章,序列化结果

在这里插入图片描述

import blackboxprotobuf
from loguru import logger# 前5位是空格及长度
# Uint8Array的长度位512 body  
array = [0,0,0,1,251,8,1,18,15,106,115,118,109,112,95,99,104,97,108,108,101,110,103,101,26,172,1,82,81,50,117,79,111,101,66,69,83,120,114,48,48,100,102,77,116,88,76,89,89,53,74,84,111,57,120,105,118,90,101,113,119,52,81,110,116,70,67,77,109,52,79,56,97,73,48,67,56,119,103,51,72,51,73,114,101,104,55,47,118,43,50,52,80,43,104,68,65,79,54,97,119,115,120,114,108,83,53,109,114,66,86,104,49,67,48,112,115,114,85,114,89,120,80,117,67,68,111,52,76,101,100,109,118,72,48,111,50,122,80,48,103,67,52,53,49,79,75,68,50,73,117,117,76,87,74,51,51,105,55,73,108,119,67,117,90,89,50,49,82,54,67,52,55,84,48,80,122,90,114,115,121,51,116,106,71,80,114,54,75,97,113,115,84,74,87,43,114,111,61,32,165,172,231,199,6,42,176,2,10,172,1,67,97,106,115,109,84,101,51,102,80,70,71,106,120,71,49,110,90,76,72,86,70,112,117,68,86,74,52,74,104,121,81,80,88,81,118,111,109,67,117,89,105,80,88,57,111,48,66,71,75,57,48,47,101,110,114,112,52,71,68,56,97,110,100,111,55,115,101,85,85,98,107,56,122,54,108,67,113,85,69,101,69,53,114,99,80,101,109,76,57,83,80,90,55,108,86,76,109,65,110,86,112,78,114,116,54,98,52,66,54,118,72,100,57,115,74,90,121,112,103,71,109,85,66,66,68,43,115,80,116,43,69,103,79,77,100,112,114,115,117,79,73,79,120,106,113,79,80,103,90,70,103,122,109,43,114,87,54,56,103,121,103,102,72,73,99,105,75,122,83,56,61,18,5,122,104,45,67,78,26,8,49,53,51,54,120,56,54,52,34,2,50,52,40,32,48,1,58,98,80,68,70,32,86,105,101,119,101,114,44,32,67,104,114,111,109,101,32,80,68,70,32,86,105,101,119,101,114,44,32,67,104,114,111,109,105,117,109,32,80,68,70,32,86,105,101,119,101,114,44,32,77,105,99,114,111,115,111,102,116,32,69,100,103,101,32,80,68,70,32,86,105,101,119,101,114,44,32,87,101,98,75,105,116,32,98,117,105,108,116,45,105,110,32,80,68,70,64,1,72,0]
# 解析protobuf数据
original_data, message_type = blackboxprotobuf.decode_message(bytes(array[5:]))
logger.info(f'序列化结果==>>{original_data}')
logger.info(f'序列化类型==>>{message_type}')

11、观察序列化之后的那个结果,我们分析分析那些是需要加密处理的:

在这里插入图片描述

12、所以我们只需要知道那俩个加密值是怎么来的,先去判断一下长度吧:

在这里插入图片描述

13、打印发现是一个172位的大小写和数字的字符串,大概率是RSA了,因为RSA也有这个特征,直接全局搜索encrypt和setPublicKey

在这里插入图片描述
在这里插入图片描述

14、您猜怎么着,还真断住了,我的哥,继续走,看看加密情况:

在这里插入图片描述

15、这里可以看到这个t有点像base64的值,直接atob试试:

在这里插入图片描述

16、破案了,就是RSA了,第一个密文我们拿到了,就是说:
'1761204227_jsvmp_secret_key_2024’进行base64再RSA,继续看下一个

在这里插入图片描述

17、这里我们可以看上图,另外一个加密的东西其实就是User-Agent前面一段进行RSA加密,继续看XHR发包的时候是不是刚刚生成的那俩个值

在这里插入图片描述

18、破案了,兄弟们!!!接下来就是组装protobuf进行请求了

技术名词解释

提示:protobuf请求

1、根据刚开始我们不是解密拿到Uint8Array的长度位512 body的序列化数据嘛,我们直接构造一个一样的,只不过时间戳和那俩个加密的东西得换一换了:

now_ = int(time.time())
auth_token = self.rsa_encrypt(base64.b64encode(f'{now_}_jsvmp_secret_key_2024'.encode('utf-8')).decode('utf-8'))
ua = self.rsa_encrypt("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)")
original_data = {'1': page,'2': b'jsvmp_challenge','3': auth_token.encode(),'4': now_,'5': {'1': ua.encode(),'2': b'zh-CN','3': b'1536x864','4': b'24','5': 32,'6': 1,'7': b"PDF Viewer, Chrome PDF Viewer, Chromium PDF Viewer, Microsoft Edge PDF Viewer, WebKit built-in PDF",'8': 1,'9': 0}
}
form_data = bytes(blackboxprotobuf.encode_message(original_data,message_type))
response = requests.post(url, headers=self.headers, cookies=self.cookies, params=params, data=bytes([0, 0, 0, 1, 251]) + form_data)

提示:message_type这个类型结构,得拿到刚刚我们解Uint8Array的长度位512 body的message_type,[0, 0, 0, 1, 251]前面得加空格

2、我们发送请求,会发现得到的也是一个protobuf数据:

在这里插入图片描述

3、这里其实解法还是一样的:直接通过binascii.hexlify转换成16进制,然后从第10位开始取,因为前面10位都是空的

在这里插入图片描述
在这里插入图片描述

4、从上面我们可以观察到,响应还有一层CSS的反爬,因为数值都是缺数的,这个6里面放的是一个html,7里面则是一个base64的值,应该是用来还原的,先解一下看看:

6:"8<span class='context_kw0'></span>35 51<span class='context_kw1'></span>2 24<span class='context_kw2'></span>5 2<span class='context_kw3'></span>04 305<span class='context_kw4'></span> 4<span class='context_kw5'></span>79 969<span class='context_kw6'></span> 489<span class='context_kw7'></span> 752<span class='context_kw8'></span> 292<span class='context_kw9'></span>"
7:'58,61,55,61,58,50,59,54,58,58'
我们需要得到的内容:8835 5192 2435 2904 3058 4079 9697 4894 7528 2928

5、观察上面,我们其实可以看出每一个相当于一个未知数,可以替换一下看看:

在这里插入图片描述

6、然后我们再结合刚刚那几个东西对比一下:

['8_35', '51_2', '24_5', '2_04', '305_', '4_79', '969_', '489_', '752_', '292_']
'58,61,55,61,58,50,59,54,58,58'
8835 5192 2435 2904 3058 4079 9697 4894 7528 2928
  • 8_35 里面差一个 8 对应58
  • 51_2 里面差一个 9 对应61
  • 24_5 里面差一个 3 对应55
  • 2_04 里面差一个 9 对应61

当 58 - 8 = 50,58是不是偶数
当 61 - 9 = 52,61是不是奇数
当 55 - 3 = 52,55是不是奇数

所以就是当前解密数组里面的值如果是偶数:解密数组里面的值 - 50
当前解密数组里面的值如果是奇数:解密数组里面的值 - 52

html = response_data['6']
for i in range(10):html = html.replace(f"<span class='context_kw{i}'></span>",'_')
html_list = html.split(' ')
jiem = base64.b64decode((response_data['7']).encode('utf-8')).decode('utf-8')
jiem = jiem.split(',')
numbers = [int(html_list[i].replace('_',f'{int(jiem[i]) - 50}')) if int(jiem[i]) % 2 == 0 else int(html_list[i].replace('_',f'{int(jiem[i]) - 52}')) for i in range(len(jiem))]

在这里插入图片描述

小结

提示:学习交流主页,星球持续更新中:(+星球主页+v)

http://www.dtcms.com/a/521107.html

相关文章:

  • 做怎样的企业网站480元做网站
  • 佛山做外贸网站开发一个电商网站
  • 我的世界做mc壁纸的网站网站建设背景是什么
  • MySQL Galera Cluster部署如何实现负载均衡和高可用
  • 唐山哪个公司做网站wordpress 新增页面
  • Cursor:GIT版本控制
  • 怎么把服务器做网站优秀网站设计 pdf
  • express框架 获取请求体数据
  • 用Python轻松提取视频音频并去除静音片段
  • 常德网站公司百度快速排名软件原理
  • 在blender中安装vtk插件
  • 河南做网站的费用做网站需要准备什么资料
  • 我国成功研制新型芯片:以更贴近人类直觉的计算方式,显著提升了计算效率并大幅降低能耗
  • 高级软考-系统架构设计师知识点3
  • 算法练习:前缀和专题
  • 网站建设与运营就业品牌推广与传播方案
  • 赣州网站建设哪家好加强网站建设的意义
  • 中国城市建设控股集团有限公司网站网站优化试卷
  • 网站建设框架模板下载网站运营一个月多少钱
  • 临漳企业做网站推广做中东服装有什么网站
  • 模块化有什么好处?
  • 算法训练.17
  • ESD整改实战手册:4 大核心措施(含 8kV/15kV 案例)+ 阿赛姆电子一站式方案助过测
  • 建站网络建立科技开发建筑工程资质合作
  • 建设信用卡银行商城网站学物联网工程后悔死了
  • Truffle 合约编译与部署:从.sol 文件到上链全流程
  • 石家庄网站建设求职简历wordpress 前台英文
  • 山东省建设管理中心网站做企业网站需要注意哪些
  • 《信息系统项目管理师》案例分析题及解析模拟题4
  • 摄像网站建设个人网站的设计流程