XCTF_Web_新手练习区:simple_js(源代码详解)

2023-11-11

第七题:simple_js (源代码详解)

在这里插入图片描述

目标

掌握有关js的知识

Writeup

  • 进入环境后我们遇到了输入密码,于是我们随便输入一个密码,点击确定
    在这里插入图片描述
    在这里插入图片描述
  • 之后啥也没有,于是我们看看源代码,哎,有东西,不错呦
<html>
<head>
    <title>JS</title>
    <script type="text/javascript">
    function dechiffre(pass_enc){
        var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
        var tab  = pass_enc.split(',');
                var tab2 = pass.split(',');var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
                        k = j + (l) + (n=0);
                        n = tab2.length;
                        for(i = (o=0); i < (k = j = n); i++ ){o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
                                if(i == 5)break;}
                        for(i = (o=0); i < (k = j = n); i++ ){
                        o = tab[i-l];
                                if(i > 5 && i < k-1)
                                        p += String.fromCharCode((o = tab2[i]));
                        }
        p += String.fromCharCode(tab2[17]);
        pass = p;return pass;
    }
    String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));

    h = window.prompt('Enter password');
    alert( dechiffre(h) );

</script>
</head>

</html>

源代码详解

执行流程:
一、首先定义了一个dechiffre函数,咱先不管,因为还没有调用
注:先将\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30十六进制数转换成字符串,python下print即可,或网址:https://www.bejson.com/convert/ox2str/
输出结果55,56,54,79,115,69,114,116,107,49,50

二、执行String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50
"));

三、调用了dechiffre,执行dechiffre函数
String["fromCharCode"](dechiffre("55,56,54,79,115,69,114,116,107,49,50
"));
(1)先将"55,56,54,79,115,69,114,116,107,49,50
"带入dechiffre函数执行,即dechiffre(pass_enc)=dechiffre("55,56,54,79,115,69,114,116,107,49,50
")

(2)接着我们看到了pass变量,暂时先放着

(3)因为pass_enc="55,56,54,79,115,69,114,116,107,49,50"
将pass_enc字符串分割成字符串数组,赋值给tab参数,所以:
tab=[55,56,54,79,115,69,114,116,107,49,50]   注:tab此时是字符串数组!!!

(3)随后也对pass分割
tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]

(4)变量赋值代码分析:var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
一开始i,j,k,m,n,o,没有赋值,为undefined,其它参数l=0,p="",后来i被赋值=0,j被赋值为11

(5)第九行此时n被赋值为0,所以k=11+0+0,最后等于11    注:这里的(l)其中是英文字母l,不是数字1

(6)第十行中,n=18

(7)第一个for循环,精简一下代码:
for(i = 0; i < (18); i++ )
{o = tab[i-l];p += String.fromCharCode((o = tab2[i]));
    if(i == 5)break;}
解释:前面的o=tab[i-1]是无用的,因为后面会被o=tab2[i]的值重新覆盖
第一次循环:o=tab[0];p=p+String.fromCharCode((o = tab2[0])
=>o=70;p=""+String.fromCharCode(70)=>p=英文字母F
第二次...
第三次...
第四次...
第五次...
所以,这个for循环,最后的p为(尽管没有输出出来,这里我们知道就好)FAUX P

(8)第二个for循环,精简一下代码:
for(i = 0; i < 18; i++ ){
o = tab[i-l];
    if(i > 5 && i < 17)
        p += String.fromCharCode((o = tab2[i]));
}
解释:这里的for循环和上面的差不多,注意这里的p值由于第一次for循环执行后现在已经是FAUX P了
加上第一次for循环的p值,最后的p为FAUX PASSWORD HAH

(9)p += String.fromCharCode(tab2[17]);
因为tab2=[70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65]
所以:p=FAUX PASSWORD HAH + A
因此,最后的p为FAUX PASSWORD HAHA

(10)pass = p;return pass;
 即 pass = FAUX PASSWORD HAHA;return FAUX PASSWORD HAHA;
 最后函数输出为FAUX PASSWORD HAHA

嗯哼???这个函数就执行完了???我的tab数组怎么没有用到???,我一开始带进来的参数呢?去哪了?别想了,输出值虽然用到了带进来的参数(就是分割后的tab数组),但是for循环那里人家直接使用tab2数组相关代码的值,根本没有用到tab数组的值,所以由于代码逻辑问题,你传入的dechiffre的参数pass_enc是没有任何意义的

三、dechiffre函数执行完成后,继续执行其它的代码
h = window.prompt('Enter password');
    alert( dechiffre(h) );
h=你输入弹框内的内容
之后alert弹出dechiffre(h)的值,由前面所有的代码可知,代码里p的值与tab无关,因为最终都会被tab2的值替代,所以我们无论输入什么,也就是pass_enc=h,无论输入的这个h等于什么,不管tab能否被分割成字符串数组,是否存在,都只会利用到tab2。通俗点讲,有关tab的参数与值都可以视为没有,因此,pass_enc参数是什么也就没有意义了

四、最后,结论就是,无论我们在弹框中输入什么值,都只会返回FAUX PASSWORD HAHA
我就猜想,会不会String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));这个语法错误,并且没有没计算出来的是不是最后正确的值,也就是flag~
于是,我不用它这么无论pass_enc参数输入什么都显示FAUX PASSWORD HAHA的函数,咱也抛弃它一回,自己重新写代码执行它
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
    var n=String.fromCharCode(55,56,54,79,115,69,114,116,107,49,50);
    document.write(n);
</script>
</body>
</html>
最后结果为:786OsErtk12
根据提示的flag格式输入最后的flag!

注:

(1)split() 方法用于把一个字符串分割成字符串数组
语法:string.split(separator,limit)
参数                 描述
separator        可选。字符串或正则表达式,从该参数指定的地方分割 string Object。比如此题以逗号分割成字符串数组
limit            可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
举例:str="a,b,c,d,e,f,g";
var 1st = str.split(",",3);   对str以逗号进行分割,分割后的字符串数组内的值最多只能有3个,结果就是1st = [a,b,c]

(2)for 循环的语法如下:
for (语句 1; 语句 2; 语句 3) {
     要执行的代码块
}
语句 1 在循环(代码块)开始之前执行。
语句 2 定义运行循环(代码块)的条件。
语句 3 会在循环(代码块)每次被执行后执行。

(3)fromCharCode() 可接受一个指定的 Unicode 值,然后返回一个字符串。
语法:String.fromCharCode(n1, n2, ..., nX)
参数                 描述
n1, n2, ..., nX     必需。一个或多个 Unicode 值,即要创建的字符串中的字符的 Unicode 编码。

(4)prompt()方法用于显示可提示用户进行输入的对话框。
这个方法返回用户输入的字符串
语法:prompt(msg,defaultText)
参数                描述
msg                可选。要在对话框中显示的纯文本(而不是 HTML 格式的文本)就是弹框显示文本。
defaultText        可选。默认的输入文本,你输入什么弹框一开始出现里面的输入框就会默认显示你这个文本。

(5)var i,j,k,l=0,m,n,o,p = "";
这个表示声明变量i,j,k,l,m,n,o,p,只有l和p两个变量被赋值了,其它的变量都是不带值的,不带有值的变量,它的值将是undefined,后续代码中可以给它赋值。

(6)length
length 属性可设置或返回数组中元素的数目。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XCTF_Web_新手练习区:simple_js(源代码详解) 的相关文章

  • Modelling Context and Syntactical Features for Aspect-based Sentiment论文阅读笔记(ACL2020)

    目录 原文翻译 基于方面的情感分析的上下文和句法特征建模 摘要 1 介绍 2 相关工作 3 方法提出 3 1 方面提取 3 1 1 输入表示 3 1 2 词性嵌入 3 1 3 基于依赖关系的嵌入 3 1 4 微调过程 3 2 方面情感分类
  • 算法练习——力扣随笔【LeetCode】【C++】

    文章目录 LeetCode 练习随笔 力扣上的题目和 OJ题目相比不同之处 定义问题 排序问题 统计问题 注意事项 玄学 新 get 1 单调栈 2 滑动窗口 3 auto 应用 c 11 STL 4 sort 内嵌式规则 5 实现无删遍历
  • Python爬虫 如何利用浏览器获取JSON数据,如获取淘宝天猫的评论链接?

    浏览器 Chrome 工具 右键 检查 N 步骤 1 打开淘宝 天猫 2 右键 检查 3 随便点击一个商品进入购买界面 4 点击监控工具 Network Json 5 点击 商品评论 6 下拉到评论翻页处 7 点击 监控工具Clear功能
  • 微信小程序登录获取不到头像和昵称解决办法!

    微信小程序登录获取不到头像和昵称主要原因是 小程序wx getUserProfile接口被收回 大家可以按照文档操作 PS 针对小程序wx getUserProfile接口将被收回后做出的授权调整 小程序文档中提出的调整说明 对于此次变化
  • Tree-String Problem 【CodeForces - 291E】【倍增(LCA)+哈希】

    题目链接 题意 给你N个点的树 树上的边的权值是一个自上往下的字符串 然后我们再给出一个字符串 是模式串 我们现在想知道模式串在树上的出现次数 譬如说样例 我们查找的是aba 它在1 4这条链上出现了2次 在1 5上出现1次 在2 3上出现
  • [Linux]rsync显示进度

    rsync a progress info progress2
  • PCL RANSAC拟合分割多条直线

    目录 一 概述 二 代码实现 三 结果展示 1 原始点云 2 拟合结果 3 分割结果 四 相关链接 一 概述 使用RANSAC算法拟合分割多条直线 输出每一条直线的拟合参数到控制台 并保存直线点云到本地文件夹 二 代码实现 include
  • 简单的局域网实现文件共享

    局域网 网络种类 覆盖范围一般是方圆几千米之内 其具备的安装便捷 成本节约 扩展方便等特点使其在各类办公室内运用广泛 局域网可以实现文件管理 应用软件共享 打印机共享等功能 在使用过程当中 通过维护局域网网络安全 能够有效地保护资料安全 保
  • 行为驱动测试_我如何知道自己是否正在测试行为?

    行为驱动测试 在整个 测试气味 目录中 有迹象表明您可能正在测试您的代码 而不是其行为 即使在最不起眼的单元测试中 首要规则也应该是 使您的代码执行其工作 并查看结果如何 编写代码及其测试的开发人员在为代码的每一行和每个分支进行测试时 常常
  • 2023第十四届蓝桥杯国赛 C/C++ 大学 B 组 (赛后记录)

    2023 第十四届蓝桥杯国赛 C C 大学 B
  • DDR CTRL介绍

    译文 DDR4 Initialization Training and Calibration
  • 正则表达式(一)——基础之匹配字符,数量,边界

    1 概念 1 1 正则表达式概念 正则表达式 又称正规表达式 规则表达式 正规表示法等 英语 Regular Expression 在代码中常简写为regex regexp或RE 计算机科学的一个概念 正则表达式使用单个字符串来描述 匹配一
  • 图形学光照

    图形学光照 一 概述 二 环境光照 三 漫反射光照 四 镜面光照 五 光照公式 六 Demo 一 概述 现实世界的光照是极其复杂的 而且会受到诸多因素的影响 这是我们有限的计算能力所无法模拟的 因此OpenGL的光照使用的是简化的模型 对现
  • MES系统 PHP常见技术

    1 刚开始接触Web需要练习以下知识 编辑表格 修改 删查 https www cnblogs com yuyu1993 p 5598797 html 流程审批 https www cnblogs com ping04 p 7927468
  • 【程序员面试金典】请编写一个方法,返回某集合的所有非空子集。

    题目描述 请编写一个方法 返回某集合的所有非空子集 给定一个int数组A和数组的大小int n 请返回A的所有非空子集 保证A的元素个数小于等于20 且元素互异 各子集内部从大到小排序 子集之间字典逆序排序 见样例 测试样例 123 456

随机推荐

  • 以太坊eip150和eip158

    以太坊网络将在区块号到达2463000时进行一次硬分叉 具体分叉时间将会在中国时间2016年10月18日晚8 9点 可以在 https fork codetract io 看到本次分叉的倒计时网页 作为一个用户 我需要做些什么 下载最新版本
  • 在visio中插入数学公式

    前提 安装 visio 2013 Mathtype 依次点击 插入 对象 弹出对话框 插入对象 在弹出的对话框内点击 Microsoft 公式 3 0 点击 确定 弹出 Mathtype 编辑界面 即可插入公式
  • C#基础知识

    主要用于只是巩固和新接触的人使用 一 什么是C C 是有C C 衍生出来的一种面向对象编程语言 是一种安全的 稳定的 简单的 优雅的一种语言 他是运行于 Net Franmework智商的高级程序设计语言 二 C 第一个程序 Hellow
  • Java复习:IO流

    File类的使用 IO流原理及流的分类 1 I O是Input Output的缩写 I O技术是非常实用的技术 用于 处理设备之间的数据传输 如读 写文件 网络通讯等 2 Java程序中 对于数据的输入 输出操作以 流 stream 的 方
  • FastDFS,Redis,Solr,ActiveMQ核心技术整合四

    02 商品分类选择 分析 前端js 03 商品分类选择 分析 数据库 JJTree渲染过程解析 parent id为0就是父节点 is parent为1说明下面有子节点 state1正常2删除 tree组件有ztree 异步控件树每个节点都
  • sklearn - 岭回归(Ridge)和套索回归(Lasso)

    一 拟合 一 过拟合与欠拟合 机器学习中一个重要的话题便是模型的泛化能力 泛化能力强的模型才是好模型 对于训练好的模型 若在训练集表现差 不必说在测试集表现同样会很差 这可能是欠拟合导致 若模型在训练集表现非常好 却在测试集上差强人意 则这
  • Qt常用控件、警告与问题总结

    Qt Creator 转 Visual Studio Qt Creator转Visual Studio 在pro文件所在文件夹 打开cmd qmake tp vc x Visual Studio转Qt Creator Qt VS Tools
  • Springboot @Lazy注解

    作者 小猿聊编程 更多资料 https www techlearn cn 作用 Lazy可以实现bean的延迟初始化 在spring容器启动时不初始化Bean 直到用到这个Bean的时候才去初始化 使用范围 任意类型 方法 构造器 参数 字
  • Unity 检测物体是否在屏幕内

  • sql查询无结果设置默认值

    笔记 最近SQL直挂图表数据显示无内容 看了下数据库发现表里没数据 三方图表默认显示文字 但是需求想显示结果0 所以要想办法把无结果得数据默认给一个默认值 查询字段通常分为 null两种 前提是有结果 但是字段可能没数据 用case whe
  • Eclipse Svn插件各个版本以及对应Svn Connector的下载地址

    Eclipse Svn插件各个版本以及对应Svn Connector的下载地址 http www polarion com products svn subversive download php 可供大家把包下载然后在Eclipse里面进
  • linux内核新版gpio配置

    新版gpio操作
  • 2019年第十届蓝桥杯真题解析

    难度 难 算法 二分法 问题描述 小明公司的办公区有一条长长的走廊 由 N 个方格区域组成 如下图所示 走廊内部署了 K 台扫地机器人 其中第 i 台在第 Ai 个方格区域中 已知扫地机器人每分钟可以移动到左右相邻的方格中 并将该区域清扫干
  • 一键清空朋友圈软件_微信清理朋友圈app下载-微信清理朋友圈下载v1.8.0 安卓版-西西软件下载...

    微信清理朋友圈app一款强大的微信清理工具 当你想要重置自己的微信号并删除所有的内容之时 又觉得一条条删太麻烦了 就可以用到这款神器工具 可以帮助你一键删除掉朋友圈内的所有内容 帮助你轻松的重置微信号 十分的方便 赶快下载微信清理朋友圈ap
  • CentOS系统性能工具 sar 示例!

    安装配置 Sysstat 安装 Sysstat 包 Ubuntu sudo apt get install sysstat CentOS yum install sysstat CentOS rpm ivh sysstat 10 0 0 1
  • 使用FFmpeg进行屏幕录像和录音

    有些时候我们需要对屏幕进行录制 比如制作视频教程 录制直播等 然而这方面的软件多是收费的 即使是免费试用版的还有水印 特别烦人 下面介绍使用FFmpeg进行屏幕录制的方法 Windows 先安装dshow软件 Screen Capturer
  • iOS推送(利用极光推送)

    本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装 不喜勿喷 1 首先说一下推送的一些原理 Push的原理 Push 的工作机制可以简单的概括为下图图中 Provider是指某个iPhone软件的Push服务器 这篇文章我将
  • Linux SSH登录服务器报ECDSA host key “ip地址“ for has changed and you have requested strict checking错误

    Linux SSH命令用了那么久 第一次遇到这样的错误 ECDSA host key ip地址 for has changed and you have requested strict checking 记录下方便记忆 解决方案 在终端上
  • 系统没有wmi服务器,系统没有WMI服务怎么办.WMI错误修复方法

    WMI是一项核心的Windows管理技术 WMI作为一种规范和基础结构 通过它可以访问 配置 管理和监视几乎所有的Windows资源 比如用户可以在远程计算机器上启动一个进程 设定一个在特定日期和时间运行的进程 远程启动计算机 获得本地或远
  • XCTF_Web_新手练习区:simple_js(源代码详解)

    文章目录 第七题 simple js 源代码详解 目标 Writeup 源代码详解 第七题 simple js 源代码详解 目标 掌握有关js的知识 Writeup 进入环境后我们遇到了输入密码 于是我们随便输入一个密码 点击确定 之后啥也