不使用字母获取完整的字母

时间:2015-02-16 17:39:46

标签: javascript

看到下面的代码之后,我开始想知道是否有办法在不使用任何字母的情况下访问完整的小写字母(条件将在下面应用):

[($=(!0)+'')[0]+$[1]+$[2]+((!1)+'')[3]+$[0],(([]+[])[1]+'')[1]+([]+{})[1],([]+{})[1]+(([]+[])[1]+'')[1]+$[3]].join(' ');
// "trust no one"

使用下面的各种声明可以访问以下字母a b c d e f g i j l m n o p r s t u 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*/]+'';

使用以下限制访问剩余字符h q w z有哪些方法:

  1. 代码中只能使用非字母字符(符号,数字和标点符号)
  2. 代码中使用的所有字符必须分为ASCII的前128个字符
  3. 代码不得依赖环境变量,例如global表示节点,window表示浏览器等。
  4. 应该避免重新编码使用转义变体,octlet语法等字母,直到探索完所有其他途径为止。

2 个答案:

答案 0 :(得分:1)

([]+{}+'')[5]+([]+{}+'')[1]+(([]+[])[1]+'')[1]+(!1+'')[3]+(!0+'')[0]
+(!0+'')[1]+(!0+'')[2]+([]+{}+'')[5]+(!0+'')[0]+([]+{}+'')[1]+(!0+'')[1]

为您提供构造函数'然后您可以使用这样的字符串文字:

('')[([]+{}+'')[5]+([]+{}+'')[1]+(([]+[])[1]+'')[1]+(!1+'')[3]+(!0+'')[0]
+(!0+'')[1]+(!0+'')[2]+([]+{}+'')[5]+(!0+'')[0]+([]+{}+'')[1]+(!0+'')[1]]+''

为您提供'function String() { [native code] }',为您提供了&#39; v&#39;和&#39; <&#39;

编辑:您找到了&#39;构造函数&#39;如果没有办法访问全局变量,获得更多的东西也很棘手。

这是在Node中获取全局变量的一种方法:

('')['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")

这为您提供了一个穷人的Object.keys(),您可以使用它来访问各种对象的名称&#39;方法

您还可以构建一个eval函数&amp;将其分配给$

$=[]['constructor']['constructor']('s','return eval(s)')

答案 1 :(得分:1)

啊,阿哈得到了它。如果允许unescape,则为了清晰起见未编码:

[]['constructor']['constructor']['call']('','return unescape' + '("%68%71%77%7' + 'a' +'")')()

这给了我们hqwx,当然可以给我们任何其他的东西。

唯一无法达到的位是'("%68%71%77%7<a goes here>")',但满足符号和数字规则。 a可以用其他方式构建。

如果我们想要避免unescape,我们可以使用(828035)['toString'](36) - &#34;魔法&#34;号码828035是使用parseInt('hqwz',36)生成的。

并且已编码 - 为了便于阅读而分发了大部分内容:

// 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: (!![]+![]+'')+(![]+![])

因此,我讨厌的神奇常数可能是:

((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+((!![]+!![])+'')+
    ((!![]+!![])*(!![]+!![])*(!![]+!![])+'')+
    (![]+![]+'')+(!![]+!![]+!![]+'')+((!![]+!![])*(!![]+!![])+!![])-![]