网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制

上传人:w****i 文档编号:94517157 上传时间:2019-08-08 格式:PPT 页数:36 大小:287KB
返回 下载 相关 举报
网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制_第1页
第1页 / 共36页
网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制_第2页
第2页 / 共36页
网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制_第3页
第3页 / 共36页
网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制_第4页
第4页 / 共36页
网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制》由会员分享,可在线阅读,更多相关《网络安全教程 教学课件 ppt 田园 第3章 网络病毒的典型入侵机制(36页珍藏版)》请在金锄头文库上搜索。

1、第3章 网络病毒的典型入侵机制,3.1 栈溢出攻击,栈溢出攻击是第一代溢出攻击技术,也称为 Morris代码注入。先看下面一段C语言程序,这一函数将来自外部的一串字节复制到其局部数组buffer中,你能看出什么问题吗?,#define MAX_BUFFER_SIZE 256 void routine(char* p) /*p是来自外部的字符串*/ int x,y,u,v; char bufferMAX_BUFFER_SIZE; /*将输入字符串填入buffer:*/ strcpy(buffer, p); return; ,strcpy(buffer, p)将数组p的内容逐字节复制到数组buff

2、er,但没有检查p的实际长度是否超过buffer的容量,即MAX_BUFFER_SIZE! 设想运行期间p承载的是来自外部的网络消息,而且该消息(有意或无意)确实超过了上界MAX_BUFFER_SIZE,这将导致数组buffer的溢出。,图3-1 栈溢出攻击,图3-1 栈溢出攻击(续),3.2 单字节栈溢出攻击,看下面的C语言程序, #define MAX_BUFFER_SIZE 256 void routine(char* p) /*p是来自外部的字符串*/ char bufferMAX_BUFFER_SIZE; int i, n; /*将输入字符串填入buffer:*/ n = strle

3、n(p)=MAX_BUFFER_SIZE ? strlen(p) : MAX_BUFFER_SIZE; for( i=0; i=n; i+) bufferi = pi; ,for循环在计算数组上界时错误地多计算了一个字节,结果在运行期间可能实际向栈帧写入257个字节,即溢出一个字节。 仔细观察图3-3(a)中“父栈帧”地址项的位置和含义,不难发现一条间接的攻击途径。 为解释这一攻击,需要先解释一下,“Little-Endian”机器和“Big-Endian”机器的区别。,如图3-2所示,详细描述了单字节溢出攻击。,图3-2 Little-Endian和Big-Endian机器的区别,图3-3

4、Little-Endian机器上的单字节溢出攻击,细心的读者会注意到,成功实施这一攻击的关键在于能够成功伪造出父函数的栈帧。 父函数的栈帧记录的是父函数在调用函数routine之前的临时状态,routine返回后其父函数需要从这一瞬间状态继续向后执行。 如果父栈帧伪造不当导致父函数执行发生错误,不能正常结束而返回,则攻击者将达不到执行病毒代码的目的。,3.3 堆溢出攻击,堆(heap)在进程运行期间由操作系统动态分配并映射成为进程空间的一部分。 堆溢出攻击技术,目的仍然是通过溢出篡改合法数据,再通过这一篡改改变当前进程的执行流。,#define MAX_BUFFER_SIZE 256 int

5、main(int argc, char* argv) int i=0, ch; FILE *f; static char bufferMAX_BUFFER_SIZE; static char* szFilename = “c:procfile.txt“; ch = getchar(); while(ch!=EOF) /*可能导致buffer溢出 */ bufferi = ch; ch = getchar(); i+; f = fopen(szFilename, “w+b“); fputs(buffer, f); fclose(f); ,以上程序中的变量buffer 和szFilename在进程

6、空间中的布局如图3-4(a)所示。根据程序,buffer由来自程序输入流的字节顺序填充,如果攻击者炮制的输入流超长而且恰好改写了紧邻buffer的堆变量szFilename,这意味着该程序将打开一个攻击者指定的文件进行I/O操作。 如果这是一个特权进程,攻击者将有机会存取操作一个本来没有权限存取的敏感文件。 利用堆溢出攻击还有可能篡改进程空间中的函数地址以改变进程流程。 看下面的C语言程序。,#define MAX_BUFFER_SIZE 256 int CallBack(const char* szTemp) int main(int argc, char* argv) static cha

7、r bufferMAX_BUFFER_SIZE; static int (*funcptr)(const char*); /*函数指针*/ funcptr = (int(*)(const char*)CallBack; strcpy(buffer, argv1); /*Size unchecked!*/ (int)(*funcptr)(argv2); ,图3-4 堆溢出攻击的例子:篡改变量值,以上程序没有检查argv1是否超出长度,从而使攻击者有可能通过溢出来篡改函数指针funcptr的值,结果将以argv2(注意该参数也来自攻击者!)为参数,执行的不再是预期的函数CallBack,而是攻击者

8、指定的任何函数。 在图3-5中描述了这一过程。,图3-5 堆溢出攻击的例子:篡改函数指针,3.4 小结及进一步学习的指南,附录3.1 网络编程概要,A3.1.1 socket API,图3-6 socket模型,第一,两个通信进程各自创建一个socket对象,通过定义参数告知socket对象通信对方是谁,以什么协议(例如是TCP还是UDP)进行通信,通信过程中的某些输入/输出问题如何处理(例如,以TCP传输数据时,是有任何字节到达时即通知应用程序,还是到达指定的临界字节数后才这样做)等。 第二,一旦通信开始,socket对象负责处理传输过程中的一切事务。,第三,socket对象在网络上传输的仅

9、仅是字节流,即socket不对被传输信息的结构做任何假设,所有关于被传输信息的结构和含义的解释都由应用程序完成。 第四,socket对象为应用程序提供通信功能的方式与具体协议族无关。,几个最常用的socket API函数的主要功能。 int socket(int afam, int type, int protocol); 创建一个socket对象,返回socket对象的文件描述符。 int bind(int sock, struct sockaddr* localaddr, int addrlen); 对socket对象指定地址及传输层端口号, int connect(int sock, s

10、truct sockaddr* remoteaddr, int addrlen); 从描述符sock所标识的本地socket对象到remoteaddr所指示的远程对象建立连接。,int listen(int sock, int queuelen); listen使TCP-socket对象sock准备接受到达的连接请求。 int accept(int sock, struct sockaddr* remoteaddr, int* paddrlen); 调用accept函数的进程或线程进入睡眠,直到有TCP连接请求到达并且该连接被正确建立后才被唤醒,这时建立TCP连接的三次握手过程已经完成,TCP

11、连接已被建立并且被赋予一个新的(由操作系统自动创建的) socket对象,accept的返回值正是该对象的文件描述符。,int read(int sock, char* buff, int size); int write(int sock, char* buff, int size); 和accept一样,这两个函数是阻塞式的,即它们使调用进程或线程睡眠直到其操作完成后返回。 recvfrom(int sock, char* buff, int size, int flags, struct sockaddr* from, int* fromlen); sendto(int sock, ch

12、ar* buff, int size, int flags, struct sockaddr* to, int tolen); 这两个函数在UDP-socket对象上接收和发送UDP数据报,也都是阻塞式函数。,int close(int sock); 在调用这一函数后,socket对象不再可用,即不能再在该socket对象上调用read/write这类函数,否则将返回错误。 int shutdown(int sock, int flags); 这是一个较close更灵活的函数,它关闭本地socket对象到对方socket对象的TCP连接,这意味着在调用shutdown 之后不能在本地对象上调用

13、write,但还可以继续调用read正常接收对方发送的数据。 int setsockopt(int sock, int level, int option, char* optval, optlen); 它的作用在于可以设置大量的socket对象配置选项,这些选项用来控制socket对象的行为。,A3.1.2 基于UDP的客户机/服务器系统,图3-7 基于UDP的客户机/服务器过程,A3.1.3 基于TCP的客户机/服务器系统,图3-8 基于TCP的客户机/服务器过程,图3-8 基于TCP的客户机/服务器过程(续),图3-8 基于TCP的客户机/服务器过程(续),图3-8 基于TCP的客户机/

14、服务器过程(续),图3-8 基于TCP的客户机/服务器过程(续),A3.1.4 高性能服务器编程,图3-9 多进程服务器,图3-10 多线程服务器,A3.1.5 多协议服务器编程,int select(int ignore, fd_set* refds, fd_set* wrfds, fd_set* exfds, const struct timeval* timeout), 利用select,我们可以实现一个单线程的多协议服务器如下。 /*创建多个socket对象*/ int fd_web=socket(AF_INET, SOCK_STREAM, 0); int fd_ftp=socket(AF_INET, SOCK_STREAM, 0); int fd1, fd2, fdn; bind(fd_web,); /*为一个socket对象指派IP地址和Web服务端口号*/ listen(fd_ftp,); /*为一个socket对象指派IP地址和FTP服务端口号*/ ,while(1) FD_SET(fd_web, ,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号