仅5个符号的JSF ** k?


47

这不是一个挑战,而是一个问题,我认为这是一个话题,因为

与解决编程难题或特定类型的挑战有关的非挑战性问题也在主题中。

现在开始问题:

是否可以仅用5个字母编写任何JavaScript代码?JSFuck已经用6个符号执行此操作,!+[]()但我想知道是否!需要该字符。

JSFuck将强制转换为字符串(通过添加一个空数组),强制转换为数字(通过在前面写一个+)以及通过否定转换为布尔值的组合工作。例如:

[]        \\ Empty array
+[]       \\ Cast to number -> 0
!+[]      \\ Negate -> true
!+[]+[]   \\ Cast to string -> "true"

从该字符串中,我们可以使用方括号(其中包含一个数字)提取所有字母,并且可以通过多次将true加在一起来制作任何数字。

像这样,可以找到很多字母,并将它们连接成字符串。能够创建的最重要的字符串是"constructor"因为它可用于Function从任何函数中获取,并且该对象可用于以JavaScript形式执行字符串:

[]["find"]                          \\ the function Array.prototype.find
[]["find"]["constructor"]           \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)

如您所见,!这里有2种用法:

  • 创建数字以从字符串中选择字母。
  • 强制转换为布尔值以获取"true""false"

这2个中的第一个也可以使用++增量器完成,而不是直接在上完成0,但可以在数组内的元素上使用:

+[]          \\ 0
[+[]]        \\ [0]
[+[]][+[]]   \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]]  \\ also works because ++ casts to number

因此,所有数字都可以不创建!

第二个比较困难。的重要性"true",并"false"在信件奠定"r""s",这都出现在"constructor"。我已经发现的所有其他字母"constructor"的方式"undefined""Infinity""NaN"并通过函数转换为字符串。

所以最终的问题:(如何)可以在创建布尔值,或字母"r""s"仅使用在JavaScript +[]()

这封信"l"也可能会有所帮助。它可以通过表格获得,null但我无法使用那5个符号获得该值。例如,如果我们已经有,它可以用来获取布尔值"s"

[]["includes"]()       \\ false
[+[]]["includes"](+[]) \\ true

这封信"l""k"一起可以访问"r"

([]+[])["link"]() \\ "<a href="undefined"></a>"

任何获取布尔值null或任何字母的方法r s l k都将非常有用!

我们拥有的图书馆:

Array.prototype.find:[] [(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+ (++ [[]] [+ []])+(++ [[]] [+ []])])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+( ++ [[]] [+ []])])+(([[] [[]] + [])[++ [[]] [+ []]])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])]))]]]

无穷大:+((++ [[]] [+ []] + [])+(([[[[]] + [])[(++ [[]] [+ []])+(+ + [[]] [+ []])+(++ [[]] [+ []])])+(++ [[]] [+ []] + [])+(+ []) +(+ [])+(+ []))

NaN:+ [] [[]]

未定义:[] [[]]

0:+ []

1:++ [[]] [+ []]

2:(++ [[]] [+ []])+(++ [[]] [+ []])

3:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])

4:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])

5:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])

6:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])

7:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])

8:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+ (++ [[]] [+ []])

9:(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+ (++ [[]] [+ []])+(++ [[]] [+ []])

一个:(+ [] [[]] + [])[++ [[]] [+ []]]

c:([] [(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[(++ [[]] [+ []]) +(++ [[]] [+ []])+(++ [[]] [+ []])]

d:([[] [[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])]

e:([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [ + []])]

f:([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [ + []])+(++ [[]] [+ []])]

i:([[] [[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [ + []])+(++ [[]] [+ []])+(++ [[]] [+ []])]

n:([[[[]] + [])[++ [[]] [+ []]]

o:([] [(([[[[]] + [])[(++ [[]] [+ []]))+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[(++ [[]] [+ []]) +(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])]

t:(+((++ [[]] [+ []] + [])+(([[[[]] + [])[(++ [[]] [+ []])+( ++ [[]] [+ []])+(++ [[]] [+ []])])+(++ [[]] [+ []] + [])+(+ [] )+(+ [])+(+ []))+ [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ [] ])]

u:([[[[]] + [])[+ []]

v:([[[(([[[]] + [])[(++ [[]] [+ []]))+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[(++ [[]] [+ []]) +(++ [[]] [+ []])+ [] +((++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])))

y:(+((++ [[]] [+ []] + [])+(([[[[]] + [])[(++ [[]] [+ []])+( ++ [[]] [+ []])+(++ [[]] [+ []])])+(++ [[]] [+ []] + [])+(+ [] )+(+ [])+(+ []))+ [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ [] ])+(++ [[]] [+ []])]

I:(+((++ [[]] [+ []] + [])+(([[[[]] + [])[(++ [[]] [+ []])+( ++ [[]] [+ []])+(++ [[]] [+ []])])+(++ [[]] [+ []] + [])+(+ [] )+(+ [])+(+ []))+ [])[+ []]

N:(+ [] [[]] + [])[+ []]

“”:([[[[(([[[]] + [])[(++ [[]] [+ []]))+(++ [[]] [+ []])+(+ + [[]] [+ []])+(++ [[]] [+ []])])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [ ])[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[+(++ [[]] [+ [] ] + [] +((++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(+ + [[]] [+ []])+(++ [[]] [+ []])))]]

(:([[[[(([[[]] + [])[(++ [[]] [+ []]))+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[+(++ [[]] [+ []] + [] +((++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []]))))]]

):([] [(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[+(++ [[]] [+ []] + [] +((++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []]))))]

{:([[[[(([[[]] + [])[(++ [[]] [+ []]))+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])] [[])[+(++ [[]] [+ []] + [] +((++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []]))))]]

}:(([] [(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])(([[[[]] [[]] [[++ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])])+(([[]] [+ []]])+(([[[] [[]] + [] )[(++ [[]] [+ []])+(++ [[]] [+ []])])+ [])[+(((++ [[]] [+ [] ])+(++ [[]] [+ []])+(++ [[]] [+ []])+ [] +((++ [[]] [+ []])+( ++ [[]] [+ []]))))]

。:((+(++ [[]] [+ []] + [] +(++ [[]] [+ []])+([[] [[]] + [])[(++ [ []] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])] +(++ [[]] [+ [] ] + [] +(+ [])+(+ [])))+ [])[++ [[]] [+ []]]

,:[[]] [([] [(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+ (++ [[]] [+ []])+(++ [[]] [+ []])])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+( ++ [[]] [+ []])])+(([[] [[]] + [])[++ [[]] [+ []]])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])])] + [])[(++ [[[]] [+ [ ]])+(++ [[]] [+ []])+(++ [[]] [+ []])] +([] [((([[[[[]] + [])[ (++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [ + []])])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+( ++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])+(([[ ] + [])[++ [[]] [+ []]])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])])+ [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [ []] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []] )] +([[] [[]] + [])[++ [[]] [+ []]] +([] [((([[[[]] + [])[(++ [[ ]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []]) ])+(([[] [[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[] ] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])+(([[[[[]] + []) [++ [[]] [+ []]])+(([[] [[]] + [])[(++ [[]] [+ []])+(++ [[]] [ + []])])]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])] +(+ [] [[]] + [])[++ [[]] [+ []]] +(+(((++ [[]] [+ []] + [])+(([[[[]] + [])[(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])])+( ++ [[]] [+ []] + [])+(+ [])+(+ [])+(+ []))+ [])[(++ [[]] [+ [] ])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[]] [+ []])+(++ [[ ]] [+ []])+(++ [[]] [+ []])]]([[]])+ []

这与codegolf.stackexchange.com/q/11690/194密切相关,如果该问题有JS答案,我将投票结束。实际上,对这个问题的答案很可能直接转化为对先前问题的答案,但是这种差异使得它的边界非常有限,我不想单方面结束。
彼得·泰勒

29
非常好的问题。我绝对赞成有关深奥编程和非常规计算模型的问题,但要为某些人进行密切投票做好准备,因为当前这还不完全适合人们在元数据上达成的共识。我很乐意为此树立此类问题的先例。:)
马丁·恩德

1
评论不作进一步讨论;此对话已转移至聊天
Alex A.

4
这样的问题使我希望对问题有赏识的功能。
xnor

1
我获得eval了2453个字符的window允许。
CalculatorFeline

Answers:


23

经过头脑风暴,结果似乎是,至少在现代浏览器上,没有办法做到这一点。

我将尝试总结整个过程,并添加一些理由,说明为什么在继续进行操作之前,我们已经穷尽了任何给定领域中的选项。然后,除非有一些令人惊奇的新见解(例如,每个人都忘记了JavaScript语法的特殊情况),否则很明显,没有办法获得剩余的字母。

文字

唯一的即时文字你可以做+()[]的嵌套空数组[][[]][[[]]],等在那里,我们就可以开始使用铸造值+

  • +[]变为零,Jens的技巧使用扩展为任意正整数++

  • []+[]""。实际上,通常[]+x使我们得到一个字符串表示形式x

[]的下一个用途是索引。对对象进行越界索引([][[]])可以帮助您undefined。将其转换为字符串并为结果编制索引会得到字母d e f i n u; 首先使用+gets 将其强制转换为整数NaN,然后a N跟随字母。

++对到目前为止达到的任何非整数值使用技巧都会给出结果NaN或出错。另外,我们可以创建的对象都没有可调用的(还可以),因此()无济于事(分组除外)。

我们袖手旁观的其余技巧是转换和索引。所以问题是:我们可以使用以下任一字符0123456789adefinuN来创建哪些字符串

  • 是数字文字,我们可以将其强制转换为整数以获取新字符串,或者
  • 是我们已经可以到达的对象的属性名称?

数字文字

作为第二选择的一个例子,我们可以将字符串"1e1000",然后得到Infinity+"1e1000",和流延串会让我们的信件yI

同样,我们可以制作"11e100",转换为数字然后返回字符串,以获取和"1.1e+101"提取。.+

.依次使用该字符串,我们可以制作字符串".0000001",将其转换为数字并返回,以获得"1e-7"并赢得我们-

基本上,所有浮点数都可以帮助您:除了Infinityand之外NaN,没有其他有趣的值,并且在通常的字符串表示形式中没有使用除以外的任何字符-+.0123456789e

物产

所以我们有信件-+.0123456789adefinuyIN。我们可以达到哪些属性?让我们问一下JavaScript。

>>> R = /^[-+.0123456789adefinuyIN]+$/
>>> [Array, Object, String, Number].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'find' ], Object: [], String: [], Number: [] }

[].findJens已找到的。让我们将其转换为字符串,获取所有字母,然后重试。跨浏览器的字符串表示形式有些不同。在Chrome和Edge上,"function find() { [native code] }"包含acdefinotuv()[]{}和一个空格;现在我们的完整字母是+-.()[]{}0123456789INacdefinotuvy。在Firefox上,有更多的空格和换行符,但字母相同。

我们重复搜索:

>>> R = /^[+-.()\[\]{}0123456789INacdefinotuvy]+$/
>>> [Array, Object, String, Number, Function].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'concat', 'find' ],
  Object: [],
  String: [ 'concat' ],
  Number: [],
  Function: [] }

String.prototype.concat不推荐使用:它确实做了什么+,我们已经可以做到。因此,我们得到Array.prototype.concatArray.prototype.find。我们该怎么办?

职能

concat()让我们第一次创建更长的数组。[[]].concat([[]])是的[[], []],将它强制转换为字符串可以帮助我们","。(这不会帮助我们找到新的属性。)但是.concat不会修改我们的值,并且它永远不会返回null或类似的东西。

呼叫find()也无济于事:MDN文档

find()如果数组中的元素满足提供的测试功能,则该方法将在数组中返回一个值。否则undefined返回。

我们都可以使用索引来完成这两个操作。


从这里开始,无处可去。如果您怀疑我写的任何内容,请在评论中告诉我。


1
我的我仅仅在过去的时间与个人的工作方法已经取得了所有可行null返回功能:String.prototype.matchRegExp.exec,和Array.prototype.includes。找到所有这些不可能形成的东西,除非有一种奇怪的方式来形成我不知道的正则表达式,我还得出结论,没有可能的方式来做到这一点。
科纳·奥布莱恩

很好的分析!这可能是正确的答案,但我仍然希望能有一些窍门……虽然可能是错误的希望:)
Jens Renders

如果我们能获得罚球的信,就可以得到错误的信吗?那就是“ hwr”。
Rɪᴋᴇʀ

3
即使我们构造了当前无法创建的字符串"catch""throw",我们仍然需要某种东西eval-像将它们用作关键字一样,这首先是我们的目标。
林恩

负数可以使用-和强制转换,但这不是很有帮助。
CalculatorFeline

15

Lynn的答案中的3个功能并不是没有用。但是ECMAScript 5中的严格模式挫败了我的计划。

较旧版本的JavaScript / ECMAScript有一个怪癖。如果在没有对象的情况下调用方法,window则假定为全局对象。因此,我们可以这样做:

a = {f:function(){return this}};
a.f();                            // Returns a.
g = a.f;
g();                              // Returns window.
window.g();                       // Also returns window.

对于现代浏览器来说仍然如此,但前提是未在严格模式下定义函数。并且所有内置函数(带有本机代码)似乎都处于严格模式下。在较旧的浏览器中,如果还没有严格的模式,这也适用于内置功能。

假设我们使用的是较旧的浏览器。然后,如果需要window,我们必须找到一个内置函数,该函数返回包含的内容this。在我们仅有的选择中,有功能可以Array.prototype.concat做到这一点。我们可以这样测试:

Number.prototype.concat = Array.prototype.concat;
1..concat(2);                     // Returns [1, 2]
concat = Array.prototype.concat;
window.concat(2);                 // Returns [window, 2]
concat(2)                         // TypeError in modern browsers while
                                  //   returning the same thing in older ones.
concat.bind(window)(2)            // A workaround in modern browsers.

因此,基本上,它并不在乎被调用的对象是否是数组(但至少必须是一个对象)。如果没有,它将仅包装在数组中。

如果有window,首先可以通过将字符串[object Window]转换为字符串来获取字符串。使用新字符b,我们可以分别获取rs使用以下两行,以及每个我们没有的字符constructor

window["atob"]("cuaa")[0]
window["atob"]("cyaa")[0]

但是另一个问题是要从中删除对象引用[].concat。将其包装在数组中并提取不起作用,因为[].concat已经意味着[]["concat"]。我知道可能使用的唯一方法+[]()是从函数返回它。Array.prototype.find似乎能够做到这一点:

[[]["concat"]]["find"](x=>1)      // Returns Array.prototype.concat, where x=>1 can
                                  //   be replaced with any always truthy function.

我们总是有诚实的职能。Array.prototype.concat并且String.prototype.concat都返回truthy如果对象是window。如果我们使用后一个,则将利用所有三个可用功能。

但是,不幸的是,Array.prototype.find在我们使用的旧浏览器中并不存在。至少我没有找到一个可行的方法。而且我没有找到删除对象引用的另一种方法。

在现代浏览器中可测试的完整代码,返回,r并且s具有.bind(window)变通方法:

[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cuaa")[0];
[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cyaa")[0]

很酷的信息。您尝试了哪些浏览器?
林恩

@林恩不多。主要是Firefox 3.6.0和25.0。我从读这里这里find来得迟于严格的模式,这样找到的东西的工作是不可能的。我之所以问Edge是因为我认为它有可能更喜欢向后兼容而不是遵循标准。我也出于同样的原因尝试了Konqueror。和某些命令行浏览器,但它们都不支持JavaScript。
jimmy23013 '16

我尝试了Safari 7.1和Safari 8,并在浏览器屏幕截图网站上的手机上使用了一些随机默认浏览器。到目前为止,任何方法都无效。
jimmy23013 '16

@ jimmy23013尝试使用Safari 5.0或5.1。根据Can I use的使用旧版Safari中的部分支持是指严格模式仍然接受许多应视为无效的JS。虽然find尚未实施,但可能只是部分实施了?... 如果仅在他们的清单中...
mbomb007 '09
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.