使用Javascript调用函数()来创建一个函数(Javascript calling Funct

2019-10-21 21:57发布

谁能解释一下下面的代码?

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拍摄。

Answer 1:

它deobfuscates到:

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


Answer 2:

但因为我不能查看本机代码,我有困难的理解是越来越创建的实际功能。

你必须在脚本标签中的本机代码。 它只是看起来不寻常,因为它引用的ASCII键代码; 八角确切(OCT)。 这里是一个链接

ASCII键代码

首先,我们必须启动东西了一个可执行标签。 这里是一个链接解释它做什么。

HTML标签

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

如果您要输入功能()到您的控制台,您将获得

function anonymous() {}

欲了解更多信息,请查看此链接。

功能可按JS链接

让我们先从嵌套函数第一。

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]],]函数体)

在嵌套函数,我们只是创建一个anonumous功能可按并把它传递函数体在这样的字符串的形式

'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...'

当然,回报,执行和退出功能,并且运行该功能时,我们得到另一个函数体中另一个字符串值的形式。

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

领先的“\”,这是return语句后,但实际字符串之前只是逃避以下报价,所以编译器不会误以为只是一个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('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);")()

当您按下输入您的数值会显示在控制台中。 函数的第二部分通过比较字符串“toto123lol” analizes该返回值。

当输入的值正好是“toto123lol”一个新的警告窗口将会出现显示“喝彩”。

如果输入的值不正是“toto123lol”一个新的警告窗口将会出现显示“失败......”

正如你所看到的,你的问题的初始功能包含了所有需要的信息,不仅运行工作的代码,也需要所有的本地代码搞清楚它在做什么。

结帐离开网站就提到

Root-me.org

也许什么测试正在试图展示的是什么可能看起来像无害的代码,其实是可以与可能的HTML标签中是可执行的东西。 或许有许多方式来影响行为?

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

更新:如果你想知道有什么区别“\\”之间或“\”我在这里问了- 为什么双或单逃逸



文章来源: Javascript calling Function() to create a function