0x0 序
最近遇到了不少各种语言的trick,于是想尝试作为一个系列记录下来。一般来说,并不提倡在生产环境中使用任何一种trick,好的代码应该是清晰的、无二义性的。部分trick更属于Undefined Behavior,这些trick在不同环境、不同版本的引擎中甚至会有截然不同的表现,在生产环境中应该避免这种情况。但是安全研究、渗透的过程中,利用这样的特性完成攻击的案例并不少见,所以仅作为研究还是有一定的意义。
0x1 代码与输出
于是开始此系列的第一篇:
1 | var a = 0; |
以上代码在最新版nodejs的输出会是
1 | 1 0 |
这里是这个结果是这样出现的:
- 第一次输出
0
function a()
的定义提升a
到全局,输出[Function: a]
- 全局的
a
被赋值为1
,在console中输出两次 - 局部的
a
被赋值为21
并在console中输出 - 全局的
a
在console中输出
0x2 调试过程
以上的整个过程可以通过两种方式确定,一种方式是 node -print-bytecode
,打印出对应的字节码进行参考,具体的字节码如下。
1 | StackCheck |
一种方式是可以在Chrome中开启调试,可以清晰的看到局部与全局两种作用域。