我怎么能说没有字符或数字在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'。 所以如果我们有window
和Object
,那么我想我们可以这样做:
(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和改变参数,你可以得到不同的字符:)