来源:自学PHP网 时间:2015-04-17 10:15 作者: 阅读:次
[导读] 3366中任意一个可以和好友PK分数的游戏,如 飞天忍者猫 http: www 3366 com flash 1000168 shtml开始游戏,结束时Tamper数据包:POST数据为:qzversion=0platform=1key=a6eextv1mcf8cdbad982946c560ab2dd29...
3366中任意一个可以和好友PK分数的游戏,如 飞天忍者猫 http://www.3366.com/flash/1000168.shtml
开始游戏,结束时Tamper数据包:
POST数据为:
qzversion=0&platform=1&key=a6eextv1mcf8cdbad982946c560ab2dd29a918e2233be95da272d01116&submit=true&uin=XXXXXX&score=230&act=set&pid=1000168
从内存中提取swf(或直接下载)分析源代码,该swf会加载远端api的一个swf(如果没改名的话叫openservice_as3_v3.swf),再拿回来反编译分析代码。发现有这么一个函数:
private function getFinalKey(param1:String, param2:Number) : String { if (param1) { } if (param1.length == 48) { } if (param2 > 999999999) { return null; } var _loc_3:* = param1; param1 = param1.substr(42, 6); var _loc_4:* = parseInt(param1, 36); var _loc_5:* = _loc_4.toString(35); var _loc_6:* = _loc_5.length; var _loc_7:* = parseInt(param1.substr((param1.length - 1)), 36) % _loc_6; var _loc_8:* = param2.toString(36); var _loc_9:* = _loc_5.substr(0, _loc_7); var _loc_10:* = _loc_5.substr(_loc_7); var _loc_11:* = _loc_7 + 10; var _loc_12:* = _loc_11 + _loc_8.length; var _loc_13:* = MD5.hash(_loc_11.toString() + param2.toString() + _loc_12.toString()); var _loc_14:* = _loc_13.substring(6, 10); var _loc_15:* = [_loc_11.toString(36), _loc_9, _loc_8, _loc_10, _loc_14, _loc_12.toString(36), _loc_3].join(""); return _loc_15; }// end function
这个函数用于生成最后KEY,该函数有2个输入值,一个是得的分数(我们修改这个),然后是一个关键KEY(param1)。
观察:
var _loc_3:* = param1;
和
var _loc_15:* = [_loc_11.toString(36), _loc_9, _loc_8, _loc_10, _loc_14, _loc_12.toString(36), _loc_3].join("");
可以知道这个关键KEY 位于 最终 KEY 的末尾。 通过多次抓包发现 最终KEY的后48位都是不变的。 所以我们试着取 关键KEY 为 最终KEY后48位。
然后我们把关键KEY和想要修改的分数作为参数 执行 这个函数中的算法(可把as代码改成js代码直接在浏览器console里跑)得到最终KEY。然后 tamper 提交。 修改成功。
修复方案:
1. 完善认证算法,不要把关键KEY完整放在最终KEY之内。 2. 关键代码源码混淆。
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com