
下载,发现是个json文件,打开,
AI说这是AST,那接下来肯定就要还原成js代码,
从 AST 还原 JS 代码的三种方法
按上手难度从易到难排列,CTF 解题优先用工具一键还原。
一、在线工具一键还原(最快,首选)
最通用的是 AST Explorer,支持几乎所有主流 JS 解析器的 AST 反编译,开箱即用。
- 打开网址:https://astexplorer.net/
- 顶部选择语言为
JavaScript,解析器默认选acorn或@babel/parser即可(和生成 AST 的解析器一致时还原度最高)。 - 把 AST 的 JSON 完整粘贴到左侧编辑区。
- 右侧会自动生成还原后的 JavaScript 源代码。
补充:也可以用 Esprima 在线反编译工具,搜索「esprima online decode」即可找到,操作逻辑完全一致。
二、本地 Node.js 代码还原
适合批量处理、写自动化解密脚本,常用两个成熟库:escodegen 和 @babel/generator。
方法 1:escodegen(轻量,兼容标准 ESTree 格式)
- 安装依赖
npm install escodegen
- 还原代码
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.split、arr.map |
BinaryExpression | 二元运算表达式 | i.charCodeAt() ^ key |
Identifier | 标识符(变量名 / 函数名) | str、key、arr、bE |
Literal | 字面量(字符串 / 数字) | 空字符串''、密钥11、密文字符串 |
ReturnStatement | return 语句 | return arr.map(...).join('') |
BlockStatement | 代码块(大括号包裹) | 函数体的 { } |
ArrowFunctionExpression | 箭头函数 | i => { ... } |
还原逻辑就是从根节点开始,递归遍历每个子节点,按语法规则拼接成字符串。以你这道题为例,还原路径为:
- 根节点
Program→ 顶层是一个立即执行函数 - 函数体内先声明函数
bE,参数为str和key bE内部先声明变量arr,赋值为str.split('')- 返回
arr.map(箭头函数).join('') - 箭头函数内部返回
String.fromCharCode(i.charCodeAt() ^ key) - 最后执行
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 规范,每个节点都有固定的字段,截图里的示例结构对应关系如下:
- 根节点
Program
代表整个 JS 程序,是所有节点的顶层容器,记录了代码的起止位置、源码类型等。 - 子节点对应语法单元
每一个节点对应代码里的一个语法片段:VariableDeclaration:对应源码里的let tips = [...]变量声明FunctionDeclaration:对应源码里的function printTips() {}函数声明
- 通用字段
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 源代码。
它和 acorn、espree 等解析器是完全互逆的工具:
- 解析器(如 acorn):JavaScript 源码 → 解析 → AST 语法树
- escodegen:AST 语法树 → 生成 → JavaScript 源码
3.、JS代码可以在浏览器中直接运行

4267

被折叠的 条评论
为什么被折叠?



