首页 > 其他分享 >猿人学内部练习平台第11题

猿人学内部练习平台第11题

时间:2024-04-26 23:11:22浏览次数:25  
标签:11 function clearance return 猿人 jsl 练习 __ document

第11题:人均会解jsl

控制台抓包可以看到,页面请求了两次 https://www.python-spider.com/challenge/11 第一次返回了一段js代码,第二次返回了所需数据:

对比两次请求参数发现,只有cookie中的__jsl_clearance发生了变化,其他参数均相同,因此该值应该是第一次返回的js生成的。清除cookie中的__jsl_clearance,打上script事件侦听器断点,单步调试,直至来到该js页面:

一步步调试至最后,发现eval的内容如下:

可以看到,里面有__jsl_clearance的生成逻辑,执行完该js文件后,控制台打印cookie,可以看到__jsl_clearance已经生成:

所以只需把该js代码放至本地运行即可生成__jsl_clearance
本地运行后,代码会卡住,即代码存在环境检测,单步调试后发现,代码卡在了

 eval(y.replace(/\b\w+\b/g, function(y) {
                return x[f(y, z) - 1] || ("_" + y)
            }));

刚刚我们已经知道了eval输出的内容是什么,将该部分内容复制出来,简单修改后控制台调试:

debugger;
var _N = function () {
    setTimeout('location.href=location.pathname+location.search.replace(/[\\?|&]captcha-challenge/,\'\')', 1500
)
    ;document.cookie = '__jsl_clearance=1714140907.524|0|' + (function () {
        var _t = [function (_N) {
            return _N
        }, function (_t) {
            return _t
        }, (function () {
            var _N = document.createElement('div');
            _N.innerHTML = '<a href=\' /\'>_1H</a>';
            _N = _N.firstChild.href;
            var _t = _N.match(/https?:\/\//)[0];_N=_N.substr(_t.length).toLowerCase();return function(_t){for(var _1H=0;_1H<_t.length;_1H++){_t[_1H]=_N.charAt(_t[_1H])};return _t.join('')}})(),function(_N){for(var _t=0;_t<_N.length;_t++){_N[_t]=parseInt(_N[_t]).toString(36)};return _N.join('')}],_N=['clD',[(-~~~{}<<-~~~{})+(-~~~{}<<-~~~{})],'V',[(-~[]+[]+[[]][0])+[-~-~{}]],'fq',[(-~[]+[]+[[]][0])+[-~[]-~[]-~!/!/+(-~[]-~[])*[-~[]-~[]]],(-~[]+[]+[[]][0])+(-~[-~-~{}]+[[]][0]),(-~[]+[]+[[]][0])+[(+!![[][[]]][1])]],'LBWywKW',[(2-~[-~-~{}]+[]+[[]][0])],'%2FZyf',[(-~[]+[]+[[]][0])+(-~[-~-~{}]+[[]][0])],'6',[(-~[]+[]+[[]][0])+(-~[-~-~{}]+[[]][0])],'_fa826e49bec0d5248d34e89755520aa8',(-~[-~-~{}]+[[]][0]),'D'];for(var _1H=0;_1H<_N.length;_1H++){_N[_1H]=_t[[1,0,1,2,1,3,1,2,1,2,1,3,1,0,1][_1H]](_N[_1H])};return _N.join('')})()+';Expires=Tue, 12-Dec-30 09:50:26 GMT;Path=/;'};if((function(){try{return !!window.addEventListener;}catch(e){return false;}})()){document.addEventListener('DOMContentLoaded',_N,false)}else{document.attachEvent('onreadystatechange',_N)}

可以看到,有一些环境检测:window.addEventListener,document.addEventListener,本地单步调试后发现,卡在document.addEventListener('DOMContentLoaded',_N,false)这一行`,可以百度查询其含义,表示文档完成初始的加载和解析之后执行_N函数。
补充对应环境后运行:

setTimeout = function (){}
window = {}
document = {}
window.addEventListener = '1'
document.addEventListener = function (a, b, c) {
    return b()
}
// js 代码

发现还是会卡住,继续调试_N函数:

debugger;
document.cookie = '__jsl_clearance=1714140907.524|0|' + (function() {
        var _t = [function(_N) {
            return _N
        }
        , function(_t) {
            return _t
        }
        , (function() {
            var _N = document.createElement('div');
            _N.innerHTML = '<a href=\' /\'>_1H</a>';
            _N = _N.firstChild.href;
            var _t = _N.match(/https?:\/\//)[0];
            _N = _N.substr(_t.length).toLowerCase();
            return function(_t) {
                for (var _1H = 0; _1H < _t.length; _1H++) {
                    _t[_1H] = _N.charAt(_t[_1H])
                }
                ;return _t.join('')
            }
        }
        )(), function(_N) {
            for (var _t = 0; _t < _N.length; _t++) {
                _N[_t] = parseInt(_N[_t]).toString(36)
            }
            ;return _N.join('')
        }
        ]
          , _N = ['clD', [(-~~~{} << -~~~{}) + (-~~~{} << -~~~{})], 'V', [(-~[] + [] + [[]][0]) + [-~-~{}]], 'fq', [(-~[] + [] + [[]][0]) + [-~[] - ~[] - ~!/!/ + (-~[] - ~[]) * [-~[] - ~[]]], (-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0]), (-~[] + [] + [[]][0]) + [(+!![[][[]]][1])]], 'LBWywKW', [(2 - ~[-~-~{}] + [] + [[]][0])], '%2FZyf', [(-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0])], '6', [(-~[] + [] + [[]][0]) + (-~[-~-~{}] + [[]][0])], '_fa826e49bec0d5248d34e89755520aa8', (-~[-~-~{}] + [[]][0]), 'D'];
        for (var _1H = 0; _1H < _N.length; _1H++) {
            _N[_1H] = _t[[1, 0, 1, 2, 1, 3, 1, 2, 1, 2, 1, 3, 1, 0, 1][_1H]](_N[_1H])
        }
        ;return _N.join('')
    }
    )() + ';Expires=Tue, 12-Dec-30 09:50:26 GMT;Path=/;'

document.createElement('div'); 处报错,根据上下文代码补充对应环境即可:

document = {
    'createElement': function (a) {
        if (a === 'div'){
            return {
                'firstChild': {
                    'href': "https://www.python-spider.com/"
                }
            }
        }
    }
}

再次运行,输出正确结果:

setTimeout = function (){}
window = {}
document = {
    'createElement': function (a) {
        if (a === 'div'){
            return {
                'firstChild': {
                    'href': "https://www.python-spider.com/"
                }
            }
        }
    }
}
window.addEventListener = '1'
document.addEventListener = function (a, b, c) {
    return b()
}
// 第一个11返回的 js 代码
console.log(document.cookie)


然后修改js代码,本地替换,并借用python调用即可,参考代码如下:
topic11.js

setTimeout = function () {
}
window = {};
window.addEventListener = '1';
document = {};
document.addEventListener = function (a, b, c) {
    return b()
}
document.createElement = function () {
    return {
        firstChild: {
            href: 'https://www.python-spider.com/'
        }
    }
}
// console.log(document.cookie)
__jscode

topic11.py

import execjs
import re
import requests
from lxml import etree


cookies = {
    'sessionid': 你的id
}

session = requests.Session()

response = session.get('https://www.python-spider.com/challenge/11', cookies=cookies)
with open('topic11.js', 'r', encoding='utf-8') as f:
    jscode = f.read().replace('__jscode', re.search('<script>(.*)</script>', response.text).group(1))

ctx = execjs.compile(jscode)
document_cookie = ctx.eval('document.cookie')
__jsl_clearance = re.search('__jsl_clearance=(.*?);', document_cookie).group(1)
cookies['__jsl_clearance'] = __jsl_clearance

response = session.get('https://www.python-spider.com/challenge/11', cookies=cookies)
print(response.text)
html = etree.HTML(response.text)
datas = html.xpath("//div['page-box layui-row']//td/text()")
print(datas)

total_num = 0
for data in datas:
    total_num += int(data.replace(' ', ''))
print(total_num)

标签:11,function,clearance,return,猿人,jsl,练习,__,document
From: https://www.cnblogs.com/achangblog/p/18160928

相关文章

  • 在win11电脑安装ubuntu双系统详细教程
    ​ 一、制作Ubuntu系统盘下载UbuntuISO镜像:访问Ubuntu官方网站下载最新的Ubuntu18.04LTS(长期支持版)ISO镜像。阿里云开源镜像站:https://mirrors.aliyun.com/ubuntu-releases/ 清华大学开源软件镜像网站:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/选择想要......
  • 猿人学内部练习平台6~10题
    第六题:session保持检测使用session请求即可:session=requests.Session()第七题:请求规律检测1-post根据请求接口找规律,在每一页请求前请求一次https://www.python-spider.com/cityjson即可requests.post('https://www.python-spider.com/cityjson',verify=False)response=......
  • python - [11] 日常脚本汇总
    题记部分  一、updatetime更新将脚本放到目标文件夹,运行脚本可将文件夹下所有文件的更新时间都修改为当前时间。importos#指定目录路径directory_path="./"#遍历目录下的所有文件和子目录forroot,dirs,filesinos.walk(directory_path):forfilei......
  • 从 Java 8 转换到 Java 11
    截至目前(2024年),十年前发布的Java8依然是Java中应用最广泛的版本,占比37%,其次是Java11。而目前的JDK最新版本为22,最新的LTS版本为JDK21。从Java8迁移到Java11可能意味着很大的工作量。潜在问题包括:删除的API、弃用的包、内部API的使用、对类加载程序的更......
  • PostgreSQL14.11一键启动免安装绿色版
    PostgreSQL14.11_x64一键启动免安装版使用方法:解压后,将整个文件夹放到你希望的位置,注意路径不要包含中文。双击运行bat即可,第一次打开会自动初始化数据库目录。注意:pgsql15版本以后,需要使用navicat16.2以上版本才可以正常连接。想使用最新版本的PostgreSQL16.2,可以下载P......
  • 练习题----顺序栈算法
    题目:​ 输入一个包括'('和')'的字符串string,判断字符串是否有效。要求设计算法实现检查字符串是否有效,有效的字符串需满足以下条件:A.左括号必须用相同类型的右括号闭合。B.左括号必须以正确的顺序闭合。C.每个右括号都有一个对应的相同类型的左括号。题目分析:​ 该......
  • ROS1学习记录(11.0)
    学习视频:18.tf坐标系广播与监听的编程实现_哔哩哔哩_bilibili创建TF坐标系的功能包:catkin_create_pkgltfroscpprospytfturtlesim 将写好源码塞入ltf内部的src内;下面时两个源码创建流程;  塞入源码后进行编译; 添加编译规则如下:add_executable(turtle_tf_broad......
  • 20211317 李卓桐 Exp5 信息搜集与漏洞扫描 实验报告
    Exp5信息搜集与漏洞扫描实验报告1、实践目标掌握信息搜集的最基础技能与常用工具的使用方法。2、实践内容(1)各种搜索技巧的应用(2)DNSIP注册信息的查询(3)基本的扫描技术:主机发现、端口扫描、OS及服务版本探测、具体服务的查点(以自己主机为目标)(4)漏洞扫描:会扫,会看报告,会查漏......
  • 力扣-118. 杨辉三角
    1.题目介绍题目地址(118.杨辉三角-力扣(LeetCode))https://leetcode.cn/problems/pascals-triangle/题目描述给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1:输入:numRows=5输出:[[1],......
  • 【爆款推荐】初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高
    PDF格式公众号回复关键字:ZKYDT011原文1Thewriterlostherfatherattheageoffour,didn’tshe?解析1Thewriter这位作者,lost失去,herfather她的父亲,attheageoffour在4岁的时候,didn’tshe?不是吗?这位作家四岁时失去了父亲,不是吗?2Everythingcha......