Contents

A Javascript journey with only six characters展示了只用()+[]!这6个字符能做什么事情。JSFuck是一个网站,把你输入的任何Javascript语句翻译成只用这6个字符表示的形式,比如alert(1)可以用如下的6个字符代码替代,是不是大开眼界:)。

1
(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]

下面简单说一下这个原理。首先,下面的是Javascript的规则:

  1. !开头会被转换成布尔值
  2. +开头会被转换成数值
  3. []开头会被转换成字符串

也就是说如下的这些语句都是true。

1
2
3
![] === false
+[] === 0
[]+[] === ""

这样我们就能做一些有意思的事情了,比如如下的代码:

1
2
3
4
![]+[] === "false"
+!![] === 1
------------------------
(![]+[])[+!![]] === "a" // same as "false"[1]

这样我们其实就能从()+[]!这6个字符中得到如下的字符了:truefalseaeflrstu

我们还能用如下的方式拿到”undefined”。

1
[][[]] + [] === "undefined"

另外Number类型的toString方法有一个可以取底数的功能,如下所示,这样我们就能拿到0-9a-z的所有字符了。如下所示:

1
2
3
4
5
6
(12)["toString"](10) === "12" // base 10 - normal to us
(12)["toString"](2) === "1100" // base 2, or binary, for 12
(12)["toString"](8) === "14" // base 8 (octonary) for 12
(12)["toString"](16) === "c" // hex for 12
(10)["toString"](36) === "a"
(35)["toString"](36) === "z"

那么我们如何拼凑一个函数呢?

1
[]["fill"]["constructor"] === Function

Function("alert(1)")能返回给我们如下的函数

1
2
3
function anonymous() {
alert(1)
}

也就是说如果我写下面的语句,那么就会在浏览器中弹出一个对话框来。

1
[]["fill"]["constructor"]("alert(1)")()

而这条语句中的所有字符都能用()+[]!这6个字符表示出来,这样大家就理解了那个JSFuck网站是如何工作的了吧。

Contents