我怎么能说没有字符或数字在JavaScript中的“爱”?

受到Ryan Barnett 2011年BlackHat DC PPT的启发,特别是以下代码:

($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ [_+~$]+$_[_]+$$](_/_) 

昨天是恋人特别的日子,所以我试着写类似的东西。 这基本上提醒“我爱你”没有任何字符或数字。

例如“I”可以从((_=-~[])/--_+[])[_]

我们有“[object object]”,“true”,“false”,“NaN”,“Infinity”的用法,我想不出用这种方法得到“v”的方法。

我试图想到String.fromCharCode() ,(Ryan已经得到了我们的window引用,所以理论上我们可以window["String"]["fromCharCode"](118) ),但是我错过了“S”和“C “这里的性格。 还想想window["eval"](...) ,再次,我没有“v”。

只是试着解释一下, []是空的,当对其应用+/-/~操作时,它转换为数字0 ,并且~[]给出1 / 1/0给出Infinitey 。 然后它来到1/0 + [] ,他们都将转换为string的加法,它给出"Infinity""Infinity"[_] == "Infinity"[0] == "I"

Ryan的原始代码更复杂,利用更多,包括范围,特殊的返回值等(这是另外一个故事)

这似乎不是一个好主意,但是很有趣。

与meze的帮助,我能够产生这个火狐:

 ($=($=[$=[]][(__=!$+$)[_=-~-~-~$]+(_$={}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])])())[__[_/_]+__ [_+~$]+$_[_]+$$]((_$_=(__$=-~[])/--__$+[])[__$]+_$[_+++_]+__[__$=-~-~[]]+_$[-~[]]+($[_$[$__=_+_]+_$[++$__]+_$[++$__]+_$[++$__]+_$[++$__]+_$[++$__]]+[])[ $__+$__+--_]+__[++_]+_$[$__=_+--_]+_$_[_+++_]+_$[_/_]+$_[__$]); 

它基本上是alert("I love you") ,非常感谢! 如果只有我得到的帮助昨天,我还没有发布这个:(

JavaScript很漂亮,供你参考:

 $_ = "true" __ = "false" _$ = "[object Object]" $$ = "rt" _$_ = "Infinity" _ = 3 = 4 = 3 = 4 = 3 $ = window $__ = 8 = 13 __$ = 0 = 2 

有些variables被重复使用了很多次,不会试图留下细节,这不是一件有趣的工作:)我很高兴,我们终于来了! 这实际上有很大的潜力,因为我们现在有“v”和很多数字,所以我们理论上可能会eval()许多…事情更容易。 我会告诉我的妻子,希望她喜欢_ $ – +()…

作为参考的例子: http : //jsfiddle.net/Y4wqw/

顺便说一句,我们可以缩短一些代码,因为我们已经引用了sort() ,它可以用来代替window [“Object”]来获得“native code”=>“v”,这里是:

 ($=($_$=($=[$=[]][(__=!$+$)[_=-~-~-~$]+(_$={}+$)[_/_]+ ($$=($_=!''+$)[_/_]+$_[+$])]))())[__[_/_]+__ [_+~$]+$_[_]+$$]((_$_=(__$=-~[])/--__$+[])[__$]+_$[_+++_]+__[__$=-~-~[]]+_$[-~[]]+($_$+[])[(__$<<__$<<__$)-_+~[]]+$_[--_]+_$[$__=_+++_]+_$_[_+--_]+_$[_/_]+$_[__$]); 

同样,它只能在Firefox中运行,可能不会尝试迁移到其他浏览器。 我喜欢Firefox。

至less在Firefox中,JavaScript本地对象返回function Object() { [native code] } ,它具有'v'。 所以如果我们有windowObject ,那么我想我们可以这样做:

 (window["Object"]+0)[29]; 

相同的消息,但拼写不同。

 // "I <3 u" _= +~[]; // 1 __= -[]; // 0 ___= +(-~[] -~[] -~[]); // 3 $='' +(''+(_/__))[__] // i +' ' // space +'<'+___ // <3 +' ' // space +(''+(_<__))[+(-~[] -~[])]; // u alert($); 

jsfiddle链接

 alert("\u2665"); // results in ♥ 

试试这个代码:

 $=(Å='',[Ç=!(µ=!Å+Å)+{}][Ç[È=++Å-~Å]+Ç[È+È]+µ[Å]+µ[Å-Å]])(); _=$[Ç[È+È+Å]+µ[Å-Å]+Ç[È+È]+Ç[Å]]("¾"); console.info( _[+[]] ); // concole is used just to show result ;) 

如果你运行它,在控制台上你会得到“v”:),关于它的更多信息可以在那里find

有一种方法可以避免“¾”,但结果将是“V”(实际上对于像爱这样的词没什么坏处:):

 $=(Å='',[Ç=!(µ=!Å+Å)+{}][Ç[È=++Å-~Å]+Ç[È+È]+µ[Å]+µ[Å-Å]])(); // we get window object _=$[Ç[È+È+Å]+µ[Å-Å]+Ç[È+È]+Ç[Å]]( $ ); // we use btoa function with argument "[object Window]", // and it returns "W29iamVjdCBXaW5kb3dd" - as you see there is V $$=-~!''; // 2 $$$=-~$$; // 3 console.info( _[$$*$$$] ); // "V"; 

btoa使用base-64编码从给定的string创build编码的数据。 其实玩这个function和改变参数,你可以得到不同的字符:)