导航

20189207《网络攻防实践》第十周作业

Posted on 2019-05-05 15:50  20189207高鹏飞  阅读(224)  评论(0编辑  收藏  举报

冯·诺依曼体系结构

根据冯·诺依曼体系结构构成的计算机,必须具有如下功能:把需要的程序和数据送至计算机中;必须具有长期记忆程序、数据、中间结果及最终运算结果的能力;能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力;能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;能够按照要求将处理结果输出给用户。

为了完成上述的功能,计算机必须具备五大基本组成部件,包括:输入数据和程序的输入设备、存放程序和数据的存储器、完成数据加工处理的运算器、控制程序执行的控制器、输出处理结果的输出设备。

总结起来,冯·诺依曼结构处理器具有以下几个特点:

1)必须有一个存储器;

2)必须有一个控制器;

3)必须有一个运算器,用于完成算术运算和逻辑运算;

4)必须有输入和输出设备,用于进行人机交互。

从中可以看出,冯·诺依曼的主要贡献就是提出并实现了“存储程序”的概念。由于指令和数据都是二进制码,指令和操作数的地址又密切相关,因此,当初选择这种结构是自然的。但是,这种指令和数据共享同一总线的结构,使得信息流的传输成为限制计算机性能的瓶颈,影响了数据处理速度的提高。

在典型情况下,完成一条指令需要3个步骤,即,取指令、指令译码和执行指令。从指令流的定时关系也可看出冯·诺依曼结构与哈佛结构处理方式的差别。举一个最简单的对存储器进行读写操作指令的例子,指令1~指令3均为存、取数指令,对于冯·诺依曼结构处理器,由于取指令和存取数据要从同一个存储空间存取,经由同一总线传输,因而它们无法重叠执行,只有一个完成后再进行下一个。

ARM7系列的CPU有很多种类,其中部分CPU没有内部Cache,比如ARM7 TDMI就是纯粹的冯·诺依曼结构,其他有内部Cache且数据和指令的Cache分离的CPU则使用了哈佛结构。

从计算机诞生那天起,冯·诺依曼体系结构即占据了主导地位,几十年来计算机体系结构理论并没有新理论出现。随着计算机应用范围的迅速扩大,使用计算机解决的问题规模也越来越大,因此对计算机运算速度的要求也越来越高。而改进计算机的体系结构是提高计算机速度的重要途径,从而促进了计算机体系结构的发展,出现了诸如数据流结构、并行逻辑结构、归约结构等新的非冯·诺依曼体系结构。

冯·诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯·诺依曼计算机的组织结构,只是做了一些改进,而并没有从根本上突破冯体系结构的束缚。冯·诺依曼也因此被人们称为“计算机之父”。然而由于传统冯·诺依曼计算机体系结构天然所具有的局限性,从根本上限制了计算机的发展,主要限制如下。

1)采用存储程序方式,指令和数据不加区别混合存储在同一个存储器中,数据和程序在内存中是没有区别的,它们都是内存中的数据,当EIP指针指向哪,CPU就加载那段内存中的数据,如果是不正确的指令格式,CPU就会发生错误中断。在现在CPU的保护模式中,每个内存段都有其描述符,这个描述符记录着这个内存段的访问权限(可读、可写、可执行)。这就变相地指定了哪些内存中存储的是指令,哪些是数据,指令和数据都可以送到运算器进行运算,即由指令组成的程序是可以修改的。

2)存储器是按地址访问的线性编址的一维结构,每个单元的位数是固定的。

3)指令由操作码和地址码组成。操作码指明本指令的操作类型,地址码指明操作数和地址。操作数本身无数据类型的标志,它的数据类型由操作码确定。

4)通过执行指令直接发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器只有一个,一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。

5)以运算器为中心,I/O设备与存储器间的数据传送都要经过运算器。

6)数据以二进制表示。

从本质上讲,冯·诺依曼体系结构的本征属性就是两个一维性,即一维的计算模型和一维的存储模型,简单地说“存储程序”是不确切的。而正是这两个一维性,成就了现代计算机的辉煌,也限制了计算机的进一步发展,真可谓“成也冯,败也冯”。

冯·诺依曼体系结构的局限严重束缚了现代计算机的进一步发展,而非数值处理应用领域对计算机性能的要求越来越高,这就急需突破传统计算机体系结构的框架,寻求新的体系结构来解决实际应用问题。目前在体系结构方面已经有了重大的变化和改进,如并行计算机、数据流计算机、量子计算机以及DNA计算机等非冯计算机,它们部分或完全不同于传统的冯·诺依曼型计算机,很大程度上提高了计算机的计算性能。

传统的冯·诺依曼型计算机从本质上讲是采取串行顺序处理的工作机制,即使有关数据已经准备好,也必须逐条执行指令序列。而提高计算机性能的根本方向之一是并行处理。因此,近年来人们谋求突破传统冯·诺依曼体制的束缚,这种努力被称为非诺依曼化。对所谓非诺依曼化的探讨仍在争议中,主要表现在以下三个方面。

1)在冯·诺依曼体制范畴内,对传统冯·诺依曼机进行改造,如采用多个处理部件形成流水处理,依靠时间上的重叠提高处理效率;又如组成阵列机结构,形成单指令流多数据流,提高处理速度。这些方向已比较成熟,成为标准结构。

2)用多个冯·诺依曼机组成多机系统,支持并行算法结构。这方面的研究目前比较活跃。

3)从根本上改变冯·诺依曼机的控制流驱动方式。例如,采用数据流驱动工作方式的数据流计算机,只要数据已经准备好,有关的指令就可并行地执行。这是真正非诺依曼化的计算机,它为并行处理开辟了新的前景,但由于控制的复杂性,仍处于实验探索之中。

图灵机

图灵机,又称图灵计算、图灵计算机,是由数学家阿兰·麦席森·图灵(1912~1954)提出的一种抽象计算模型,即将人们使用纸笔进行数学运算的过程进行抽象,由一个虚拟的机器替代人们进行数学运算。

所谓的图灵机就是指一个抽象的机器,它有一条无限长的纸带,纸带分成了一个一个的小方格,每个方格有不同的颜色。有一个机器头在纸带上移来移去。机器头有一组内部状态,还有一些固定的程序。在每个时刻,机器头都要从当前纸带上读入一个方格信息,然后结合自己的内部状态查找程序表,根据程序输出信息到纸带方格上,并转换自己的内部状态,然后进行移动。

作为研究计算的一般性质的抽象工具,替代人们进行数学运算,并有以下作用:

1、作为语言接受器:被M接受的语育记作L(M),它是Σ中的这样一些字符串的集合,当把这些字符串放在M的带子上,M处于q0状态且M的带头处在最左单元时.这些字符串可以使M进入一个终结状态而停机。给定一个识别语言L的图灵机M,一般假定,当输入被接受时,M为停机,即没有下一动作。然而对于不被接受的字符串,M可能永不停机.被图灵机接受的语官称为递归可枚举语言。递归集合是递归可枚举集合的子类,递归集合总能被对所有输入都能停机的图灵机所接受。

2、作为整数函数计算机:被图灵机计算的函数称为部分递归函数。在某种意义上,部分递归函数类似于递归可枚举语言.因为计算它的图灵机在给定的输入上可能不停机。完全递归函数对应于递归语育.因为它能被总能停机的图灵机计算。

3、作为语言产生器:设M是一个多带图灵机,它用一条带作为输出带,在这条带上,符号一经写出上就不能再改写.输出带的带头也不能左移。假定在输出带上,M写出某个字毋表Σ的一些字符串,并用分隔符分开,则最终打印在输出带上的字符串的集合就称为由M生成的语言,记为G(M),G(M)Σ。如果L是某个图灵机生成的语言,则L是递归可枚举集合,反之亦然。

图灵的基本思想是用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看作下列两种简单的动作:

在纸上写上或擦除某个符号;

把注意力从纸的一个位置移动到另一个位置;

而在每个阶段,人要决定下一步的动作,依赖于此人当前所关注的纸上某个位置的符号和此人当前思维的状态。

为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:

1.一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,。.. ,纸带的右端可以无限伸展。

2.一个读写头 HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。

3.一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。

4.一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。

注意这个机器的每一部分都是有限的,但它有一个潜在的无限长的纸带,因此这种机器只是一个理想的设备。图灵认为这样的一台机器就能模拟人类所能进行的任何计算过程。

图灵机和冯·诺依曼体系的异同

都采用了存储程序的思想,只是冯·诺依曼体系采用的是存储器而图灵机将程序集成到了机器内部,他们都会根据输入的不同跳转的不同的位置读取指令并计算数据。

对“程序=指令+数据”的理解

程序存放于磁盘,如果想要运行必须先载入到内存,程序可以分成指令和数据,指令和数据分开存储。只有在需要的时候才将需要的指令或是数据加载到内存,这样可以节省内存或者是高速缓存的空间,将指令和数据分开存储也可以更好的区分指令和数据。

三种安全问题

缓冲区溢出攻击

通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:
void function(char *str) {char buffer[16]; strcpy(buffer,str);}
上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在像strcpy这样的问题的标准函数还有strcat()、sprintf()、vsprintf()、gets()、scanf()等。
当然,随便往缓冲区中填东西造成它溢出一般只会出现分段错误(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
缓冲区溢出攻击之所以成为一种常见安全攻击手段其原因在于缓冲区溢出漏洞太普遍了,并且易于实现。而且,缓冲区溢出成为远程攻击的主要手段其原因在于缓冲区溢出漏洞给予了攻击者他所想要的一切:植入并且执行攻击代码。被植入的攻击代码以一定的权限运行有缓冲区溢出漏洞的程序,从而得到被攻击主机的控制权。
在1998年Lincoln实验室用来评估入侵检测的的5种远程攻击中,有2种是缓冲区溢出。而在1998年CERT的13份建议中,有9份是是与缓冲区溢出有关的,在1999年,至少有半数的建议是和缓冲区溢出有关的。在ugtraq的调查中,有2/3的被调查者认为缓冲区溢出漏洞是一个很严重的安全问题。
缓冲区溢出漏洞和攻击有很多种形式,会在第二节对他们进行描述和分类。相应地防卫手段也随者攻击方法的不同而不同,将在第四节描述,它的内容包括针对每种攻击类型的有效的防卫手段。

XSS攻击

XSS是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的网络钓鱼(Phishing)攻击而变得广为人知。对于跨站脚本攻击,骇客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击“,而JavaScript是新型的“ShellCode”。

SQL注入

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。
根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。
当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

三种攻击的共同点

三种攻击都是利用存储程序的特点,将非法程序插入到要执行的程序中,使程序跳转到攻击者想要执行的位置执行从而完成攻击。抽象的解决方案,个人认为可以将用户的输入视为数据,而指令部分不能被修改,这样根据用户的输入数据不同,跳转到不同的程序进行执行,并且应当设置一个合法范围,超出部分不能执行。

参考资料

1.CSDN用户chenkaibsw的《冯诺依曼体系结构》
2.博客园用户hellowzl的《图灵机(转自wiki)》
3.CSDN用户码墨的《程序是如何被计算机所执行的?》