3

This code is equal to alert(1), but how does it work ? I don't see eval here.

/ㅤ/-[ㅤ=''],ᅠ=!ㅤ+ㅤ,ㅤㅤ=!ᅠ+ㅤ,ㅤᅠ=ㅤ+{},ᅠㅤ=ᅠ[ㅤ++],ᅠᅠ=ᅠ[ᅠㅤㅤ=ㅤ
],ᅠㅤᅠ=++ᅠㅤㅤ+ㅤ,ㅤㅤㅤ=ㅤᅠ[ᅠㅤㅤ+ᅠㅤᅠ],ᅠ[ㅤㅤㅤ+=ㅤᅠ[ㅤ]+(ᅠ.ㅤㅤ+ㅤᅠ)[ㅤ]+ㅤㅤ[ᅠㅤᅠ]+ᅠㅤ+ᅠᅠ+ᅠ
[ᅠㅤㅤ]+ㅤㅤㅤ+ᅠㅤ+ㅤᅠ[ㅤ]+ᅠᅠ][ㅤㅤㅤ](ㅤㅤ[ㅤ]+ㅤㅤ[ᅠㅤㅤ]+ᅠ[ᅠㅤᅠ]+ᅠᅠ+ᅠㅤ+"(ㅤ)")()
4

1 回答 1

3

这是JSFuck,一种深奥的编程语言,它实际上是有效的 JavaScript,因此您不需要任何特殊的解释器/编译器来运行它。

最流行的是只使用 6 个字符 ( []()!+),但您的有点不同,因为它还使用/, =, ", ', ,, {,}(空白)。

它通过利用 JavaScript 的一些不错的特性来工作。

例如,我们知道这[]是一个真值,因此![]yield false

使用相同的逻辑,我们可以true通过执行!![].

数字也可以实现。我们知道false等于0,所以下面的表达式是有意义的:0 + false == 0,对吗?它确实如此。我们知道false可以写成![],并且我们知道我们可以省略0表达式左侧的 : +![] == 0

true和也可以这样说1+!![]

数量2可以通过将两个1s:相加来实现(+!![])+(+!![]),以此类推。

有了这样的逻辑,你几乎可以做任何事情。

例如,获取字母的一种流行方法"a"是生成NaN结果,将其转换为字符串 ( "NaN"),然后在索引处获取字母1,即"a".

好吧..我们知道我们可以得到"alert(1)",但是我们如何执行呢?

我们不能使用eval,因为这将需要使用 JSFuck 上不允许的字符。

好吧,大多数人这样做的方式是这样的:

  • 识别 的一个众所周知的函数Array.prototype,假设indexOf
  • 获取其构造函数实例
  • 将字符串化代码传递给此构造函数
  • 执行结果

所以,作为一个总结:

// You can try this on your browser!
[]["indexOf"]["constructor"]("alert(1)")()

我们知道我们可以在 JSFuck 上生成字母字符,我们也知道我们可以生成数字,所以上面那行代码实际上是很有可能的。

于 2017-11-27T23:10:19.367 回答