分享
 
 
 

浅谈关于Unix操作系统下的病毒特点

王朝system·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

ELK CLONER:第一个计算机病毒,它将会得到你磁盘上所有的东东,它甚至将渗透到芯片内部,这就是Cloner!它会象胶水一样粘住你,它还会修改内存!

计算机病毒是大量的电子破坏技术手段中最著名的成员。它们实际上就是一些非常危险的恶意程序,它们是丑陋的,不过在我看来它们很可爱,源于我对Internet的驾驭和对计算机程序的探索。它们会复制自己并且可以传染其它文件,这些被传染的文件甚至包括了那些很清白的文档文件。而且它们很容易获得,他们可以随处传播,任何时间、任何地点。实际上,没有一个OS可以完全抵御病毒,一个病毒可以完全依靠系统本身进行复制,比如利用Windows系列操作系统的pe格式的可执行文件和利用类unix操作系统的elf格式。所以,任何计算机病毒都依附于OS的体系结构,各种OS的病毒的写法都不一样,但任何OS也逃避不了病毒,包括Linux。

正如以上所说,Linux也可以被感染,就像Windows NT或者Mac OS这样的操作系统一样。不论是PC机上的DOS或Windows,或者是Amiga,都可以创造出病毒代码。那么,我们为什么不来看看在Windos NT或Linux系统上的一些病毒呢?

你也许会奇怪,事实上第一个计算机病毒是Unix病毒(有可能第一个就是ElkCloner,好象是编写于1980到1982年之间)。FredCohen在4BSD的VAX系统上编写了一些非常早的Unix病毒,一年以后ElkCloner就诞生了。由于Unix系统具有内存保护机制,所以人们不太相信Unix系统上的病毒的危害性会超过Windows和DOS系统,但他们错了。

一些公共的误区

一个最大的误区就是很多高性能的安全系统对病毒蔓延的预防。因为我们是利用DOS系统和它本身并不存在任何内存保护机制和数据保护机制,我们认为病毒可以完全控制计算机的所有资源。是的,它们会很轻易地成为DOS和简单Windows操作系统的完全控制用户。没有内存保护机制和数据保护机制,计算机病毒可以夺取所有的计算机控制权。相对来说,Windows NT和Unix系统是非常高级的保护机制的系统。这可以预防大多数的病毒的传染,但不是所有的。当一个用户以root或administrator的身份来操作的时候,这些系统的保护机制实际上是停止了的。一个设计的很巧妙的病毒可以利用自己的方法来找到文件系统上的每个文件,NT ownership或者ACL机制都没有很好的重视这个问题。

另一个误区就是认为Linux系统尤其可以防止病毒的感染,因为Linux的程序都来自于源代码,不是二进制格式,这才应该值得重视,因为毕竟只有极少数的人(甚至管理员)才有足够的能力来从源代码中发现病毒代码,而且这是一个相当耗费时间和精力的工作。一般的用户习惯于用二进制格式的文件来交流,因为他们不想在使用这些程序的时候还要很繁琐的执行诸如make config、make之类的命令,他们喜欢很简单的运行程序。所有的这些原因就给了Unix系统上的病毒有足够的空间来访问和操控系统。

第三个误区就是认为Unix系统是绝对安全的,因为它具有很多不同的平台,而且每个版本的Unix系统有很大的不一样。但是现在不能这样看了,现在的病毒都用标准C来编写以适应任何类Unix操作系统,并且他们可以用make程序来跨平台编译。想想那个Morris写的internet的蠕虫病毒利用的就是这项技术,并且拥有标准的ELF二进制格式和库文件。

Shell脚本

我们面临的第一个问题就是如何传播的问题,这是天生具有的问题,至少在Unix系统上是如此,我们需要想办法使各个平台兼容,所以我们首先想到的是:shell脚本语言。shell在不同的Unix系统上面的差别很小,所以FredCohen在他的书《入侵者、蠕虫和病毒》(发表于1990年)中写道:“在unix的命令解释语言中,病毒代码可以被写到200个字节之内。”也许我们可以根据他的话来写一个man page的病毒脚本,可以用来操作文件和可执行程序,这和宏病毒非常相像。man page的病毒不会蔓延到别的系统上,除非你有为别的用户改变man page的格式的习惯。无论如何,这种病毒都是一个公共的跨系统的病毒。同样,也可以写另个一个脚本病毒来控制mail的阅读者。

书写shell脚本病毒是一个很简单的制造Unix病毒的方法。我知道肯定会有很多同行会说,脚本病毒怎么会是真正的病毒呢?它只是用脚本语言来书写的而不是用汇编。但是实际上,我们评定一个病毒是病毒本身可以在系统上任意感染传播,而不是这个病毒的大小或者用什么语言来写的。在USENIX1989 卷2上你可以看到Tom Duff和M. Douglas McIlroy的脚本病毒代码。shell脚本病毒的危害性不会很大并且它本身极易被破坏,因为它是以明文方式编写并执行的,任何用户和管理员都可以发觉它的代码。但是,我想大多数的用户都不会理解一下代码的吧:

for %%f in (*.bat) do copy %%f + bfv.bat

通常一个用户会深信不疑地去执行任何脚本,而且不会过问该脚本的由来。这样,这些用户都成为病毒的目标了;这些都是用户的意识问题,这样是没办法避免病毒的入侵的,所以我们的用户需要大大加强对这些病毒的防范意识。

蠕虫

另外的一个影响广泛的技术就是蠕虫,想象一下Morris蠕虫:利用攻击程序――一般这些攻击程序都是已经存在的技术。这个蠕虫利用一个sendmail程序已存在的漏洞来获取其它机器的控制权。病毒一般会利用rexec、fingerd或者口令猜解来尝试连接。在成功入侵之后,它会编译在目标机器上编译源代码并且执行它,而且会有一个程序来专门负责隐藏自己的脚印。Internet的蠕虫病毒一般都是利用已知的攻击程序去获得目标机的管理员权限,但是蠕虫的生命也是很短暂的,当该病毒所利用的漏洞被修补的话,那么该蠕虫也就失去它的作用了,因为他们需要利用exploit这个媒介来进行自身的复制。而exploit又是只针对特定版本的特定程序才会有效的,所以蠕虫的跨平台能力很差,时效性也很弱。

欺骗库函数

我们可以愚弄那些比较傻的用户。如果你利用LD_PRELOAD环境变量来捉弄他,你可以让他执行你自己的代码,你已经利用LD_PRELOAD环境变量把标准的库函数替换成了你自己的程序,挺有意思吧?LD_PRELOAD并不是linux系统特有的,并且它一般用在一些应用程序(比如老版本的StarOffice需要运行在较新版本的Redhat系统上)必须用他们自己的(或者比较老的版本,或者修改过的)库函数,因为在安装的时候没有满足他们的需求。Quantum(Staog病毒的作者)在Unix病毒的邮件列表里面提供了这些代码,我做了修改,也是为了便于大家理解:

------------------------tryld.c------------------------------

extern int __open(char *, int, int);

extern int execv(char *, char *[], char *envp[]);

int open(char *path, int flags,

int mode){

printf("open: %s\n", path);

return __open(path, flags, mode);

}

/* 注意这里,原来它放弃了envp参数,这样会...:(?!

呵呵,所以我修改了一下,影响不大:)*/

int execve(char *path, char *args[],

char *envp[]){

printf("execve: %s\n", path);

return execv(path, args, envp);

}

--------------------------------------------------------------

------------------------main.c--------------------------------

/*test only,by e4gle*/

#include

#include

#include

#include

main()

{

int fd;

execve("/bin/date","",NULL);

if(fd=open("/etc/inittab",O_RDONLY)!=-1)

{

fprintf(stdout,"open file succeed!\n");

}

else

fprintf(stderr,"open error!\n");

close(fd);

return 0;

}

----------------------------------------------------------------

这段代码获取open和execv并且改变了它们的输出,好,我们测试一下:

[e4gle@redhat62 elf]$ gcc -o main main.c

[e4gle@redhat62 elf]$ ./main

open file succeed! <--证明我们打开文件成功了,open调用正常工作

[e4gle@redhat62 elf]$ ldd -v -r ./main

libc.so.6 = /lib/libc.so.6 (0x4001c000)

/lib/ld-linux.so.2 = /lib/ld-linux.so.2 (0x40000000)

Version information:

./main:

libc.so.6 (GLIBC_2.0) = /lib/libc.so.6

/lib/libc.so.6:

ld-linux.so.2 (GLIBC_2.1.1) = /lib/ld-linux.so.2

ld-linux.so.2 (GLIBC_2.1) = /lib/ld-linux.so.2

ld-linux.so.2 (GLIBC_2.0) = /lib/ld-linux.so.2

/*跟踪一下库函数的利用,都是glibc的标准库函数,solaris里面是sotruss,我个人认为sotruss

比较好用:)*/

[e4gle@redhat62 elf]$ gcc -shared -o tryld tryld.c

[e4gle@redhat62 elf]$ export LD_PRELOAD=./tryld <--用我们自己的lib

[e4gle@redhat62 elf]$ ./main

execve: /bin/date

open: /etc/inittab

open file succeed!

/*注意!不一样了吧?已经在用我们自己的open和execve了,呵呵:)*/

以上仅仅是个测试代码并且没有任何危害性,但是它足以说明我们利用欺骗函数库来攻击程序的原理。

内核级的传播

这里我们称作“内核级别的病毒”,病毒可以传染内核映像,这样病毒可以控制系统的方方面面。但是这种病毒技术目前尚处于理论阶段,并没有真正实现,但并不代表以后都不会出现。

与平台兼容的病毒

如果我们用标准C来书写病毒代码的话,各种不

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有