*声明:*请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇巧合,纯属意外。
0x01 前言
最近在整理清理电脑文件的时候,看到大一自己做的一款c语言飞机大战。那个时候还不怎么懂安全,传输给服务器端的数据没有加密,于是测了测发现很容易就篡改了一些游戏数据(比如伤害、钻石)。第一次这么直接的参与到了外挂,于是来了兴趣,闲暇之余在微信小程序上寻找起了会有这种数据传输的小游戏
0x02 发现目标
搜罗了一圈,基本上都是没有数据传输只在js互动上显现和没有加密的游戏,没有难度。最后逛了半个小时,终于发现目标,存在sign验证。
对于这种游戏类的破解篡改,一般就那么几种思路
1.黑服务器 2.内存挂,windows用CE篡改,一直想写植物大战js挂好久了,可惜还没时间去学。安卓应该是hook。 3.修改本地资源 4.抓包破解
像这种小程序,前三种属于是杀鸡焉用牛刀,而且数据包呈现在面前,从攻防成长的角度,选择去第四种去进行破解无疑是最好的选择。
0x03 逆向
参考我之前的文章 app攻防-小程序反编译
完成逆向工作后查看情况
有分包,而且核心代码在分包中
拜读了一下这个长达16万的代码,最终读了几千就选择了放弃
(这几千大致是讲创建对象,加载模块,完成初始化,然后开始各种模块功能类的编写)
啃臭键+f,开搜之前上传给服务器端的记录接口
找到接口对应逻辑,看到sign加密函数
这句话为引子,慢慢顺藤摸瓜。
跟进sign函数
发现需要wx_appid与wx_secret。但搜遍代码,发现这两个参数是浓墨重彩层层加密。
0x04 sign绕过
1.第一次解密尝试
无奈,开启第一次解密尝试。
查看了对应加密函数
初步观测属于两层加密
编写了一个小html文件看看能否输出
乱码
不出意外的话跟mousedown事件属性相关,但相关继承函数却又跟了更多的外层函数,实在无法继续推演,遂放弃。
2.第二次解密尝试
时隔忙碌于文档的两周,我回来了。
这次我把所有源码解出来想尝试用微信开发者程序去重新编译调试输出一些关键信息。
可惜的是缺少核心app.json,要是能重新恢复的话我估计得把这二十多万行代码看完。(bushi。)
切换角度,尝试恢复核心js,在里面输出些信息。
在经历了漫长的报错调试,终于,皇天不负有心人,爆出了两个secret值
根据传参信息观察,这个uploadrecord相关函数采取的secret值和其他所有上传服务器的函数所采用的校验secret值是不同的
我先尝试对获取时间戳参数的sign值进行复原,看看我阅读的代码逻辑是否正确。
原处和js调试最后输出的值发现一样,有戏,成功复现
接下来复现uploadrecord
根据相关函数编写如下
撰写改编后将sign值进行修改
回显成功
0x05 结果展示
目前只玩了第一关,只有204金币
提交数据包重新加载程序后
成功修改了钻石金币等值!
0x06 总结
1.反编译代码如果完全可以尝试输出调试信息进行编译获取关键信息 2.反编译代码不全可以尝试恢复关键代码进行输出调试 3.没有遇到混淆加密等情况,若涉及到rsa等加密用go去加解密会更清爽自动化一些
原文链接: app小程序攻防-x挂?!记一次艰难的sign绕过
关注公众号: 剑客古月的安全屋
关注我,不迷路,后期将为大家带来更多的sign绕过案例与总结