声明
此帖仅为记录我的逆向学习,过程文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于非法用途,否则由此产生的一切后果均与作者无关!
RS4特征介绍
这里我们已经确定此网址为RS4 关于RS4的一些细节特征 可以移步其他帖子 我们这里只做简单介绍
我们可以看到 在cookie参数中 有T结尾和S结尾的两个参数 其中S结尾的参数为服务器返回 T参数为js生成 其中还有经典debugger
cookie定位
我们已经清楚 T结尾 4开头的cookie值为js生成 接下来就是找到cookie生成的入口函数 这里我们使用hook来进行定位
(function (){
'use strict'
var _cookie = ""
Object.defineProperty(document, 'cookie',{
set:function (val){
console.log('cookie set->',new Date().getTime(),val);
debugger;
_cookie = val
return val
},
get: function (){
return _cookie
}
})
})()
我们点击打开Script断点 此时运行我们的hook脚本 或者这边使用插件 都是可以的 运行成功放开断点 我们发现值已经被断住了
我们往上跟栈发现 这个函数是没有传入参数的 但是却跟到这里了 不出意外cookie的生成地址就是这里了
这里 (5)位置 为假cookie生成 (768,1)为真cookie生成 这里我们是补环境全扣拿最后的cookie就好 不用在意这个问题 我们可以看到这个文件为vm 继续跟栈找到call位置
这里我们来到这个文件 可以发现 整个文件有三部分
分别是content标签 外链js 和一个自执行函数部分 在自执行函数部分 我们看到了call 其中 外链js中的代码将会被自执行函数还原并且执行为正常的vm文件 而content也会在生成cookie的时候用到 所以我们这边全扣 并且做一下小小更改 其中meta 标签的 content 内容是变化的 外链js在不同页面也会改变 自执行函数是动态变量名 整体逻辑是不变的
我们既然是补环境 本地准备一份 全扣下来 然后还要做一些更改 此时我们把代码放在浏览器运行 发现可以正常出值
补环境
接下来就是补环境 我们挂上代理开冲
// proxy代理输出日志
function get_enviroment(proxy_array) {
for(var i=0; i<proxy_array.length; i++){
handler = '{\n' +
' get: function(target, property, receiver) {\n' +
' console.log("方法:", "get ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return target[property];\n' +
' },\n' +
' set: function(target, property, value, receiver) {\n' +
' console.log("方法:", "set ", "对象:", ' +
'"' + proxy_array[i] + '" ,' +
'" 属性:", property, ' +
'" 属性类型:", ' + 'typeof property, ' +
// '" 属性值:", ' + 'target[property], ' +
'" 属性值类型:", typeof target[property]);\n' +
' return Reflect.set(...arguments);\n' +
' }\n' +
'}'
eval("tr"+"y"+"{\n" + proxy_array[i] + ';\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}catch (e) {\n' + proxy_array[i] + '={};\n'
+ proxy_array[i] + '=new Proxy(' + proxy_array[i] + ', ' + handler + ')}')
}
}
proxy_array = ['window','document','navigator','location']
get_enviroment(proxy_array)
这里我们拿出几个举例 比如window.top 在真实的浏览器环境中,当一个页面不是嵌套在任何iframe或其他窗口中时,window.top 默认指向自身 所以我们这里直接补
window.top = window;
在我代码中 if (_$2P[_$BI][_$GJ[4]]('r') === 'm')这个地方补完一直报错这个方法未定义 然后我就直接补在原型了
// 此方法不在doument或者window下调用 直接在Object.prototype原型顶部伪造
// 其下所有原型都会存在这个方法
Object.prototype.getAttribute = function (val) {
if (val === 'r') {
return 'm'
}
}
正常修修补补 不认识的方法去文档看 看完浏览器调试 最后终于也是出值了
python部分就不继续了 拜拜