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

猿人学第二届第一题 第2届第3题的请求体token逆向 阅读详情

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

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

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

人生苦短,我用python

题目网址

猿人学第1题

题目详情

在这里插入图片描述
让我们计算计算所有机票价格的 平均值 。

题目思路

首先肯定要打开开发者工具,刚上来就给了我们一个下马威,我们先不管他,刷新一下,加载出这个网页的资源:
在这里插入图片描述
然后再看这个下马威:无限 Debug + 控制台输出污染,然后每次点下蓝色小箭头,控制台就会输出一次错误。
在这里插入图片描述
先尝试选择一律不在此暂停,然后点蓝色小箭头,发现 Debug 虽然不会弹出了,然下方依旧会有错误输出:

在这里插入图片描述
这时候为了我们干净的控制台,我们选择直接把 console.error 给屏蔽了,加上这行代码:console.error = function(){},瞬间他就不输出了,我们可以安安静静的开始继续分析了。
在网络一栏中,可以很明显的看到第一页是 https://match.yuanrenxue.cn/api/match/1?m=XXX,点击第二页出现 https://match.yuanrenxue.cn/api/match/1?page=2&m=XXX ,这下可以明白需要 page 页数和加密的参数 m 了,再看看载荷,m 是由两段参数组成的,左边未知,右边疑似时间戳,每次请求两边都会变,说明左边的很可能是由时间戳控制的,也有可能有随机数在里面。
点开启动器,查看请求调用堆栈:
在这里插入图片描述
很明显是由那个 request 方法发起的请求,点进去就看到了让人想放弃的代码:
在这里插入图片描述
很明显这段代码经过了Obfuscator混淆,正常人根本就难以看懂,一看给他的难度定义居然是简单,大家这里不要对自己的能力产生怀疑,看着难的,说明是第一次接触这个,多接触接触,就习惯了。
其实看到这已经可以猜出来了,这用的是 jQuery 框架,$['\x61\x6a\x61\x78'] 这里就应该是 $['get'] 方法,window['\x75\x72\x6c'] 这里是请求的 url地址,猜都猜出来是 /api/match/1 了。![] 可能很少遇到,但是到了混淆这里,经常遇到,![] 就是 false 的意思(因为在JavaScript,[] 代表 true),看这三元表达式就能看出来:
在这里插入图片描述
所以 _0xb89747 = _0x5d83a3 就是上面那个字典是请求的两个参数,第一个参数一看大致是当前时间戳 + 100000000,但是我们搜索第二个参数的方法名称 oo0O0 的时候,发现搜不到定义的地方!解个题变成侦探了,想找到函数的蛛丝马迹。
在这里插入图片描述
看一眼请求列表,经过排除,发现在请求前,唯一可以提供函数方法就是在页面本身,于是我们打开当前页面源代码,搜索这个函数,发现确实找的到:

function oo0O0(mw) {
    window.b = '';
    for (var i = 0, len = window.a.length; i < len; i++) {
        console.log(window.a[i]);
        window.b += String[document.e + document.g](window.a[i][document.f + document.h]() - i - window.c)
    }
    var U = ['W5r5W6VdIHZcT8kU', 'WQ8CWRaxWQirAW=='];
    var J = function(o, E) {
        o = o - 0x0;
        var N = U[o];
        if (J['bSSGte'] === undefined) {
            var Y = function(w) {
                var m = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=',
                    T = String(w)['replace'](/=+$/, '');
                var A = '';
                for (var C = 0x0, b, W, l = 0x0; W = T['charAt'](l++); ~W && (b = C % 0x4 ? b * 0x40 + W : W, C++ % 0x4) ? A += String['fromCharCode'](0xff & b >> (-0x2 * C & 0x6)) : 0x0) {
                    W = m['indexOf'](W)
                }
                return A
            };
            var t = function(w, m) {
                var T = [],
                    A = 0x0,
                    C, b = '',
                    W = '';
                w = Y(w);
                for (var R = 0x0, v = w['length']; R < v; R++) {
                    W += '%' + ('00' + w['charCodeAt'](R)['toString'](0x10))['slice'](-0x2)
                }
                w = decodeURIComponent(W);
                var l;
                for (l = 0x0; l < 0x100; l++) {
                    T[l] = l
                }
                for (l = 0x0; l < 0x100; l++) {
                    A = (A + T[l] + m['charCodeAt'](l % m['length'])) % 0x100, C = T[l], T[l] = T[A], T[A] = C
                }
                l = 0x0, A = 0x0;
                for (var L = 0x0; L < w['length']; L++) {
                    l = (l + 0x1) % 0x100, A = (A + T[l]) % 0x100, C = T[l], T[l] = T[A], T[A] = C, b += String['fromCharCode'](w['charCodeAt'](L) ^ T[(T[l] + T[A]) % 0x100])
                }
                return b
            };
            J['luAabU'] = t, J['qlVPZg'] = {}, J['bSSGte'] = !![]
        }
        var H = J['qlVPZg'][o];
        return H === undefined ? (J['TUDBIJ'] === undefined && (J['TUDBIJ'] = !![]), N = J['luAabU'](N, E), J['qlVPZg'][o] = N) : N = H, N
    };
    eval(atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), '\x27' + mw + '\x27'));
    return ''
}

看到 return 后居然没有返回值,那问题一定是出在那个 eval 函数里了,可以看到肯定和 window['b'] 有关,我们打印一下 window['b'] ,刷新几次,发现 window['b'] 是一个固定的值,是被 base64 加密了,所以我们直接去控制台获取一下 window['b'] 这个值,太长了自己去复制吧。
用 Python 手动处理 atob 函数,对 window['b'] 进行 bae64 解码操作:base64.b64decode('[window.b]').decode() ,可以在浏览器里输入 atob(window['b']) 预览一下:
在这里插入图片描述
发现是经过一段处理,最后处理成 md5 的十六进制数据,赋值给了 window.f 这个变量,猜测这个 window.f 就是我们最终想要的结果,打印一看,标标准准:
在这里插入图片描述
那我们就直接执行这段 base64 加密的代码,最终取出 window.f 就可以了:

t = int(time.time()) * 1000 + 100000000
js = f"function main(mwqqppz) {{window = this; {base64.b64decode('[window.b]').decode()}; return window.f}}"
m = execjs.compile(js).eval(f"main('{t}')")
url = f"https://match.yuanrenxue.com/api/match/1?page={index}&m={m}丨{t // 1000}"

这样就获取到了我们的 url 地址,接下来的请求就简单了,直接看最后的源码就可以。

解题源码

import os
import time
import base64
import execjs
import requests
import jsonpath

os.environ["EXECJS_RUNTIME"] = "Node"

headers = {
    'cookie': 'sessionid=htsmcpjmxxml7f7q1g8fwticn5verjit',
    'User-Agent': 'yuanrenxue.project'
}

js = f"function main(mwqqppz) {{window = this; {base64.b64decode('[window.b]').decode()}; return window.f}}"

value = 0
for index in range(1, 6):
    # 趁爬虫没有反应过来写死 m 的参数直接访问
    # url = f"https://match.yuanrenxue.com/api/match/1?page={index}&m=c7c34cd9971e286bb60664eb3ca5b73c丨1680087702"
    # 通过 js 生成 m 参数
    t = int(time.time()) * 1000 + 100000000
    m = execjs.compile(js).eval(f"main('{t}')")
    url = f"https://match.yuanrenxue.com/api/match/1?page={index}&m={m}丨{t // 1000}"
    # value += sum(v['value'] for v in requests.get(url, headers=headers).json()['data'])
    value += sum(jsonpath.jsonpath(requests.get(url, headers=headers).json(), '$..value'))
print(value / 50)
【中等】 猿人学web第一届 第2题 js混淆 动态cookie 1 进入题目正常加载数据后 打开调试工具,等待一会(2~3分钟) 刷新页面 cookie 失效以后会弹窗 删除 cookie 中的 m 字段再刷新页面也是一样的 点击确定后,页面自动刷新完会进入 无限 debugger 查看上一层堆栈 生成 debugger 的代码 是经过混淆的 手动解混淆后的代码 加密参数定位 hook Cookie hook 到 cookie 后,向上查看堆栈就能找到生成 cookie m参数的位置 每次请求返回的代码都不一样,但执行逻辑是一样的,所以将 2.html 阅读详情

相关推荐

猿人学第二届第二题

第一处是第二处拼接了个时间戳,时间戳好弄,要么是new Date生成的,要么是刚才那个图片包返回的,还有一处是第二处去掉来token=,所以我们直接跟这个变量,很容易就找到生成的地方。每次分页明显抓到两个包,一个数据包一个图片包,但这个图片包很奇怪,每次返回同样的,明显不合理,用fidder抓包或者python逆向下这个包,可以看到是返回一个时间戳。到这儿别慌,这是内存爆破引起的,碰到这样的问题,极大可能是格式监测引起的,我们可以借助压缩代码网站,把格式化后的代码还原回去。那就极大可能是缺少环境。

zhuangjoo的博客 1950

猿人学第二届第一题找修改位置(非答题)

AES加密ECB-pksc7 的 key 标准是128位即 16*8(bit) ,这里666yuanrenxue66 是15位不是标准key , 我们看看它修改的算法. 搜索 _doReset。最终发现加密之前传入的铭文和key 没有被解析成字节这一步,它是直接传进去了字符串,注释掉后,我们就得到结果了,下面是根据修改位置自己改的AES.js算法调用测试。x('push')(i()) 和标准代码处理得到的结果是不一样的。调试发现这里的值每次是固定的,直接写死就好了。对比标准的AES ,修改了这里的数组。

leaon的博客 546

【简单】 猿人学web第一届 第4题 雪碧图,样式干扰

仔细观察,0-9 数字的对应的 base64值 都是一样的,所以可以定义一个字典做为映射。

m0_69843492的博客 1305

猿人学2023年第二届JS逆向比赛第一题!

第二届Web端猿人学攻防大赛【官方网站】 (yuanrenxue.cn)猿人学第二届JS逆向比赛难度相较于第一节比赛的赛题那真的是难上加难了,打得许多小伙伴道心都快破碎了。接下来我将进行第一题的题解,主要是抠代码,这道题主要使用了MD5和AES算法,这两个算法都魔改了!!!(真的算简单到离谱吗?)

qq_45696543的博客 2275

猿人学web端爬虫攻防大赛赛题解析_第四题:雪碧图、样式干扰

第四题:雪碧图 - 样式干扰1、前言2、题目理解3、解析过程3.1、初窥门径3.2、深入探究3.2.1、确定原理3.2.2、逆向破解3.2、代码实现4、结语 1、前言 久违的第四题终于要出炉了,这篇博客比我预想的完成时间要快,主要是没想到这次解题过程还比较顺利,竟然在没有参考其他大佬答案的前提下,自己摸索出来了,对我来说算是一个可喜可贺的小突破啊,虽然是道简单级别的题,但凭自己实力破解还是有点成就感的,算是逆向之路的一个小里程碑。好,那就不扯犊子了,进入主题! 2、题目理解 猿人学的题好就好在每道题都告诉你

仙路尽头谁为峰 1万+

猿人学第二届第一题解题小记

猿人学第二届第一题解题小记

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

第七题 动态字体,随风漂移 - 猿人学

user_from_future的博客 9360

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364

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

第六题 js 混淆 回溯 - 猿人学

user_from_future的博客 1万+

【低空经济】多源异构数据融合的低空智能感知系统设计与实现

本文探讨了低空智能感知系统在多源异构数据融合中的设计与实现,重点解决无人机等低空飞行器的安全监测问题。通过雷达、光学和红外传感器的数据融合,系统识别准确率提升至92%,并实现120ms的低延迟处理。文章详细介绍了时空对齐、特征级融合和动态权重自适应等关键技术,为低空经济发展提供可靠技术支持。

weixin_29065659的博客 342

AHB不对称半桥反激电路设计(一)变换器拓扑工作原理详解

本文详细分析了AHB(不对称半桥)反激变换器拓扑的工作原理及关键优势。该拓扑通过谐振腔结构实现原边功率管的零电压开通(ZVS)和副边整流管的零电流关断(ZCS),显著提升效率至95%以上。文章阐述了6个工作阶段的时序特征,包括谐振电感电流和电容电压的数学模型推导。AHB拓扑具有漏感能量回收、宽电压输出(适配PD快充等场景)和协同储能等优势,相比传统方案可缩小变压器体积30%,成为100-300W隔离电源的理想选择。

【Simon】的博客 7154

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

第十八题 jsvmp 洞察先机 - 猿人学

user_from_future的博客 3万+

QMT实盘交易入门:5分钟搞定ETF全球配置策略(附完整代码)

本文详细介绍了如何使用QMT平台实现ETF全球配置策略,从环境准备到策略编写、实盘部署全流程仅需5分钟。通过xtquant库对接交易所接口,提供完整的动量轮动策略代码,帮助投资者快速掌握自动交易技术,优化全球资产配置。

weixin_30675247的博客 334

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

第四题 雪碧图、样式干扰 - 猿人学

user_from_future的博客 9921

告别臃肿!保姆级教程:用NTLite深度精简Win10,打造你的专属纯净系统(附完整组件移除清单)

本文提供了一份详细的NTLite教程,帮助用户深度精简Windows10系统,移除冗余组件并优化性能。从准备工作到组件移除清单,再到系统配置优化和无人值守安装,逐步指导用户打造专属纯净系统。附完整组件移除清单和实战经验,确保系统稳定高效运行。

weixin_30945039的博客 856

​​手把手教你学PCIE--ATU 的 Bar 匹配模式与地址匹配模式详解​

摘要: ATU(地址转换单元)提供两种地址匹配模式:Bar匹配模式基于PCI设备的BAR寄存器自动映射虚拟地址(只需配置物理基址),适用于标准PCI设备DMA;地址匹配模式需显式配置虚拟与物理地址范围,适合自定义映射场景。核心区别在于匹配依据(BAR自动推导vs人工定义),Bar模式简化配置,地址模式更灵活。

MHD0815的博客 380

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

备周则意怠 常见则不疑 - 猿人学

user_from_future的博客 478

YOLOv11改进 | 网络结构代码逐行解析(二) | yolov11中的Mosaic增强详解

本文给大家带来的是YOLOv10中的Mosaic增强代码的详解,可能有部分人对于这一部分比较陌生,有的读者可能知道Mosaic增强但是不知道其工作原理,具体来说Mosaic增强就是指我们的数据集中的图片在输入给模型之前的一个处理过程(我们的图片并不是直接就输入给模型了,大家的训练结果中的结果检测图片大家可以看到数据集中多个图片会组合在一起这就是简单的Mosaic增强),下面我就来讲解一下其在YOLOv10中工作原理和代码定义,下面图片为一个Mosaic增强后的图片。​。

Snu77的博客 5021

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

入门级cookie-猿人学

user_from_future的博客 402

Archery通过OpenResty代理转发后登录一直提示Forbidden

测试几遍,连账号密码都没用验证,因为不管输什么都是提示Forbidden。找到配置文件settings.py,下面命令可到配置文件路径。回到页面刷新,随便输入个账号密码,验证失败证明请求成功了。查看Preview,提示CSRF验证失败,请求被中断。域名:dba.hkeasyspeed.com。打开开发者工具查看,网络里面可以看到报403。添加一条配置,把你配置域名添加进去。可以看到页面可以正常访问到。进入Archery容器。重启Archery容器。正常输入账号密码,OK。

万物皆可学 3144

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

***检测

user_from_future的博客 466

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

#12 入门级js(0难度)- 猿人学

user_from_future的博客 332

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

天杀的http2.0

user_from_future的博客 362

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

webpack初体验

user_from_future的博客 499

猿人学web1第五题(时间戳aes加密、混淆)

而其中_0x474032(_yw)的值即为m,此行代码在本题中出现多次,不同位置的代码因参数静态值不同会导致最终值的不同,所以要注意其产生的位置,且因为最终_0x474032(调试后发现前四次的值都是在1行118755处产生,而第五次值是在1行97383处产生,且第五次产生的值即为cookies参数中最终的m值,所以现在只要得到m的值也可得到rm4的值。在cookies中参数的m值其在生成过程中的静态参数值为以上部分,在_0x4e96b4[‘_$pr’]生成的无此过程中将上述静态值定义为该部分即可。

qq_45004209的博客 1669
上一篇: 【毕业设计】前后端分离——实现登录注册功能
下一篇: 【猿人学WEB题目专解】猿人学第2题
user_from_future
博客等级 码龄5年 4066粉丝 115原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值