请选择 进入手机版 | 继续访问电脑版

猿人学题库十九题——css加密-雪碧图/数据干扰等——

[复制链接]
尊悦模具刘沛昌 发表于 2020-12-31 20:22:58 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
猿人学题库十四题——css加密-雪碧图/数据干扰等

 
1.  首先 进入 浏览器的开发者工具,

打开就是 俩个无线debugg,正常的利用过掉
1.  找到 debugg 对应的行数,右击选择 never pause here ,刷新 就不会再此处 停下了

虽然 这样过掉了,但是你会 发现 特别异常的卡,(我猜疑浏览器卡关闭重开,电脑卡了重启发现照旧一样的),
这样根本不好调试 代码,就无法找到 js 的逻辑,(后来发现 虽然用 never pause here过了,但这不是真真的跳过debug了,只是在 debug处 不暂停而已,JS代码照旧在无线执行消耗内存卡的吧,卡的导致无法调试)
以下俩种办理思路:
1.1  中间人攻击 fiddler 自己返回 数据
1.2  浏览器的 Override 工具(这里可以查阅资料看看,有时间我补一篇博客)

2.  中间人攻击 fiddler


先做个测试 对比一下数据:
2.1  fiddler 修改后返回的数据  (这里我已经修改 代码了

2.2  正常请求返回的数据 

可以看到俩个数据是一样的,我改后的html代码没有页数了,这里页数这里不消关注,因为我我们只要看到数据对应上就OK了。
3.  分析 JS 

看到源码的有大堆 JS 看不懂东西,ob肴杂 
(这里我也不知道怎么区别是不是 ob肴杂的,现在只知道这种,看不懂的JS丢进去就好了,增补博客

ob解肴杂后来看下对比,这代码悦目水平大大提升,容易看懂许多
 
         

 
背面我就直接看 解肴杂后的代码了,可以看到许多的方法,但是都是 界说JS方法,我们需要找到 函数执行的地方
1. 函数自执行函数
2. 等候 函数执行 
3. (function(){ })(window)  也是 自执行函数
         
               
 

这一题 就这俩个地方,JS的只执行函数的方式许多,花里胡哨的有些可以看不懂。
然后 把  ajax 请求 返回 success 成功背面 { } 大括号内里 的代码 全部 换成 解肴杂后的代码
在 用浏览器 请求,返回 fiddler 自界说修改后 数据(就是更换 解肴杂JS的Html),请求照旧会断在 无线debug 那边
但是我们 找出了,自执行函数的位置,就提前打断点,在自执行函数 内里 申明的JS方法,然后又自己执行,我们就在这里先打断点

调试 下一个断点 就出现了,开始的那俩个 无线debug ,一直在有个方法里死循环(自己调用自己)


我们可以直接 重写这个 方法的上一个 栈方法 无线死循环的是 _0x1e51f8 我们重写 _0xde23e 函数
(这俩个函数是我静态生存的,每次请求是不一样的,你们要找到你们生存数据的方法)

再次 刷新请求 ,除了断在自己打的断点上,无线debug已经没有了。
你会惊奇的发现,前面提到的 setInterval 定时内里也有这个函数 _0xde23e ,但是重写了就失效了
 
这里有个小问题,感觉上 setInterval的定时函数没有起到作用,我做测试的时候 在重写 _0xde23e 方法的上一层函数 _0x18be96,不重写 _0xde23e 函数,自执行函数的无线debug会过掉,但是 定时函数的_0xde23e方法的无线debug方法没有过掉,但是照旧没有出现。
 
继续分析,
锋利的人 大概会直接略过前面的步调,直接看到 下面这部门代码就知道了,ajax 请求成功后,获取数据,然后通过JS添加到前端显示。
但是 这里有个主意的点,通过JS方法把一些多余干扰的图片隐藏了,否则会把干扰的数据也获取到。

把返回的 info 是HTML字符串,自己新建一个 HTML 可以打开看看
先 测试 一下,把 JS隐藏样式的代码注释掉,把 要隐藏的class打印在控制台检察,
同时 在这里 把 图片的base64编码的字符串 和 对应的 数字,纯手工 copy 到代码的 字典里吧,背面根据 图片找到 对应的 数值

进一步 剖析 隐藏class 的由来,主要有个 btoa 是个win自带的base64编码,js逆向加密中Base64方法替换
然后 其他的 就是 逐步扣JS了,缺什么补什么,
  1. var _0x20c24d = "." + _0x124e6b(btoa(data["key"] + data["value"])["replace"](/=/g, ""));
复制代码
扣完请求后,模仿请求 ,发现 数据照旧不对,数值的位置不对,这里用偏移了,这里植入 css 的知识
position :相对定位,当前元素 和 上一个元素的位置 关系
这里看到 img-number 的宽度是 9px 像素,数值框的 宽度是 69px 像素,(有些大概会遇到偏移出去了)
                    
                   


偏移量  [ 0 , 9 . -9 , 0 ]
数字      [ 1 , 6   1   7 ]
第一个偏移量 0 : 是第一个元素,偏移量照旧0,那就是第一个值了
第二个偏移量 9∶  正常第二个元素对应第一个元素的位置关系为 0,加9的偏移量,那就是是第三个位置了 
第三个偏移量 -9∶ 第三个元素 对应 第二个元素的位置为 0 ,偏移量是 -9  就是往往前面移动,那就是第二个位置了
第四个偏移量 0∶  没有偏移,那就是第四个位置设有厘革
这里 总结一下,四个元素 产生偏移量时,想要四个值都在 他们的 偏移求和 肯定即是 0,如果不即是 那就是 偏移到 外面的框或重叠了。
  1. # 偏移量 逻辑 a = [0.0, 1.0, -1.0, 0.0]b =  [1, 6, 1, 7]tem = b.copy()for index,aa in enumerate(a):    if aa:        if aa>0:            b[index+1] = tem[index]        else:            b[index-1] = tem[index]print(b)# [1, 6, 6, 7]   这就是 需要的效果 1167
复制代码
得到 正确的 数据,下面开始撸代码
4. 撸代码

[code]var encode_version = "sojson.v5",    ubbgr = "__0x8c0ec";var _0x8f754e = 0;var _0x130c55 = "";var _0x690c11 = 8;function _0x4a5ee7(_0x540928, _0x1c68c7, _0x55fb3a, _0xc73c5d, _0x32e9c6, _0x3a61fb, _0x1c075e) {    return _0x4efd4f(_0x55fb3a ^ (_0x1c68c7 | ~_0xc73c5d), _0x540928, _0x1c68c7, _0x32e9c6, _0x3a61fb, _0x1c075e);}function _0x5284de(_0x15415d, _0x4be6fe, _0x245ee5, _0x438931, _0x452339, _0x1f7c91, _0x4ef10f) {    return _0x4efd4f(_0x4be6fe ^ _0x245ee5 ^ _0x438931, _0x15415d, _0x4be6fe, _0x452339, _0x1f7c91, _0x4ef10f);}function _0x1a3ade(_0x5d7666, _0x36a29d, _0x3b74c1, _0x480b22, _0x30475b, _0x1dd9e9, _0x636b5) {    return _0x4efd4f(_0x36a29d & _0x480b22 | _0x3b74c1 & ~_0x480b22, _0x5d7666, _0x36a29d, _0x30475b, _0x1dd9e9, _0x636b5);}function _0x1cb164(_0x16b706, _0xbd8b87) {    return _0x16b706 >> 32 - _0xbd8b87;}function _0x50651a(_0x7b44fe, _0x498d2c) {    var _0x2b4226 = (_0x7b44fe & 65535) + (_0x498d2c & 65535);    var _0x208fba = (_0x7b44fe >> 16) + (_0x498d2c >> 16) + (_0x2b4226 >> 16);    return _0x208fba > 5] |= (_0x3af3a2["charCodeAt"](_0x57f6ed / _0x690c11) & _0x536650) > 5] |= 128 >> 9 > 2] >> _0x2101be % 4 * 8 + 4 & 15) + _0x2c5f6d["charAt"](_0x41002e[_0x2101be >> 2] >> _0x2101be % 4 * 8 & 15);    }    return _0x389ccd;}function _0x124e6b(_0x280199) {    return _0x397d65(_0x5f2dd4(_0x2755cc(_0x280199), _0x280199["length"] * _0x690c11));}var Base64 = {    // private property    _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="    // public method for encoding    , encode: function (input)    {        var output = "";        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;        var i = 0;        input = Base64._utf8_encode(input);        while (i < input.length)        {            chr1 = input.charCodeAt(i++);            chr2 = input.charCodeAt(i++);            chr3 = input.charCodeAt(i++);            enc1 = chr1 >> 2;            enc2 = ((chr1 & 3) > 4);            enc3 = ((chr2 & 15) > 6);            enc4 = chr3 & 63;            if (isNaN(chr2))            {                enc3 = enc4 = 64;            }            else if (isNaN(chr3))            {                enc4 = 64;            }            output = output +                this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +                this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);        } // Whend        return output;    } // End Function encode    // public method for decoding    ,decode: function (input)    {        var output = "";        var chr1, chr2, chr3;        var enc1, enc2, enc3, enc4;        var i = 0;        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");        while (i < input.length)        {            enc1 = this._keyStr.indexOf(input.charAt(i++));            enc2 = this._keyStr.indexOf(input.charAt(i++));            enc3 = this._keyStr.indexOf(input.charAt(i++));            enc4 = this._keyStr.indexOf(input.charAt(i++));            chr1 = (enc1 > 4);            chr2 = ((enc2 & 15) > 2);            chr3 = ((enc3 & 3)  127) && (c < 2048))            {                utftext += String.fromCharCode((c >> 6) | 192);                utftext += String.fromCharCode((c & 63) | 128);            }            else            {                utftext += String.fromCharCode((c >> 12) | 224);                utftext += String.fromCharCode(((c >> 6) & 63) | 128);                utftext += String.fromCharCode((c & 63) | 128);            }        } // Next n        return utftext;    } // End Function _utf8_encode    // private method for UTF-8 decoding    ,_utf8_decode: function (utftext)    {        var string = "";        var i = 0;        var c, c1, c2, c3;        c = c1 = c2 = 0;        while (i < utftext.length)        {            c = utftext.charCodeAt(i);            if (c < 128)            {                string += String.fromCharCode(c);                i++;            }            else if ((c > 191) && (c < 224))            {                c2 = utftext.charCodeAt(i + 1);                string += String.fromCharCode(((c & 31) &#39;, result, len(Num_imgs_not))        # print(&#39;Num_imgs -->&#39;, len(Num_imgs))        left_nums = []        num_s = []        for Num_img in Num_imgs:            left_num = re.findall(&#39;(?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )