谁能解释一下下面的代码?
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拍摄。
它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
但因为我不能查看本机代码,我有困难的理解是越来越创建的实际功能。
你必须在脚本标签中的本机代码。 它只是看起来不寻常,因为它引用的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标签中是可执行的东西。 或许有许多方式来影响行为?
我希望这回答了你的问题。
更新:如果你想知道有什么区别“\\”之间或“\”我在这里问了- 为什么双或单逃逸