【猿人学WEB题目专解】猿人学第5题

🌈据说,看我文章时 关注、点赞、收藏帅哥美女们 心情都会不自觉的好起来。

前言:
🧡作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
👍专栏介绍:猿人学WEB题目专解 ,提供猿人学WEB题目总计20题的解题思路与方法,如有讲述错误,请不吝赐教。

想看往期历史文章,可以浏览此博文: 历史文章目录,后续所有文章发布都会同步更新此博文~

人生苦短,我用python

题目网址

猿人学第5题

题目详情

在这里插入图片描述
让我们计算前5名直播间热度的 加和。还贴心的提示了 cookie 有效期只有 50 秒。

题目思路

首先我们先确定哪个 cookie 是他检测的,先清空全部 cookie 只剩一个 sessionid (因为这个参数是登录必须参数,不登陆无法访问该题网页!)
在这里插入图片描述
之前题目也注意到过了,Hm的一看就觉得和 https://hm.baidu.com/hm.js 有关,现在只留下两个可疑参数 mRM4hZBv0dDon443M ,分别删除访问第2/3页(访问第一页不需要这两个 cookie),发现当删除 RM4hZBv0dDon443M 时,网页就需要重新设置 cookie ,所以我们接下来 hook 这个 cookie 的生成,我这使用的油猴桃脚本,一定要添加 // @run-at document-start 代码,在网页加载前先加载 hook 的代码:

var value_ = document.cookie;
Object.defineProperty(document, 'cookie', {
   
    set: function(value) {
   
        if (!value.startsWith('RM4hZBv0dDon443M')) {
   
            return value;
        }
        debugger;
        value_ = value;
        console.log('Hook 捕获到数据 -> ', value_);
        return value;
    },
});

启用脚本后刷新页面,然后看到浏览器开发者工具就显示如下:
在这里插入图片描述
注意到这里的 RM4hZBv0dDon443M 并没有被设置,我们点击蓝色小箭头跳过这次断点,直到出现数值。
我点了三次蓝色小箭头才出现设置好的值:
在这里插入图片描述
我们从右边的调用堆栈中点击上一次函数调用:
在这里插入图片描述
把光标移动到设置的值上:
在这里插入图片描述
发现这是一个 window 对象,我们重新 hook 一下这个属性的设置:

var value_;
Object.defineProperty(window, '_$ss', {
   
    set: function(value) {
   
        debugger;
        value_ = value;
        console.log('Hook 捕获到数据 -> ', value_);
        return value;
    },
});

hook 结果如下:
在这里插入图片描述
这次一次找到,我们顺着调用堆栈往上点一个调用:
在这里插入图片描述
发现他是一个被加密的值,鼠标在上面滑动一下看看是什么值,并整体翻译一下:

_$Ww = CryptoJS.enc.Utf8.parse(window._$pr.toString())
_0x29dd83 = CryptoJS.AES.encrypt(_$Ww, window._$qF, {
   
    'mode': CryptoJS.mode.ECB,
    'padding': CryptoJS.pad.Pkcs7
})
window._$ss = _0x29dd83.toString()

发现只要分别对两个 window 参数进行 hook ,应该就能获取了,我们先 hook 一下密钥 window._$qF 字典长度为 4 的时候:

var value_;
Object.defineProperty(window, '_$qF', {
   
    set: function(value) {
   
        if (value?.words.length != 4) {
   
            return value;
        }
        debugger;
        value_ = value;
        console.log('Hook 捕获到数据 -> ', value_);
        return value;
    },
});

hook 到了这行:
在这里插入图片描述
翻译后:window._$qF = CryptoJS.enc.Utf8.parse(window.btoa(window._$is.slice(0, 16))) ,发现这等于加密的是时间戳前16位。
然后我们改 hook 另外一个变量,是一个明文值,是最麻烦的地方:

var value_;
Object.defineProperty(window, '_$pr', {
   
    set: function(value) {
   
        debugger;
        value_ = value;
        console.log('Hook 捕获到数据 -> ', value_);
        return value;
    },
});

发现只能 hook 到空列表,因为所有数组内部的修改均不会触发 set ,我们现在来监听 push 方法,重写 Array 原型:

var original = Array.prototype.push;
Array.prototype.push = function(value) {
   
    if (this.length < 6 && typeof value == 'string') {
   
        console.log(this);
        debugger;
    }
    return original.apply(this, arguments);
}

这里使用 this.length < 6 && typeof value == 'string' 是因为不想点那些大数组,成百上千的 push 能把我手点到麻。
然后在初始化的地方打个断点:
在这里插入图片描述
刷新网页后先让我们自己写的地方跳过断点,等初始化的断点生效:
在这里插入图片描述
然后关闭初始化的断点,恢复我们自己写的断点,然后慢慢点,找到我们每一步增加元素:
在这里插入图片描述
我们看看总共五次 push
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现前4次都在一个地方。
然后我们像日常扣代码,最终我们的第一个值就出来了:
在这里插入图片描述

在这里插入图片描述
发现值好像不一样,那肯定是有地方的环境没有补好,少了什么变量或者少执行了什么函数,赶紧看看,少的一般都是 window 对象中的变量。
搜寻一番,发现了3个 window 变量,打印一下他们 _0x4e96b4['_$6_'], _0x4e96b4['_$tT'], _0x4e96b4['_$Jy']
[8821003647, None, None]
发现后面两个是 None ,赶紧回到网页中查看并添加好环境。
发现还是不一样,那一定是代码中某些 try 在不同环境下产生了分支,经过仔细核查,发现是 var _0x42fb36 = _0x4e96b4[_$UH[0x260]][_$UH[0x8]]['DONE'] * 0x4; 没有执行成功,这里的值应该是16,而不是 catch 中的 var _0x42fb36 = 0x1;
接下来我们处理一下剩余的是如何 push 进去的,之前搜 _0x4e96b4['_$6_'], _0x4e96b4['_$tT'], _0x4e96b4['_$Jy'] 的时候就发现,他当中出现了多次赋值,我们就把每次的这两个值重新赋值试试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
发现期间是有数字变化的,而且 _0x4e96b4['_$Jy'] 后来变成了时间戳,想想这题是 AES 对称加密,所以一定会发送密钥过去解密,而且密钥是动态的,说明会发送给服务器,然后变量又跟实时的时间戳有关,服务器无法验证,所以跟验证有关的一定是 _0x4e96b4['_$pr'] 的最后一串加密字符串,此时断定刚才的那三个变量应该是定值,刷新几次,果然是定值,到此扣代码完成,然后组装解题源码,看源码部分吧~

解题源码

JavaScript 代码:

var _0x4e96b4 = global;
var _0x1171c8 = 0x67452301;
var _0x4dae05 = -0x10325477;
var _0x183a1d = -0x67452302;
var _0xcfa373 = 0x10325476;
var _0xceb4b2 = [], _0x2b11f1 = String['fromCharCode'];
function _0xac9d20(_0x16f6c8) {
   
    var _0x7d707d = _0x2b11f1(0x60);
    _0xceb4b2 = _0x48d4b5(_0x16f6c8)['split'](_0x7d707d);
}
function _0x48d4b5(_0xabcf4d) {
   
    var _0x10430a = _0xabcf4d['length'];
    var _0x4c73dc, _0x324511 = new Array(_0x10430a - 0x1), _0x4a9df7 = _0xabcf4d['charCodeAt'](0x0) - 0x61;
    for (var _0x399f28 = 0x0, _0x3a7b53 = 0x1; _0x3a7b53 < _0x10430a; ++_0x3a7b53) {
   
        _0x4c73dc = _0xabcf4d['charCodeAt'](_0x3a7b53);
        if (_0x4c73dc >= 0x28 && _0x4c73dc < 0x5c) {
   
            _0x4c73dc += _0x4a9df7;
            if (_0x4c73dc >= 0x5c)
                _0x4c73dc = _0x4c73dc - 0x34;
        } else if (_0x4c73dc >= 0x61 && _0x4c73dc < 0x7f) {
   
            _0x4c73dc += _0x4a9df7;
            if (_0x4c73dc >= 0x7f)
                _0x4c73dc = _0x4c73dc - 0x1e;
        }
        _0x324511[_0x399f28++] = _0x4c73dc;
    }
    return _0x2b11f1['apply'](null, _0x324511);
}
_0xac9d20('o~q}u`euf3ffdyrgfu`fkbu`xduv`wuf3ffdyrgfu`qsfya~`sq||`efdy~w`bdafafkbu`e|ysu`$_vb~W`eb|ysu`qbb|k`3sfyhuJArzusf`dueg|f`sxqd5atu3f`rgffa~`eu~t`vad}`ratk`}ageu}ahu`xqeAi~Bdabudfk`xaef~q}u`|asqfya~`abu~`eb|yf`euf;~fudhq|`xffbe,`s|ys{`sa~sqf`}ufxat`faEfdy~w`~atuFkbu`adywy~`v|aad`badf`$_~t`:F?>9u~udys7|u}u~f`fqw@q}u`saa{yu`$_<C~x`exai?atq|6yq|aw`du}ahu5xy|t`{uk5atu`bqdu~f@atu`wufFy}u`duqtkEfqfu`ujus`bqfx~q}u`euqdsx`fuef`yvdq}u`eufFy}uagf`:F?>8ad}7|u}u~f`hyeyry|yfk`qbbu~t5xy|t`qtt7hu~f>yefu~ud`y~tujut64`esdybf`a~duqtkefqfusxq~wu`uhq|`y~~ud:F?>`hq|gu`7{sB`|asq|Efadqwu`a~egr}yf`arzusf`bdafasa|`sa~fu~f`s|a~u@atu`y~tujAv`qeeyw~`idyfu`tasg}u~f`du}ahu7hu~f>yefu~ud`dag~t`efk|u`$_hh5;`dub|qsu`vg~sfya~`?ysda?ueeu~wud`geud3wu~f`ixy|u`a~s|ys{`y~bgf`suy|`?qfx`xyttu~`fqdwuf`|aqt`}rezmkexsv`~g}rud`sduqfu7|u}u~f`wuf7|u}u~fe4kFqw@q}u`wuf7|u}u~f4k;t`qffqsx7hu~f`$_vxV`s|yu~f6qfq`egr}yf`fy}uEfq}b`va~fe`A~|k\x20a~u\x20hqdyqr|u\x20tus|qdqfya~\x20q||aiut\x20y~\x20vadTTy~\x20|aab`fdq~eyu~f`qdyfk`tyeqr|ut`fkbuav`sxqdeuf`egbud`|u~wfx`#v*X`?ej}|XTJ?>:FFBTYTV`fa6qfqGD>`asd_dtkfigDsddqqmujgnh`qbb|ysqfya~5qsxu`}g|fybqdfUvad}Stqfq`hqd\x20wuf3ffdyrgfu/vg~sfya~N~q}uOmdufgd~\x20sgd_u|uTwuf3ffdyrgfuN~q}uO-o-`qffdyrgfue`Marzusf\x203ddqk]`bgex@afyvysqfya~`hayt`F=_EFD;@9`VVVV`qffdHudfuj`bgr|ys`efabBdabqwqfya~`l_,zcze~ld_VQR_+zxfiyzi9_jzcze~ld9xvcc,zcze~ld`$_vV`xqex`su||g|qd`8EE44`qssu|udqfya~`fdq~evud5xq~~u|`~7hdo5od|hu`fdgu`sduqfuArzusfEfadu`?ej}|XTJ?>:FFBT[TV`du}ahu3ffdyrgfu`b|gwy~e`o__vf{jwf_wjs~ishw6__kwtvf{jwf_wjs~ishw6__gw~wb{ia_wjs~ishw6__xlvf{jwf_wjs~ishw6__vf{jwf_ibkfsddwv6__kwtvf{jwf_ibkfsddwv6__gw~wb{ia_ibkfsddwv6__xlvf{jwf_ibkfsddwv6__kwtvf{jwf_guf{dh_xibu6__kwtvf{jwf_guf{dh_xb`fdkmdufgd~\x20Niy~tai\x20y~efq~suav\x20Iy~taiO-osqfsxNuOmo`?ej}|XTEudhudJ?>:FFB`sa|ad6ubfx`fWY/ebisbqf~|N3f}bq|k\x20,|~efkb\x204kfNVllig|wwN5boa|k|N[bisbqf~|\x20-brb\x20+3\x20/ol\x20FH\x203efkNq|elj|N+Z\x202j|oq_[\x20qbpq\x201bdri|oNW(-/ol@ifdeqN[bisbqf~|\x20+3\x20GF\x20+fdeq\x20XuqbkabaN[bisb,_(kaf|N2XV1l}lql+fdeq\x20UliaN.1\x20,le|kqv\x204kf~lab\x201bdri|oNWolfa\x202|kp\x203e|fN*|kk|a|\x202|kd|j\x20,-NWWV\x204~ebkN~il~hECDI_sDADN2|jprkd*|kk|a|1bdri|oN,(\x20+T-3(-Z\x20UliaN2|jprkd2|kp-rjF+\x20+fdeqNsboa|k|N[bisbqf~|-brb3efkN2XVY|ii}|~hN2|jprkdXjlgfN3birdr\x202|kd|j\x20,-NV|oolfp\x20Zlqef~\x202VNYivjb\x20+fdeq\x201l}lql\x20+fdeqN2l,T@Wfdfq\x20+fdeqN2l,V\x202|kp\x201bdri|oN[87f8r|k)NppqNp|jprkd@p|kp@krjG3Ndj_jbkdjbkdN+lefq\x20*|kk|a|Nqfjbp\x20kbt\x20olj|kNp|jprkd@p|kp@krjG+Npbofc@jlklpm|~bN2|jprkd2|kp-rj@F3\x203efkNVlilo.24(@73efkNWolfa\x20-|phe\x202efcq\x20TiqN2|jprkd3birdr1bdri|oNUbkd|if\x20.32N,(\x20+|k3fkd_ZU\x20.rqpfab\x2082NY9,f|l6r_ZUDKCFCNebisb@kbrb@obdri|oN223\x20,bafrjNVlrofbo\x20-btN*ejbo\x20,lkarihfof\x20UliaN[bisbqf~|\x20+3\x20EF\x204iqo|\x20+fdeq\x20XuqbkabaN[bisbqf~|\x20+3\x20EH\x204iqo|\x20+fdeqN1l}lql\x20,bafrjNWolfa\x202|kp\x20UliaNdlravNp|kp@pbofc@~lkabkpba@ifdeqN2YfkaboNklql@p|kp@~gh@jbafrjNjfrfN,1l~hv\x20/1V\x20UliaNTkaolfaVil~h\x201bdri|oN2|jprkd2|kp-rj@G+\x20+fdeqNp|kp@pbofc@qefkNT|/|kd8|boN~|pr|iNU-\x20,le|kqv.3\x20UliaNu@ppqN-lql2|kp,v|kj|o9|tdvfN[bisbqf~|\x20+3\x20FF\x203efk\x20XuqbkabaNTpeibv2~ofmq,3\x20TiqN-lql\x202|kp\x20Wbs|k|d|of\x204(N1l}lql\x20Vlkabkpba\x20UliaN1l}lql\x20,bafrj\x20(q|if~NjfrfbuN-lql\x202|kp\x20Zrojrhef\x204(N223\x205fbqk|jbpb\x20+fdeqN+Z_.ofv|Nev~lccbbNu@ppq@riqo|ifdeqNWY[bfT6J@TNY9967U3.3_4kf~labNWbs|k|d|of\x202|kd|j\x20,-\x20UliaNp|kp@pbofc@jlklpm|~bN/|a|rh\x20Ullh\x20UliaN+Z@Y98fkdUf*|f2er@2DH@5EAEN+Z@Y98fkdUf*|f2er@2DH@5EAFN[bisbqf~|-brb+3\x20/ol\x20FH\x203eN,f~olplcq\x20[fj|i|v|N2|jprkd2|kpY|ii}|~hN223\x20,bafrj\x20(q|if~NTkaolfaXjlgfN2|jprkd2|kp-rj@F1N(3V\x202qlkb\x202bofcNp|kp@pbofc@pj|ii~|mpNu@ppq@jbafrjN+Z_2fke|ibpbN1l}lql\x203efk\x20(q|if~N~bkqrov@dlqef~NVil~hlmf|N+rjfklrp_2|kpNYilofaf|k\x202~ofmq\x20TiqN-lql\x202|kp\x20Zrojrhef\x20UliaN+3[829*\x20UliaNZ2_3e|fN2|jprkd-bl-rj_F3_ENTo|}f~Ne|kp@p|kp@kloj|iN+lefq\x203birdrN[80f[bf@HC2\x20+fdeqN+fkapbv\x20clo\x202|jprkdNT1\x20Vovpq|iebf\x20WUN2|jprkd\x202|kp\x20,bafrjNp|jprkd@p|kp@krjGHNe|kp@p|kp@}liaN+rjfklrp_2~ofmqN223\x20VlkabkpbaN2|jprkdWbs|k|d|of1bdri|oNTkg|i\x20,|i|v|i|j\x20,-N2|jprkd3e|f;qbpq<NY9+|k3fkd[bf@,@ZUDKCFCN[b}obt\x20.32NZ
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值