Javascript 获取完整的字母表而不使用字母
看到下面的代码后,我开始怀疑是否有一种方法可以访问完整的小写字母表而不使用任何字母(下面要应用的条件): 使用下面的各种语句,可以访问以下字母Javascript 获取完整的字母表而不使用字母,javascript,Javascript,看到下面的代码后,我开始怀疑是否有一种方法可以访问完整的小写字母表而不使用任何字母(下面要应用的条件): 使用下面的各种语句,可以访问以下字母a b c d e f g i j l m n o p r s t v x y: // "true" yeilds: e r t u !0+''; // "false" yeilds: a f l s !1+''; // "[object Object]" yeilds: b c j o t []+{}+''; // "undefined" yeil
a b c d e f g i j l m n o p r s t v x y
:
// "true" yeilds: e r t u
!0+'';
// "false" yeilds: a f l s
!1+'';
// "[object Object]" yeilds: b c j o t
[]+{}+'';
// "undefined" yeilds: d i n
[][1]+'';
// "Infinity" yeilds: y
1/0+'';
// Using the above statements "constructor" can be spelled
// It has no value by itself but can be coupled with other statements to get more letters
($=[]+{}+'')[5]+$[1]+(([]+[])[1]+'')[1]+((!1)+'')[3]+($=!0+'')[0]+$[1]+$[2]+($=[]+{}+'')[5]+$[6]+$[1]+((!0)+'')[1];
// "function RegExp() { [native code] }" yeilds: g p v x
(/./)[/*constructor" from above*/]+'';
// "function Number() { [native code] }" yeilds: m
(0)[/*"constructor" from above*/]+'';
在应用以下限制的情况下,访问剩余字符的方法是什么
global
、浏览器的window
等('')[([]+{}+'')[5]+([]+{}+'')[1]+(([]+[])[1]+'')[1]+(!1+'')[3]+(!0+'')[0]
+(!0+'')[1]+(!0+'')[2]+([]+{}+'')[5]+(!0+'')[0]+([]+{}+'')[1]+(!0+'')[1]]+''
它给你函数字符串(){[native code]}它给你v和g
编辑:您也找到了“构造函数”,如果没有访问全局变量的方法,很难获得更多
以下是在节点中获取全局变量的方法:
('')['constructor']['constructor']('','return global')()
使用上述方法:
('')[
// 'constructor'
({}+'')[5] + ({}+'')[1] + (([]+[])[1]+'')[1] + (!1+'')[3] +
(!0+'')[0] + (!0+'')[1] + (!0+'')[2] + ({}+'')[5] +
(!0+'')[0] + ({}+'')[1] + (!0+'')[1]
][
// 'constructor'
([]+{}+'')[5] + ([]+{}+'')[1] + (([]+[])[1]+'')[1] + (!1+'')[3] +
(!0+'')[0] + (!0+'')[1] + (!0+'')[2] + ([]+{}+'')[5] +
(!0+'')[0] + ([]+{}+'')[1] + (!0+'')[1]
](
'',
// 'return'
(!0+'')[1] + (!0+'')[3] + (!0+'')[0] + (!0+'')[2] + (!0+'')[1] + (([]+[])[1]+'')[1] +
' ' +
// 'g'
(('')[
([]+{}+'')[5] + ([]+{}+'')[1] + (([]+[])[1]+'')[1] +
(!1+'')[3] + (!0+'')[0] + (!0+'')[1] + (!0+'')[2] +
([]+{}+'')[5] + (!0+'')[0] + ([]+{}+'')[1] + (!0+'')[1]
] + '')[14] +
// 'lobal'
(!1+'')[2] + ({}+'')[1] + ({}+'')[2] + (!1+'')[1] + (!1+'')[2]
)()
从那里你可以访问global.env
,从那里你几乎可以作弊
编辑:您还可以生成以下内容:
[]['constructor']['constructor'](
'o',
"var a=[];for(var x in o){a.append(x)};return a")
这将为您提供一个穷人的对象.keys()
,您可以使用它访问各种对象方法的名称
您还可以构建一个eval函数并将其分配给$
:
$=[]['constructor']['constructor']('s','return eval(s)')
啊哈,明白了。如果允许使用
unescape
,为清晰起见不进行编码:
[]['constructor']['constructor']['call']('','return unescape' + '("%68%71%77%7' + 'a' +'")')()
这给了我们hqwx,当然也可以给我们其他任何东西
唯一无法到达的位是”(“%68%71%77%7”)
,但它满足符号和数字规则。a可以用其他方式构造
如果我们想避免unescape,我们可以使用(828035)['toString'](36)
——通过使用parseInt('hqwz',36)
生成“神奇”数字828035
并进行了编码——为了便于阅读,将较大的部分进行了拆分:
// From your post
str_constructor = ($=[]+{}+'')[5]+$[1]+(([]+[])[1]+'')[1]+
((!1)+'')[3]+($=!0+'')[0]+$[1]+$[2]+($=[]+{}+'')[5]+
$[6]+$[1]+((!0)+'')[1];
// call
str_call = ([]+{}+'')[5]+($=!1+'')[1]+$[2]+$[2];
// return unescape ( bonus, not using a literal space character )
ret_unescape = ($=!0+'')[1]+$[3]+$[0]+$[2]+$[1]+($=''[1]+'')[1]+
([]+{}+'')[7]+$[0]+$[1]+$[3]+($=!1+'')[3]+([]+{}+'')[5]+$[1]+
((/./)[str_constructor]+'')[14]+(!0+'')[3];
// finally
[][str_constructor][str_constructor][str_call]('',ret_unescape + '("%68%71%77%7' + (!1+'')[1] +'")')() // "hqwz"
// or -- toString
str_toString = (!0+'')[0]+([]+{}+'')[1]+($=(('')[str_constructor]+''))[9]+$[10]+$[11]+$[12]+$[13]+$[14]
(828035)[str_toString](36) // hqwz
奖金:
如果我们偷偷摸摸,我们甚至可以放弃数字
true: !![]
false: ![]
0: ![]+![]
1: !![]+![]
2: !![]+!![]
10: (!![]+![]+'')+(![]+![])
因此,我最讨厌的魔法常数可能是:
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+((!![]+!![])+'')+
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+
(![]+![]+'')+(!![]+!![]+!![]+'')+((!![]+!![])*(!![]+!![])+!![])-![]
我看不出有什么理由不这样做。我认为这个问题应该被问进去而不是stackoverflow。我不知道codegolf。有没有一种方法可以在不关闭这个问题的情况下将它移动到那里,并在那里创建一个新问题?你没有dn的来源,等等。。我相信你是通过“未定义”得到的<代码>([]+[])[1]+'?顺便说一句,包括数字——如果我们能找到一种方法获得大写字母
C
和h
——游戏结束<代码>''['constructor']['fromCharCode']](120)不错,我忘记了'string'我不知道/不知道如何在OP中解释它,但我不想依赖于从依赖于环境的变量获取信息。如果你能得到一个'k',你可以使用函数构造函数来构建一个调用Object.keys()的函数。另外,你也可以得到'[对象对象]'只要{}+'
,就不需要[]+{}+'
{}+“
yeilds0
在chrome的开发控制台中,我会对此给出一点意见,但感觉规则有点扭曲。哪条规则?我会尽量找时间编码构造函数调用并在我今天回家后返回unescape
规则无字母规则。我知道你没有使用任何字母,但你没有这是一个非常巧妙的解决方案,符合规定的规则。我唯一能想到的另一种方法,就是避免明显的编码:(828033)。toString(36)
(我们通过“函数字符串(){[本机代码]}“
——我们可以用我上面的技巧来运行它)——这至少看起来更神奇。不过这是经过编码的。通过parseInt('hqwx',36)
…我刚刚意识到z
是我们缺少的,而不是x
——这个方法仍然适用。
true: !![]
false: ![]
0: ![]+![]
1: !![]+![]
2: !![]+!![]
10: (!![]+![]+'')+(![]+![])
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+((!![]+!![])+'')+
((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+
(![]+![]+'')+(!![]+!![]+!![]+'')+((!![]+!![])*(!![]+!![])+!![])-![]