计 算 机 病 毒
实 验 报 告
姓 名: 郭莎莎 学 号: 201306043023
培养类型: 技术类 年 级: 2013级
专 业: 信息安全 所属学院: 计算机学院
指导教员: 龙军 职 称: 教授
实 验 室: 实验日期: 2016.7.3
国防科学技术大学训练部制
《本科实验报告》填写说明
1.学员完成人才培养
和课程标准要所要求的每个实验后,均须提交实验报告。
2.实验报告封面必须打印,报告内容可以手写或打印。
3.实验报告内容编排及打印应符合以下要求:
(1)采用A4(21cm×29.7cm)白色复印纸,单面黑字打印。上下左右各侧的页边距均为3cm;缺省文档网格:字号为小4号,中文为宋体,英文和阿拉伯数字为Times New Roman,每页30行,每行36字;页脚距边界为2.5cm,页码置于页脚、居中,采用小5号阿拉伯数字从1开始连续编排,封面不编页码。
(2)报告正文最多可设四级标题,字体均为黑体,第一级标题字号为3号,其余各级标题为4号;标题序号第一级用“一、”、“二、”……,第二级用“(一)”、“(二)” ……,第三级用“1.”、“2.” ……,第四级用“(1)”、“(2)” ……,分别按序连续编排。
(3)正文插图、#
格#中的文字字号均为5号。
实验题目 Python病毒功能实现
目录
一、实验目的 4
二、实验内容 4
三、实验原理 4
(一)Linux病毒 4
1.Linux病毒的发展史 4
2.Linux平台下的病毒分类 5
(二)文件型病毒 6
1.感染COM文件: 6
2.感染EXE文件: 6
(三)python文件 7
四、实验所需软硬件 8
五、实验步骤 8
(一)程序框架 8
1.传播感染模块 8
2.备份模块 9
3.触发和破坏模块 9
(二)具体实现 9
(三)结果截屏 11
六、实验结果与分析 12
七、思考与
12
一、实验目的
了解和掌握计算机病毒的工作原理,编写一个具有基本功能的计算机病毒。
二、实验内容
编写简易Python病毒并实现一些基本功能
在宿主机上进行病毒测试
三、实验原理
(一)Linux病毒
1.Linux病毒的发展史
1996年的Staog是Linux系统下的第一个病毒,它出自澳大利亚一个叫VLAD的组织(Windows 95下的第一个病毒程序Boza也系该组织所为)。Staog病毒是用汇编语言编写,专门感染二进制文件,并通过三种方式去尝试得到root权限。 Staog病毒并不会对系统有什么实质性的损坏。它应该算是一个演示版。它向世人揭示了Linux可能被病毒感染的潜在危险。Linux系统上第二个被发 现的病毒是Bliss病毒,它是一个不小心被释放出来的实验性病毒。与其它病毒不同的是,Bliss本身带有免疫程序,只要在运行该程序时加上 “disinfect-files-please”选项,即可恢复系统。
2001年发现的Ramen蠕虫。Ramen 蠕虫可以自动传播,无需人工干预,所以和1988年曾使人们大受其苦的 Morris蠕虫非常相似。它只感染Red Hat 6.2和7.0版使用匿名FTP服务的服务器,它通过两个普通的漏洞RPC.statd和wu-FTP感染系统。表面看来,这不危险。它很容易被发现,且不会对服务器做出任何有破坏性的事情。但是当它开始扫描时,将消耗大量的网络带宽。
从1996年至今,新的Linux病毒屈指可数,这说明Linux是一个健壮的具有先天病毒免疫能力的操作系统。当然,出现这种情况,除了其自身
优秀外,还有其它的原因。
然而, 2001年3月,美国SANS学院的全球事故分析中心(Global Incident Analysis Center——GIAC)发现,一种新的针对使用Linux系统的计算机的蠕虫正通过互联网迅速蔓延,它将有可能对用户的电脑系统造成严重破坏。这种蠕虫被命名为“狮子”病毒,与Ramen蠕虫非常相似。但是,这种病毒的危险性更大,“狮子”病毒能通过电子邮件把一些密码和配置文件发送到一个位于china.COM的域名上。攻击者在把这些文件发回去之后就可以通过第一次突破时的缺口再次进入整个系统。这就是它与Ramen蠕虫的不同之处。
随着Klez病毒在Linux平台上的传染,微软的操作系统不再是唯一易受病毒攻击的操作系统了。即使Linux和其他一些主流 UNIX平台的用户可能不是微软捆绑应用软件的大用户,不可能通过这些软件造成病毒的泛滥,Linux和UNIX仍然有它们自身并不引人注目的脆弱点。除了Klez以外,其他Linux/UNIX平台的主要威胁有:Lion.worm、OSF.8759病毒、Slapper、Scalper、 Linux.Svat和BoxPoison病毒,这些都很少被提及。
另外,越多的Linux系统连接到局域网和广域网,就会有越多受攻击的可能,这是因为很多Linux病毒正在快速地扩散着。使用WINE的 Linux/UNIX系统特别容易受到病毒的攻击。WINE是一个公开源代码的兼容软件包,能让Linux平台运行Windows应用软件。
2.Linux平台下的病毒分类
可执行文件型病毒
可执行文件型病毒是指能够寄生在文件中的,以文件为主要感染对象的病毒。病毒制造者们无论使用什么武器,汇编或者C,要感染 ELF文件都是轻而易举的事情。这方面的病毒如Lindose,当其发现一个ELF文件时,它将检查被感染的机器类型是否为Intel 80386,如果是,则查找该文件中是否有一部分的大小大于 2,784字节(或十六进制AEO),如果满足这些条件,病毒将用自身代码覆盖它并添加宿主文件的相应部分的代码,同时将宿主文件的入口点指向病毒代码部分。
蠕虫(worm)
1988年Morris蠕虫爆发后,Eugene H. Spafford 为了区分蠕虫和病毒,给出了蠕虫的技术角度的定义,“计算机蠕虫可以独立运行,并能把自身的一个包含所有功能的版本传播到另外的计算机上。”在Linux平台下,蠕虫极为猖獗,像利用系统漏洞进行传播的ramen,lion,Slapper……每一个都感染了大量的 Linux系统,造成了巨大的损失。在未来,这种蠕虫仍然会愈演愈烈,Linux系统应用越广泛,蠕虫的传播程度和破坏能力也会随之增加。
脚本病毒
目前出现比较多的是使用shell脚本语言编写的病毒。此类病毒编写较为简单,但破坏力同样惊人。Linux系统中有许多的以.sh结尾的脚本文件,而一个短短十数行的shell脚本就可以在短时间内遍历整个硬盘中的所有脚本文件,进行感染。因此病毒制造者不需要具有很高深的知识,就可以轻易编写出这样的病毒,对系统进行破坏,其破坏性可以是删除文件,破坏系统正常运行,甚至下载一个木马到系统中等等。
后门程序:在广义的病毒定义概念中,后门也已经纳入了病毒的范畴。活跃在Windows系统中的后门这一入侵者的利器在Linux平台下同样极为活跃。从增加系统超级用户账号的简单后门,到利用系统服务加载,共享库文件注射,rootkit工具包,甚至可装载内核模块(LKM),Linux平台下的后门技术发展非常成熟,隐蔽性强,难以清除。
(二)文件型病毒
文件型病毒主要是感染可执行文件(PE文件)的病毒,如EXE,COM。病毒对宿主文件进行修改,把自身代码添加到宿主文件上。执行宿主程序时,将会先执行病毒程序再执行宿主程序
1.感染COM文件:
对于COM文件,系统加载时在经过一系列处理之后将全部文件读入内存,并把控制权交给该文件的第一条指令。如果该指令恰为病毒指令则病毒就会获得控制权。COM后缀带毒文件有两种结构:
? 病毒主体在原文件之后。病毒通过修改原文件头代之以一段程序(或简单地用一条跳转指令)指向后面病毒体,以后再恢复该处原指令。
? 病毒整体在原文件之前。加载时病毒体直接获得控制权,不破坏原程序任何部分。
2.感染EXE文件:
EXE后缀文件与COM后缀文件不同,有一特殊的“文件头”结构,其中加载了文件重定位信息等,而非可执行指令。
系统加载EXE后缀文件时根据文件头信息定位文件并设置入口处的堆栈指针和代码指针等。病毒在传染EXE后缀文件时一般将文件头的代码指针使之指向病毒入口,当系统加载时病毒首先获得控制权。
病毒要把自身复制到EXE文件中,需要做的修改主要有:
? 写入一个新节(病毒的程序体)
? 在节表中新加一个节头
? 修改PE文件头的文件表头中的相应字段(如NumberOfSections)
? 修改程序入口点地址
其中修改程序入口点地址是十分关键的,它保证系统运行宿主文件时先执行病毒程序。
(三)python文件
python的源代码py文件在运行时都会被先编译成字节码,并把编译的结果保存到PyCodeObject中,pyc文件即是把PyCodeObject从内存中以marshal
保存到文件后的结果。
Python中定义的PyCodeObject的结构
typedef struct {
PyObject_HEAD
int co_argcount; /* #arguments, except *args */
int co_nlocals; /* #local variables */
int co_stacksize; /* #entries needed for evaluation stack */
int co_flags; /* CO_..., see below */
PyObject *co_code; /* instruction opcodes */
PyObject *co_consts; /* list (constants used) */
PyObject *co_names; /* list of strings (names used) */
PyObject *co_varnames; /* tuple of strings (local variable names) */
PyObject *co_freevars; /* tuple of strings (free variable names) */
PyObject *co_cellvars; /* tuple of strings (cell variable names) */
/* The rest doesn't count for hash/cmp */
PyObject *co_filename; /* string (where it was loaded from) */
PyObject *co_name; /* string (name, for reference) */
int co_firstlineno; /* first source line number */
PyObject *co_lnotab; /* string (encoding addr<->lineno mapping) See
Objects/lnotab_notes.txt for details. */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
PyObject *co_weakreflist; /* to support weakrefs to code objects */
} PyCodeObject;
其中一些字段的含义
argcount:参数的个数
nlocals:局部变量的个数(包含参数在内)
stacksize:堆栈的大小
flags:用来表示参数中是否有*args或者 **kwargs
code:字节码
names:全局变量,函数,类,类的方法的名称
varnames:局部变量的名称(包含参数)
consts:一个常量表
pyc文件就是一个嵌套的PyCodeObject结构的组合。对于每个函数或者类的方法,都会生成一个对应的PyCodeObject结构。
所有的PyCodeObject都是通过调用以下的函数得以运行的:
PyObject * PyEval_EvalFrameEx(PyFrameObject *f, int throwflag)
它的作用是执行中间码,Python的代码都是通过调用这个函数来运行的。
通过上面的分析,我决定利用python代码执行的特性,用python写一个Linux下的“文件型病毒”。
四、实验所需软硬件
操作系统:ubuntu16.04 LTS 虚拟机
软件:Python2.7.11+
一、
二、
三、
四、
五、实验步骤
(一)程序框架
我决定用python写文件型病毒,是想既能体现文件型病毒的特点同时又不用到底层去计算字节数。程序包括以下几个模块:
1.传播感染模块
查找符号条件的宿主文件,然后将自身添加到宿主文件中。
为了隐蔽自身,并不是把病毒自身全部拷贝到被感染文件中去,那样的话用户很容易发现。我的做法是在一个隐蔽的位置创建病毒的一个备份,这样,当把病毒写入宿主文件时,并不是显式地写入,而只需要通过import语句引用即可达到同样的效果。
2.备份模块
备份文件我选择放在“/home/当前用户”这个目录下。因为在Linux的其他根目录下,如/usr、/bin,创建一个文件需要root权限,而用户一般情况下并不会在root权限下运行,这就涉及到提权问题。目前还没想到解决办法,所以暂时选择了“/home/当前用户”这个目录。
3.触发和破坏模块
日期触发。在每个星期的星期四这一天,用户执行被感染的.py文件,破坏模块就会执行。
系统重启。攻击模块理论上说可以任意定制,但要注意的是,如果引用了python的一些特殊模块,受害者主机系统可能并没有安装,程序执行时就会出错。
(二)具体实现
备份模块
感染模块
触发条件判断和破坏功能
(三)结果截屏
病毒程序被用户放在桌面的一个文件夹里
运行病毒之前
运行病毒之后,备份文件被成功创建,桌面上和桌面文件夹中的py文件都被感染。
没有重启,是因为日期不满足触发条件。这将在视频中进行演示。
六、实验结果与分析
达到预期效果。
七、思考与总结
这次病毒课是继系统安全之后又一门生动有趣的课程。在这门课程上,我学习到了病毒的基本原理。在这次实践的准备过程中,对文件型病毒有了更加深入的学习。在实现阶段,最初,我是把病毒文件整体复制到宿主文件里,隐蔽性较差;病毒文件或被感染后的宿主文件只能感染同一个子目录下的其他py可执行文件,传播范围较小。通过不断迭代,不断提高了病毒的隐蔽性和传播性。