nssctf_astJS

在这里插入图片描述
下载,发现是个json文件,打开,在这里插入图片描述
AI说这是AST,那接下来肯定就要还原成js代码,

从 AST 还原 JS 代码的三种方法

按上手难度从易到难排列,CTF 解题优先用工具一键还原。


一、在线工具一键还原(最快,首选)

最通用的是 AST Explorer,支持几乎所有主流 JS 解析器的 AST 反编译,开箱即用。

  1. 打开网址:https://astexplorer.net/
  2. 顶部选择语言为 JavaScript,解析器默认选 acorn@babel/parser 即可(和生成 AST 的解析器一致时还原度最高)。
  3. 把 AST 的 JSON 完整粘贴到左侧编辑区。
  4. 右侧会自动生成还原后的 JavaScript 源代码。

补充:也可以用 Esprima 在线反编译工具,搜索「esprima online decode」即可找到,操作逻辑完全一致。


二、本地 Node.js 代码还原

适合批量处理、写自动化解密脚本,常用两个成熟库:escodegen@babel/generator

方法 1:escodegen(轻量,兼容标准 ESTree 格式)
  1. 安装依赖
npm install escodegen
  1. 还原代码
const escodegen = require('escodegen');
// 把你的AST对象赋值给ast变量
const ast = {
  "type": "Program",
  "body": [/* 你的AST完整内容 */]
};

// 生成JS代码
const code = escodegen.generate(ast);
console.log(code);
方法 2:@babel/generator(兼容 Babel 生态的 AST)

如果 AST 是 Babel 解析生成的,用这个还原度最高:

npm install @babel/generator
const generate = require('@babel/generator').default;
const ast = { /* 你的AST */ };
const { code } = generate(ast);
console.log(code);

三、手动逐步还原(理解原理)

AST 本质是把 JS 代码按语法规则拆成了树形节点,每个type对应一种语法结构,对照节点类型就能逐行翻译。结合你这道题的 AST,核心对应关系如下:

表格

AST 节点类型对应 JS 语法本题对应位置
Program整个脚本文件(根节点)最外层结构
FunctionExpression + CallExpression立即执行函数 (IIFE)最外层 (function(){...})()
FunctionDeclaration函数声明function bE(str, key) { ... }
VariableDeclaration + VariableDeclarator变量声明var arr = str.split('')
CallExpression函数调用str.split('')arr.map(...)String.fromCharCode(...)
MemberExpression对象成员访问str.splitarr.map
BinaryExpression二元运算表达式i.charCodeAt() ^ key
Identifier标识符(变量名 / 函数名)strkeyarrbE
Literal字面量(字符串 / 数字)空字符串''、密钥11、密文字符串
ReturnStatementreturn 语句return arr.map(...).join('')
BlockStatement代码块(大括号包裹)函数体的 { }
ArrowFunctionExpression箭头函数i => { ... }

还原逻辑就是从根节点开始,递归遍历每个子节点,按语法规则拼接成字符串。以你这道题为例,还原路径为:

  1. 根节点Program → 顶层是一个立即执行函数
  2. 函数体内先声明函数bE,参数为strkey
  3. bE内部先声明变量arr,赋值为str.split('')
  4. 返回 arr.map(箭头函数).join('')
  5. 箭头函数内部返回 String.fromCharCode(i.charCodeAt() ^ key)
  6. 最后执行 console.log(bE(密文, 11))

打开https://www.ud5.com/tool/ast-explorer,这个网址
在这里插入图片描述
然后转化后得到

(function () {
    function bE(str, key) {
        var arr = str.split('');
        return arr.map(function (i) {
            return String.fromCharCode(i.charCodeAt() ^ key);
        }).join('');
    }
    console.log(bE('EXXH_Mpjx\x7fBxYnjggrM~eerv', 11));
}());

按f12
在控制台输入这段代码,回车运行,得到flag在这里插入图片描述
本题知识点:
1、AST 全称 Abstract Syntax Tree(抽象语法树),是源代码经过语法解析后生成的树形结构化表示。它会把代码的语法结构、逻辑层级,用标准化的节点对象完整描述出来,是代码和程序处理逻辑之间的「中间桥梁」。

你截图里的 AST Explorer 就是一个在线可视化工具:左侧输入 JavaScript 源码,右侧就会实时展示对应的 AST 树形结构。


AST 的核心结构(结合你截图的例子)

它遵循统一的 ESTree 规范,每个节点都有固定的字段,截图里的示例结构对应关系如下:

  1. 根节点 Program
    代表整个 JS 程序,是所有节点的顶层容器,记录了代码的起止位置、源码类型等。
  2. 子节点对应语法单元
    每一个节点对应代码里的一个语法片段:
    • VariableDeclaration:对应源码里的 let tips = [...] 变量声明
    • FunctionDeclaration:对应源码里的 function printTips() {} 函数声明
  3. 通用字段
    • type:节点的语法类型(比如变量声明、函数、表达式等)
    • start / end:节点在源码里的字符偏移位置,用来定位对应代码
    • 不同类型的节点还有各自的专属字段,比如函数节点会记录函数名、参数、函数体。

AST 的核心用途

所有代码分析、转换、生成类的工具,都基于 AST 实现:

  • 代码转译:比如 Babel,把 ES6+ 代码解析成 AST,再把 AST 转换成兼容低版本的 JS 代码
  • 代码检查:比如 ESLint,基于 AST 识别语法错误、不符合规范的写法
  • 代码压缩 / 混淆:基于 AST 删除冗余、修改变量名,再生成压缩后的代码
  • 代码生成:你之前使用的 escodegen,就是把 AST 反向还原成 JS 源码的工具;而截图里的 acorn 解析器,负责反向的「JS 源码 → AST」解析,二者是互逆的过程。

2、escodegen 是一个轻量、高性能的 JavaScript 开源库,核心能力是将符合 ESTree 规范的 ECMAScript 抽象语法树(AST),反向生成(还原)为可执行的 JavaScript 源代码
它和 acornespree 等解析器是完全互逆的工具:

  • 解析器(如 acorn):JavaScript 源码 → 解析 → AST 语法树
  • escodegen:AST 语法树 → 生成 → JavaScript 源码

3.、JS代码可以在浏览器中直接运行

内容概要:本文围绕基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化问题展开研究,旨在通过智能优化算法有效降低网络损耗、提升电压质量并增强配电系统的运行效率。研究系统地介绍了小生境粒子群算法的改进策略,构建了包含功率平衡、电压安全、设备容量等多重约束的多目标优化模型,并采用IEEE标准测试系统进行仿真验证,充分证明了该方法在处理多目标、多约束优化问题上的优越性能。全文涵盖从数学建模、算法设计、约束处理到多目标折衷解选择的完整流程,并配套提供了完整的Matlab代码实现,便于读者复现结果与进行二次开发。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事电力系统优化、智能算法研究或相关领域工作的研究生、科研人员及工程技术人员。; 使用场景及目标:①解决配电网中有功与无功功率的协同优化问题,实现节能降耗与电压稳定;②学习并掌握多目标粒子群算法及其小生境改进策略在电力系统中的具体应用与实现细节;③通过Matlab代码进行仿真,加深对智能优化算法在工程实践中应用的理解,提升科研与工程实践能力。; 阅读建议:此资源以理论分析与代码实现紧密结合的方式呈现,建议读者在深入理解算法原理和模型构建的基础上,结合所提供的Matlab代码进行仿真实验,重点关注参数设置、收敛性分析与结果可视化等关键环节,从而实现从理论认知到实践验证的完整闭环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值