1.前言
很久前,遇到某游戏的周年活动,通过技术手段通关,记录过程与大家分享。
2.尝试篡改分数
进入小游戏,移动貔貅,捡铜钱,则加分,捡到炮仗,则直接结束游戏。需要捡到168个铜钱,即可兑换周年宠物。
开始我觉得前端的游戏,一般分数都是通过前端直接传给后端,然后后端进行加分。于是抓包,如下:
POST /wd/202203/pet/gameReport HTTP/1.1
Host: acts.*.com
Content-Type: application/x-www-form-urlencoded
Origin: https://acts.*.com
Accept-Encoding: gzip, deflate
Cookie: *
Connection: close
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 15_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Mobile/15E148 Safari/604.1
Content-Length: 85
Accept-Language: zh-CN,zh-Hans;q=0.9
coinIdx=QPvglyps3bJDRXQE%2BqR5kQ%3D%3D&coinLetter=GNuY4EJleNpfISwZOIdyjQ%3D%3D&type=2
前端传入了coinIdx和coinLetter,而且是AES+BASE64加密的,而AES对称加密,密钥前端必然会有一份,于是搜索decrypt找到解密函数:
然后找到密钥和偏移量,如下:
整活儿,解密看看:
coinLetter:
coinIdx:
仿佛是某种对应关系,和我最初想象的直接传入分数是不一样的。那么可能是传入了捡到的铜钱,然后我曾尝试过只修改coinIdx(因为简单,都是数字),直接数据失效。
所以coinIdx和coinLetter应该是有某种对应关系。
3.尝试寻找对应关系
如果coinIdx和coinLetter有对应关系,那么这个对应关系必然会发送到前端,查看了前后数据包,发现有个请求gameData的数据包,如下:
尝试解密drops,如下:
不太清楚用途,然后在前端搜了一下请求这个接口的js:
好像没啥用处,往下看:
然后在另一处JS中,找到了调用:
然后看到是idList,此时想到刚才解密以后的gameData应该是直接转化成了数组,并且,coinIdx是数组的索引,coinLetter是具体的值。为了验证。
确实如我所料,索引为0的是8,索引为1的是L。知道了此规律以后,进行自动化。
4.漏洞利用及自动化
第一步,点击开始游戏。
然后抓取数据包,把gameData解密。
将解密后的data放入脚本,因为168个金币即可兑换,所以我们直接选择len判断为168时,退出:
将索引和letter加密回去,修改gameReport包。
然后,奖励到手。
原文始发于微信公众号(川云安全团队):涨姿势!黑客原来是这么玩游戏的
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论