我的一位同事给我发了一段代码,上面只有括号()[] {},以及标志和惊叹号。
[][(![]+[])[!+[]+!![]+!![]]+([]+{})[+!![]]+(!![]+[])[+!![]]+(!![]+[])[+[]]]
它继续这样......
这模糊地让我想起Brainfuck,但我找不到像这样写的任何深奥的语言。
你能帮我理解它是什么语言吗?
答案 0 :(得分:8)
此链接很好地解释了这种javascript代码的工作原理: http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html
以下是简短摘要:
使这项工作的主要技巧是类型转换:
[]
是一个空数组
+[] === 0
将此空数组转换为数字,即零
!+[] === true
然后将零转换为false并将其否定为真
!+[]+!+[] === 2
基本上是添加true + true。因此,将真实状态转换为1,然后添加。这样你就可以获得任意数字。
但数字还不足以编程,对吧?
[]+{} === "[object Object]"
我们可以通过向任意事物添加空对象({}
)来获取字符串,例如空数组([]
)。
([]+{})[+!+[]] === "o"
然后我们可以通过对该字符串("abc"[1] == "b"
)执行数组访问来获取字符串的第二个字符。
但我们仍然只限于该字符串中的10个字符。我们可以通过将其他东西转换成字符串来扩展它:
"undefined" === [][+[]]+[]
(访问数组的未定义索引),
"NaN" === +{}+[]
(将对象强制转换为数字),
"true" === !![]+[]
,
"false" === ![]+[]
然后你仍然没有任意字符,但是从这里有几种方法可以获得它们。例如,如果您要定位浏览器,则可以使用btoa
函数(btoa
将字符串作为输入并返回其的base64编码版本)以获取任意ASCII字符。
然后最后一步是执行我们生成的字符串:
[]["sort"]["constructor"]("OUR_CODE")()
我们首先得到每个数组作为属性的sort函数。然后我们访问sort函数的构造函数,它是Function
函数。它可以用于构造任意匿名函数,并使用代码作为输入的字符串。最后,我们使用()
答案 1 :(得分:0)
它叫做JSFuck。在下面查看此链接。
JSFuck编码器:http://www.jsfuck.com/
解码JSFuck:How to decode a JSFuck script? https://enkhee-osiris.github.io/Decoder-JSFuck/