【问题标题】:Obfuscated javascript code with binary values?带有二进制值的混淆javascript代码?
【发布时间】:2010-10-11 22:20:19
【问题描述】:

此代码输出D。问题是如何?

alert([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()[([][(![]+[])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]][([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]]+(![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(![]+[])[!+[]+!+[]]]()+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(![]+[])[+!+[]]](+[]+[+[]])[+!+[]]);

我知道![] 被评估为false0 等等,但它是如何执行的?我怎样才能将其转换为人类可以理解的东西,而不仅仅是 Jon Skeet?

谁能破解这段代码并解释一下发生了什么?

【问题讨论】:

标签: javascript obfuscation


【解决方案1】:

好吧,对表达式进行部分求值,最后它相当于:

[]['sort']['call']()["btoa"]("00")[1]; // "D"

可以简化为:

btoa("00")[1]; // "D"

如何“解码”?

简单检查使用的运算符,例如,我们首先可以看到使用了一个数组字面量,然后完成了几个 括号表示法 属性访问,以及几个调用。

它是如何工作的?

诀窍是链接多个类型转换,例如,获取f 字母:

(![]+[])[+[]]

如果我们检查第一部分,括号中的![]+[],我们会看到一个布尔否定,它将返回false,因为数组对象总是真实的,然后是一个连接

这产生了字符串"false",然后,第二部分,我们看到一个括号应用于该字符串,以访问一个字符,以及表达式+[],结果是0

+[] 给出零,因为 Array 的 toString 方法返回一个空字符串,对于像这样的空数组,并且一个空字符串在转换为数字时产生为零(这里的一元 + 运算符示例)。

只有这样的技巧,产生字符串的东西,例如"true""false""null""undefined",等等......还有更多的技巧来获得数字。

例如要获取一个数字-访问一个字符-,他们再次使用神秘的类型转换:

+[];            // 0, equivalent to +""
+!+[];          // 1, equivalent to +true
!+[]+!+[];      // 2, equivalent to +true+true
!+[]+!+[]+!+[]; // 3, equivalent to +true+true+true

【讨论】:

  • 你是怎么做到的?有什么工具可以转换这段代码吗?
  • 在交互式 javascript shell 中尝试不同的部分(内置于 chrome 和 ie8,可以为 firefox(插件 firebug)获得,也可以安装 node.js 或许多其他工具。
  • 谢谢。我知道它现在是如何工作的。但我仍然想知道你是怎么这么快解决它的:P
【解决方案2】:

它对 javascript 类型转换做了一些技巧。正如 CMS 所指出的,它相当于:[]['sort']['call']()["btoa"]("00")[1];

他们通过将字符串从 false 之类的东西中拉出来来构建字符串。

例如,在“排序”中获取s

获取“false”:(![]+[]) -- ![] 返回 false,+[] 将其转换为字符串。

通过!+[]+!+[]+!+[] 获取值 3 - 每个!+[] 返回true,但是当您添加布尔值时,您会得到一个整数表示。例如true + true = 2

使用字符串索引访问表示法 ("false"[3] = 's') 获取 s(![]+[]) [!+[]+!+[]+!+[]]

现在你有一个s。他们一直这样做,直到他们有足够的能力访问他们想要的任何方法或属性。

【讨论】:

    【解决方案3】:

    ![] 是假的。 ![] + [] 计算结果为“假”。 +[] 是 0 所以 !+[] 是真的,等等。javascript 的隐含类型转换很奇怪

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2019-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多