一段Javascript的代码
2011-01-26 08:39
531 查看
我们先看一段Javascript的代码,如下所示:(你能看出来这是干什么的?)
好,下面让我们来对这个代码做个解析。
首先,我们先明确一点,在Javascript和C中,混乱后的代码都是要使用一个或多个下划线(_)来当变量名使用的,所以,请把其中的下划线看成变量名。
其次,这段代码可以分成两个部分,第一个部门其实就是sort(),第二个部分才是alert()
$=[] 是一个空数组
$=[$=[]] 是一个引用空数组的数组。所以 $ 的解引用就是数字 0。
__ = (__ = !$ + $ ) 等价于字符串”false”
_ = -~-~-~$ 中~是位运算符“非”,~$等于-1,所以-~$ 就是+1,基本上来说,~N就是 -(N+1),所以这个表达式的值为3。
因为_ = 3,所以 _/_ = 3/3 = 1
于是:
(__ = !$ + $ )[ _ = -~-~-~$]
(“false”)[_]
(“false”)[3]
“false”[3] = s
而:
({} + $)[_/_]
(” object”)[_/_]
(” object”)[1]
” object”[1] = o
再来:
$ = ( $_ = !” + $)[_/_]
$ = ( “true”)[1]
“true”[1] = r
最后:
$_[+$] = “true”[0] = t
因为
($$ = ( $_ = !” + $)[_/_] + $_[+$] ))
所以我们可以经过下面的推算得出$$的值
!” = “true”
$_ = (true)
$_[1] = r
$_[0] = t
$$ = rt
所以第一部分就成了 sort(),也就是以下的代码
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
我们知道:
$ = 0
_ = 3
__ = “false”
$! = “true”
$$ = “rt”
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
等价于
[__[1] + __[3 + -1] + $![3] + $$)(1);
等价于
[“false”[1] + “false”[3 + -1 ] + “true”[3] + “rt”] (1)
等价于
[ a + l + e + r + t ](1)
等价于
alert(1)
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)这段代码来自BlackHat DC 2011((黑帽安全大会,全世界最大两个黑客大会之一,另一个是Defcon)中的一个叫Ryan Barnett黑客做的XSS Street-Fight!的演讲(XSS是Web上比较经典的跨站式攻击,操作起来也有些复杂),一共69页,基本上都是一些比较枯燥的Javascript,不过这段代码挺有意思的,如果上面这段代码换个样子:
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](document.cookie)你看到了document.cookie,于是你可能会想到这是偷用户帐号免登录cookie的。是的,就是这样。答案是,这代码等价于alert(document.cookie),而最上面的那个代码等价于alert(1)——当然,还不仅仅只是alert。看到这里,你可能会想起变态的C语言Hello World程序,以及如何加密/混乱C源代码,是的,这回的这个是Javascript版的,混乱Javascript的会比混乱C的更难懂,因为Javascript的变量类型是可以乱用的。
好,下面让我们来对这个代码做个解析。
首先,我们先明确一点,在Javascript和C中,混乱后的代码都是要使用一个或多个下划线(_)来当变量名使用的,所以,请把其中的下划线看成变量名。
其次,这段代码可以分成两个部分,第一个部门其实就是sort(),第二个部分才是alert()
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)我们来看看细节的解释。
$=[] 是一个空数组
$=[$=[]] 是一个引用空数组的数组。所以 $ 的解引用就是数字 0。
__ = (__ = !$ + $ ) 等价于字符串”false”
_ = -~-~-~$ 中~是位运算符“非”,~$等于-1,所以-~$ 就是+1,基本上来说,~N就是 -(N+1),所以这个表达式的值为3。
因为_ = 3,所以 _/_ = 3/3 = 1
于是:
(__ = !$ + $ )[ _ = -~-~-~$]
(“false”)[_]
(“false”)[3]
“false”[3] = s
而:
({} + $)[_/_]
(” object”)[_/_]
(” object”)[1]
” object”[1] = o
再来:
$ = ( $_ = !” + $)[_/_]
$ = ( “true”)[1]
“true”[1] = r
最后:
$_[+$] = “true”[0] = t
因为
($$ = ( $_ = !” + $)[_/_] + $_[+$] ))
所以我们可以经过下面的推算得出$$的值
!” = “true”
$_ = (true)
$_[1] = r
$_[0] = t
$$ = rt
所以第一部分就成了 sort(),也就是以下的代码
($ = [ $=[]] ["s" + "o"+ "r"+ "t" ] )()Sort 接受一个作为函数的参数来运行,从而执行了第二部份。
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
我们知道:
$ = 0
_ = 3
__ = “false”
$! = “true”
$$ = “rt”
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
等价于
[__[1] + __[3 + -1] + $![3] + $$)(1);
等价于
[“false”[1] + “false”[3 + -1 ] + “true”[3] + “rt”] (1)
等价于
[ a + l + e + r + t ](1)
等价于
alert(1)
相关文章推荐
- 重构一段基于原生JavaScript的表格绘制代码
- 一段奇葩Javascript代码引发的思考
- JavaScript 参数调用2 【每日一段代码52】
- 一段简单的javascript代码
- [javascript]一段焦点图的js代码
- Javascript代码 -- 去除一段string中的所有空行和空白行,内有javascript的trim实现
- 一段在线答题的javascript代码
- JavaScript 数组中 length 属性【每日一段代码100】
- JavaScript 确认按钮 【每日一段代码48】
- [Ajax]便于在html页面中引用javascript显示后台数据的一段ajax代码
- JavaScript 调用函数 【每日一段代码50】
- 一段代码详解JavaScript面向对象
- JavaScript return语句 【每日一段代码53】
- JavaScript 按钮动画【每日一段代码70】
- 一段Javascript的代码
- 一段javascript实现缩略图的好代码
- JavaScript join() 方法【每日一段代码91】
- 一段javascript实现缩略图的好代码
- 一段多浏览器的"复制到剪贴板"javascript代码