攻防世界 - Web - Level 3 | simple_js

关注这个靶场的其它相关笔记:攻防世界(XCTF) —— 靶场笔记合集-CSDN博客

0x01:考点速览

本题考察的是 JS 的代码审计,以下是你需要了解的知识点:

  • String.fromCharCode() -> 将接收的 Unicode 编码转换成字符或字符串

0x02:Write UP

从题目来看,本题考查的就是一个前端 JS 的代码审计:

进入靶场,直接弹出一个框框,让我们输入 password,这里我们随便输入:

提示我们是假的密码,这里我们忽略,查看目标代码:

好了,接下来就是紧张刺激的代码审计了,下面是 1.0 版本的审计结果:

 <script>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(',');    // 把 pass 转换成数组var i, j, k, l = 0,m, n, o, p = "";i = 0;j = tab.length;         // j = 输入的密文数组的长度k = j + (l) + (n = 0);  // k = j + l + ( n = 0) = j + 0 + 0 = j -> 狗的,k 的大小和也等于输入密文的长度n = tab2.length;        // n = pass 数组的长度for (i = (o = 0); i < (k = j = n); i++) {   // o 转换为了 number 型,k,j 的长度也重新变为了 pass 数组的长度o = tab[i - l];     // o = tab[i - l] -> l 的值就没变过 -> o = tab[i] -> 依次取出我们输入的密文数组中的元素p += String.fromCharCode((o = tab2[i])); // o = tab2[i] -> 依次取出 pass 数组中的元素,并转换为字符,追加到 p 后if (i == 5) break;  // 取 5 个元素后,跳出循环}for (i = (o = 0); i < (k = j = n); i++) {   // k,j 的长度依旧为 pass 数组的长度o = tab[i - l]; // 同上个循环一样if (i > 5 && i < k - 1) // k 为 pass 数组的长度, k-1 为 pass 数组最后一个元素的位置 -> < k -1 -> 对方根本没想过要取出最后一个元素p += String.fromCharCode((o = tab2[i]));    // 取出 pass 数组中下标从6到倒数第二个元素,并转换为字符,追加到 p 后}p += String.fromCharCode(tab2[17]); // 单独取一个 17 ? -> 纯纯恶心人,你数数 pass 中有 18 组数字,最后一个的下标就是 17pass = p;return pass;    // 返回 pass 密文}// String["fromCharCode"]() -> String.fromCharCode() 的另一种写法,该方法接收一个或多个 Unicode 字符编码,返回一个字符串。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'); // window.prompt() 获取用户的输入赋值给 halert(dechiffre(h)); // 调用 dechiffre() 函数并传入 h 作为参数 -> 将最终结果弹出</script>

通过 1.0 的代码审计,我们发现了,其最终的输出和我们的输入没有任何关系,另外,它返回的结果也只是把预定的 pass 中的数组转换为字符后的结果,所以上面的代码完全可以简化为下面的样子:

 <script>function decode(pass) {var pass_array = pass.split(",");   // 将 pass 按 , 号隔开var result = "";for (i = 0; i < pass_array.length; i++) {result += String.fromCharCode(pass_array[i]);}console.log(result);}var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";decode(pass);</script>

其输出的值,和嘲讽我们的值是一样,其实动动脑也能发现,pass 后面的两个数字为 “72,65”,72 可能没法一下子反应,但 65 不就是 A 的 ASCII 码值嘛。

Ok,分析完目标狗的很的加密函数,下面问题就是正确的密钥在哪里?我们可以发现,目标中存在一大串神秘的以 “\x” 开头的字符,并且也同样调用了 dechiffre () 函数,只不过没输出出来。

看到 “\x” 其实很简单就能联想到十六进制字符,那我们就尝试把十六进制字符转成字符串看看是啥(这里我使用的还是开发者工具里的 Console,里面会自动转换):

可以发现,其转换完成后也是一串数字,还是一串用 “,” 号分隔的数字,直接传入我们编写的解密函数中:

其实已经拿到 Flag 了,别忘了题目一开始的提示(Flag 的格式为 Cyberpeace {xxxxxxxxx})。

不知道为啥,写这道题目让我有一个感慨:一个东西,外围防御做的越好,说明他的内部越薄弱。本题用花里胡哨的代码扰乱我们的思路,但其实只做了两件事,把密码转成 ASCII 码值,再把 ASCII 码值转成十六进制,对 Pwn 熟悉的小伙伴估计不用看 JS 代码,凭借对密码格式的熟悉,两部就解出来了(上面写函数的过程完全可以省略的)。

0x03:参考资料

  • JavaScript fromCharCode () 方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/66292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关系分类(RC)模型和关系抽取(RE)模型的区别

目标不同 关系分类模型&#xff1a;对给定的实体对在给定句子中预测其关系类型。两阶段&#xff08;RC&#xff09; 关系抽取模型&#xff1a;从句子中识别出所有潜在实体对&#xff0c;并为其预测关系类型。一阶段&#xff08;NERRE&#xff09; 训练/预测阶段输入输出数据不…

永磁同步电机控制算法--最大转矩电流比控制(牛顿迭代法)

一、原理介绍 搭建了基于牛顿迭代法的MTPA双闭环矢量控制系统 二、仿真验证 在MATLAB/simulink里面验证所提算法&#xff0c;采用和实验中一致的控制周期1e-4&#xff0c;电机部分计算周期为1e-6。仿真模型如下所示&#xff1a; 对直接公式计算法和牛顿迭代法进行仿真对比验…

数据结构—树的定义与性质

目录 1.树的定义 2.基本术语 3.树的性质 1.树的定义 树是n&#xff08;n≥0&#xff09;个结点的有限集。 n0时&#xff0c;称为空树。 &#xff08;1&#xff09;树有且只有一个特定的结点&#xff0c;称为根节点。 &#xff08;2&#xff09;当n>1时&#xff0c;其余…

vue数据请求通用方案:axios的options都有哪些值

Axios 是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 Node.js 中。 在使用 Axios 发送请求时&#xff0c;可以通过传递一个配置对象来指定请求的各种选项。 以下是一些常用的 Axios 配置选项及其说明&#xff1a; 1.url: &#xff08;必需&#xff09;请求的 …

选择器(结构伪类选择器,伪元素选择器),PxCook软件,盒子模型

结构为类选择器 伪元素选择器 PxCook 盒子模型 (内外边距&#xff0c;边框&#xff09; 内外边距合并&#xff0c;塌陷问题 元素溢出 圆角 阴影: 模糊半径&#xff1a;越大越模糊&#xff0c;也就是越柔和 案例一&#xff1a;产品卡片 <!DOCTYPE html> <html lang&q…

ThinkPHP 8高效构建Web应用-控制器

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 控制器无须特…

模拟出一个三维表面生成表面点,计算体积,并处理边界点

python代码 生成表面点,计算体积,并处理边界点,最终模拟出一个三维表面。 步骤: 初始参数设置: initial_fixed_point:一个初始固定点的坐标。 slop_thre:坡度阈值。 v_thre:体积阈值。 slope_rad:将坡度从度转换为弧度。 step_size:步长。 lam_x, lam_y:泊松分布的…

Elasticsearch 入门教程

掌握Elasticsearch&#xff1a;从入门到入门 一、ES 背景1.1 ElasticSearch 的背景1.2 ElasticSearch 的应用场景 二、ES 简介2.1 ElasticSearch 简介2.2 ElasticSearch 的定义与特点2.3 ElasticSearch 与传统数据库的区别2.4 ElasticSearch 的优势和劣势 三、ES 的核心概念3.1…

Multisim更新:振幅调制器+解调器(含仿真程序+文档+原理图+PCB)

前言 继3年前设计的&#xff1a;Multisim&#xff1a;振幅调制器的设计&#xff08;含仿真程序文档原理图PCB&#xff09;&#xff0c;有读者表示已经不能满足新需求&#xff0c;需要加上新的解调器功能&#x1f602;&#x1f602;&#x1f602;&#xff0c;鸽了很久这里便安排…

区块链方向学习路线

学习路线图 下面是登链社区给出的区块链开发者的学习路线图 学习路线建议 对于一个区块链方向的学习者而言&#xff0c;首先要了解的是区块链理论知识&#xff0c;当你了解了区块链的理论知识之后&#xff0c;下面有三个方向来学习&#xff0c;可以通俗的理解为区块链方向的后…

springboot547产业园区智慧公寓管理系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装产业园区智慧公寓管理系统软件来发挥其高效地信息处理的作用…

【电源专题】为什么测试电源的SW波形上冲振荡之前的0V电位要先来个小的下降

在同步电源的开关节点SW波形测试中,你可能会发现周期性的SW波形在上升前的一小段时间时间内会有一个小小的下跌,这个下跌会低于0V。那么这个下跌是怎么来的呢? 如下所示为某降压转换器的SW开关节点波形: 其展开后可以看到在上升之前有20ns左右的时间,SW电压是下跌…

操作系统大题整理

专题一 程序代码题&#xff1a;程序设计与分析&#xff0c;主要考的是线程&#xff0c;多线程的并发&#xff1f; 大题第一问&#xff08;1&#xff09;操作系统的结构有哪几种常用的结构&#xff1f; 宏内核&#xff1a;宏内核是将操作系统的主要功能模块都集中在内核的一种结…

web安全常用靶场

这里写自定义目录标题 phpstydy2018pikachuxss-labs phpstydy2018 网盘地址 提取码: nxnw ‌phpStudy是一款专为PHP开发者设计的集成环境工具&#xff0c;主要用于简化PHP开发环境的搭建过程。‌ 它集成了Apache、MySQL、PHP等核心组件&#xff0c;用户只需进行一次性安装&a…

【yolov8自卸卡车-挖掘机-装载机检测】

yolov8自卸卡车-挖掘机-装载机检测 YOLOv8算法介绍数据集和模型下载数据集准备数据配置文件&#xff08;data.yaml&#xff09;安装依赖模型训练步骤 YOLOv8算法介绍 YOLOv8是You Only Look Once&#xff08;YOLO&#xff09;算法家族的最新版本&#xff0c;它是一种单阶段目标…

扩散模型论文概述(二):Google系列工作【学习笔记】

视频链接&#xff1a;扩散模型论文概述&#xff08;二&#xff09;&#xff1a;Google系列工作_哔哩哔哩_bilibili 本视频讲的是Google在图像生成的工作。 同样&#xff0c;第一张图片是神作&#xff0c;总结的太好了&#xff01; 在生成式AI的时代&#xff0c;OpenAI和Google不…

redis常用数据类型

在Redis中&#xff0c;有几种数据类型是非常常用且核心的&#xff0c;它们各自有着独特的应用场景和优势。 1. 字符串&#xff08;String&#xff09;&#xff1a; • 这是Redis中最基本、最常用的数据类型。 • 字符串可以是任何形式的二进制数据&#xff0c;包括文本、图片等…

基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 基于氢氧燃料电池的分布式三相电力系统Simulink建模与仿真&#xff0c;仿真输出燃料电池中氢氧元素含量变化以及生成的H2O变化情况。 2.系统仿真结果 3.核心程序与模型 版本…

UE5.3 虚幻引擎 Windows插件开发打包(带源码插件打包、无源码插件打包)

0 引言 随着项目体量的增大&#xff0c;所有代码功能都放一起很难管理。所以有什么办法可以将大模块划分成一个个小模块吗。当然有&#xff0c;因为虚幻引擎本身就遇到过这个问题&#xff0c;他的解决办法就是使用插件的形式开发。 例如&#xff0c;一个团队开发了文件I/O模块插…

MySQL 的事务与多版本并发控制(MVCC)的那些事

什么是事务原子性:一致性隔离性 问题1: 为什么MySQL要使用mvcc实现隔离性而不使用 锁 解决并发问题?持久性 问题2: MySQL 不是磁盘数据库吗,持久化为什么是 redo log 保证的?问题 3: redo log 储存了什么东西,持久化(崩溃恢复是怎么做的?)问题 4 : MySQL 的 bing log (二进制…