Javascript调用Function()来创建一个函数

时间:2015-02-16 17:17:45

标签: javascript function native deobfuscation

任何人都可以解释以下代码吗?

Function(
Function(
'return \'\\141\\75\\160\\162\\157\\155\\160\\164\\50\\47\\105\\156\\164\\162\\145\\172\\40\\154\\145\\40\\155\\157\\164\\40\\144\\145\\40\\160\\141\\163\\163\\145\\47\\51\\73\\151\\146\\50\\141\\75\\75\\47\\164\\157\\164\\157\\61\\62\\63\\154\\157\\154\\47\\51\\173\\141\\154\\145\\162\\164\\50\\47\\142\\162\\141\\166\\157\\47\\51\\73\\175\\145\\154\\163\\145\\173\\141\\154\\145\\162\\164\\50\\47\\146\\141\\151\\154\\56\\56\\56\\47\\51\\73\\175\''
)  ()  
)()

有趣的是:使用Function()创建了一个实际功能。

但由于我无法查看本机代码,因此我很难理解正在创建的实际函数。这取自root-me.org Javascript - 本机代码挑战。

2 个答案:

答案 0 :(得分:2)

它反混淆:

a = prompt('Entrez le mot de passe');
if(a=='toto123lol'){
    alert('bravo');
} else{
    alert('fail...');
}

要在Chrome中验证,请打开开发人员工具,打开控制台,然后粘贴:

Function(
    'return \'\\141\\75\\160\\162\\157\\155\\160\\164\\50\\47\\105\\156\\164\\162\\145\\172\\40\\154\\145\\40\\155\\157\\164\\40\\144\\145\\40\\160\\141\\163\\163\\145\\47\\51\\73\\151\\146\\50\\141\\75\\75\\47\\164\\157\\164\\157\\61\\62\\63\\154\\157\\154\\47\\51\\173\\141\\154\\145\\162\\164\\50\\47\\142\\162\\141\\166\\157\\47\\51\\73\\175\\145\\154\\163\\145\\173\\141\\154\\145\\162\\164\\50\\47\\146\\141\\151\\154\\56\\56\\56\\47\\51\\73\\175\''
)  ()  

这实际上是“编码如何工作”的步骤。要“编码”字母“a”:

test = "a";
console.log(test.charCodeAt(0)); //97
console.log(parseInt('141', 8)); //97
console.log('\141'); //a

答案 1 :(得分:1)

  

但由于我无法查看本机代码,因此我很难理解正在创建的实际函数。

脚本标记中包含本机代码。它看起来很不寻常,因为它引用了ASCII密钥代码;八角形是准确的(OCT)。这是一个链接

ASCII Key Codes

首先,我们有一个可执行标记,可以启动它。这是一个解释它的作用的链接。

HTML tags

在标签内部,我们有两个函数或函数构造函数。

如果您要在控制台中输入Function(),您将获得

function anonymous() {}

有关详细信息,请查看此链接。

Funciton JS link

首先从嵌套函数开始。

Function(
  'return \'\\141\\75\\160\\162\\157\\155\\160\\164\\50\\47\\105\\156\\164\\162\\145\\172\\40\\154\\145\\40\\155\\157\\164\\40\\144\\145\\40\\160\\141\\163\\163\\145\\47\\51\\73\\151\\146\\50\\141\\75\\75\\47\\164\\157\\164\\157\\61\\62\\63\\154\\157\\154\\47\\51\\173\\141\\154\\145\\162\\164\\50\\47\\142\\162\\141\\166\\157\\47\\51\\73\\175\\145\\154\\163\\145\\173\\141\\154\\145\\162\\164\\50\\47\\146\\141\\151\\154\\56\\56\\56\\47\\51\\73\\175\'')()

通过使用JS Function构造函数,我们可以将参数传递给我们的新函数以及函数体。

  

新函数([arg1 [,arg2 [,... argN]],] functionBody)

在嵌套函数中,我们只是创建一个无穷大的函数,并以字符串的形式传递给它一个函数体,如下所示

'return \'\\141\\75\\160\\162\\157\\155\\160\\164\\50\\47\\105\\156\\164\\162\\145\\172\\40\\154\\145\\40\\155\\157\\164\\40\\144\\145\\40\\160\\141\\163\\163\\145\\47\\51\\73\\151\\146\\50\\141\\75\\75\\47\\164\\157\\164\\157\\61\\62\\63\\154\\157\\154\\47\\51\\173\\141\\154\\145\\162\\164\\50\\47\\142\\162\\141\\166\\157\\47\\51\\73\\175\\145\\154\\163\\145\\173\\141\\154\\145\\162\\164\\50\\47\\146\\141\\151\\154\\56\\56\\56\\47\\51\\73\\175\''

当函数运行第一个字符串'' (引号)将被删除并运行此语句

return \'\\141\\75...'

返回当然是执行并退出函数,当运行THIS函数时,我们以另一个字符串值的形式获得另一个函数体。

"a=prompt('Entrez le mot de passe');if(a=='toto123lol'){alert('bravo');}else{alert('fail...');}"

前导' \',它位于return语句之后,但在实际字符串之前只是为了转义以下引号,因此编译器不会将其误认为是引用的第二个引用引号就在退货声明之前。我们可以摆脱它,以及紧接在最后一个数字之后的第二个,而是像这样编写函数体

Function(
'return "\\141\\75\\160\\162\\157\\155\\160\\164\\50\\47\\105\\156\\164\\162\\145\\172\\40\\154\\145\\40\\155\\157\\164\\40\\144\\145\\40\\160\\141\\163\\163\\145\\47\\51\\73\\151\\146\\50\\141\\75\\75\\47\\164\\157\\164\\157\\61\\62\\63\\154\\157\\154\\47\\51\\173\\141\\154\\145\\162\\164\\50\\47\\142\\162\\141\\166\\157\\47\\51\\73\\175\\145\\154\\163\\145\\173\\141\\154\\145\\162\\164\\50\\47\\146\\141\\151\\154\\56\\56\\56\\47\\51\\73\\175"')()

如果你在控制台中运行此代码,你会得到相同的结果,试试吧!

如果你这样做,你会发现所有这些数字都编译成实际的字母和数字,实际上它编译成ASCII字符代码。发生这种情况是因为使用了' \'进行每个号码。为了减少混淆,让我们来看看这个" \\"而是进入这个" \"

Function(
'return "\141\75\160\162\157\155\160\164\50\47\105\156\164\162\145\172\40\154\145\40\155\157\164\40\144\145\40\160\141\163\163\145\47\51\73\151\146\50\141\75\75\47\164\157\164\157\61\62\63\154\157\154\47\51\173\141\154\145\162\164\50\47\142\162\141\166\157\47\51\73\175\145\154\163\145\173\141\154\145\162\164\50\47\146\141\151\154\56\56\56\47\51\73\175"')()

正如您将看到的,这仍然会运行,我们得到

"a=prompt('Entrez le mot de passe');if(a=='toto123lol'){alert('bravo');}else{alert('fail...');}"

因此,嵌套函数将函数体作为字符串返回,然后在外部Function构造函数中执行,其方式与嵌套函数触发的方式相同。以下是相同的示例,为了更清晰,删除了一些内容

 Function(
Function('return "\141\75\160\162\157\155\160\164\50\47\105\156\164\162\145\172\40\154\145\40\155\157\164\40\144\145\40\160\141\163\163\145\47\51\73\151\146\50\141\75\75\47\164\157\164\157\61\62\63\154\157\154\47\51\173\141\154\145\162\164\50\47\142\162\141\166\157\47\51\73\175\145\154\163\145\173\141\154\145\162\164\50\47\146\141\151\154\56\56\56\47\51\73\175"')())()

注意:您可能需要打开一个新窗口,然后将其粘贴到控制台中并单击“输入”。

为了更加清晰,我们可以将初始返回值复制并粘贴到外部函数中,如此

Function("a=prompt('Entrez le mot de passe');if(a=='toto123lol'){alert('bravo');}else{alert('fail...');}")()

这也可以。

嵌套函数的作用

第一部分打开一个浏览器提示窗口,并将其未来值附加到变量' a'。试试这个

Function("a=prompt('Enter Password');console.log(a);")()

当您按Enter键时,您的值将显示在控制台中。该函数的第二部分通过将其与字符串“toto123lol'”进行比较来分析此返回值。

当输入的值恰好是&ttoto123lol'将出现一个新的警告窗口,显示' bravo'。

如果输入的值不完全是&t; toto123lol'将出现一个新警报窗口,显示“失败...”

正如您所看到的,您的问题的初始功能包含所有必需的信息,不仅可以运行工作代码,还包含您需要的所有本机代码,以确定它在做什么。

结帐后您提到的网站

Root-me.org

测试试图展示的可能是看起来像无害的代码,实际上可以是任何可以在HTML标签中执行的东西。或许有很多方法可以影响行为?

我希望这能回答你的问题。

更新:如果您想知道' \\'之间的区别是什么?或者' \'我在这里问过它 - why double or single escapes