加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

BlackHat之路第二期:Worm_down.ad创建mutex分析

(2009-02-24 14:44:20)
标签:

worm_down.ad

ms08-067

mutex

it

分类: 研究探索
Worm_down.aWorm_down.ad都是利用 MS08-067漏洞,通过溢出挂载svchost.exe进程从而进行局域网传播的病毒。其中.ad.a的变种。

 

这两个变种都有一些一样的功能,其中一个便是当本身被加载后,会创建一个Mutex,以防止被重复加载。

 

.a变种创建该Mutex的方法是调用zip.lib中的crc32算法,将计算机名进行crc验算后作为Mutex的名字。由于该方法简单,所以很容易创建相同的Mutex

 

.ad变种意识到了这一点,因此作者自己写了一个算法,用来生成Mutex名。这里我们便来分析一下.ad变种生成该Mutex的方法。

 

由于要根据计算机名做Mutex,因此我们在GetComputerNameA上设断点,然后F9运行,如下图:

BlackHat之路第二期:Worm_down.ad创建mutex分析

Ctrl+F9运行至GetComputerNameA下一行指令:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

于是我们发现了与.a变种差不多代码。先获得计算机名,然后生成_snprintf需要的参数,最后通过_snprintf生成Mutex名。

我们从_snprintf往上看,发现有两个函数:009fb647009fb510,跟进去看看:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

大致一看,我们看到rand函数,inccmpjl在一起,我们于是想到for循环

一步一步分析如下:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

于是有了这些分析,我们大概能总结出该函数是如下C++代码:

if( n != 0)

{

    for(int i =0; i < n; i++)

    {

        int j = 26;

        int m = rand();

        m %= j;

        m += 97;

    }  

}

 

可是n是哪里来的呢?看来函数是带参数的,果然,我们看到:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

第一个参数0a09e14应该是一个buffer数组,edx应该就是循环的次数了,可是edx哪里来的呢,继续往上看:

 

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

我们一眼就能看到srandrand,那看来edx也和随机数有关系。我们一句一句来看:

先调用009f8245,然后将返回结果和2f53508b进行异或运算,得到srand的随机数种子seed,接下来调用rand函数生成一个随机数,最后将该随机数除以3,求余数,再加上6,就是我们刚才那个函数的edx了。哈哈,看来这个Mutex的长度是68位。

 

有了这样的分析,我们差不多就知道个大概了。我们从头理一下,我们可以总结出以下c++代码(为了方便显示,我们不采用buffer,而是直接输出)

 

#include "stdafx.h"

#include <iostream>

using namespace std;

 

void output(int n)

{  

    if( n != 0)

    {

        for(int i =0; i < n; i++)

        {

            int j = 26;

            int m = rand();

            m %= j;

            m += 97;

            cout << char(m);

        }  

    }

}

 

int _tmain(int argc, _TCHAR* argv[])

{

    srand(390548251);

    int j = rand() % 3;

    output(j+6);

    getchar();

}

 

运行后输出以下结果:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

与病毒生成的Mutex一样:

BlackHat之路第二期:Worm_down.ad创建mutex分析

 

所以,现在我们就可以自己生成这个Mutex,用来防止病毒被加载了。

需要说明的是:这个不变的Mutex其实也是利用了rand()函数。当不为rand设置随机数种子时,只要不重启机器,通过rand每次生成的随机数都是一样的。所以,只要不重启机器,病毒每次创建的Mutex都是一样的。


(完)

Jason Zhou

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有