这是JSFuck,一种深奥的编程语言,它实际上是有效的 JavaScript,因此您不需要任何特殊的解释器/编译器来运行它。
最流行的是只使用 6 个字符 ( []()!+
),但您的有点不同,因为它还使用/
, =
, "
, '
, ,
, {
,}
和
(空白)。
它通过利用 JavaScript 的一些不错的特性来工作。
例如,我们知道这[]
是一个真值,因此![]
yield false
。
使用相同的逻辑,我们可以true
通过执行!![]
.
数字也可以实现。我们知道false
等于0
,所以下面的表达式是有意义的:0 + false == 0
,对吗?它确实如此。我们知道false
可以写成![]
,并且我们知道我们可以省略0
表达式左侧的 : +![] == 0
。
true
和也可以这样说1
:+!![]
数量2
可以通过将两个1
s:相加来实现(+!![])+(+!![])
,以此类推。
有了这样的逻辑,你几乎可以做任何事情。
例如,获取字母的一种流行方法"a"
是生成NaN
结果,将其转换为字符串 ( "NaN"
),然后在索引处获取字母1
,即"a"
.
好吧..我们知道我们可以得到"alert(1)"
,但是我们如何执行呢?
我们不能使用eval
,因为这将需要使用 JSFuck 上不允许的字符。
好吧,大多数人这样做的方式是这样的:
- 识别 的一个众所周知的函数
Array.prototype
,假设indexOf
- 获取其构造函数实例
- 将字符串化代码传递给此构造函数
- 执行结果
所以,作为一个总结:
// You can try this on your browser!
[]["indexOf"]["constructor"]("alert(1)")()
我们知道我们可以在 JSFuck 上生成字母字符,我们也知道我们可以生成数字,所以上面那行代码实际上是很有可能的。