2018-2019-2 20189206 《网络攻防实践》 第十周作业
2018-2019-2 20189206 《网络攻防实践》 第十周作业
First Draft of a Report on the EDVAC
EDVAC (Electronic Discrete variable Automatic Computer)。离散变量自动电子计算机。
1945年冯·诺依曼以“关于EDVAC的报告草案”为题,起草了长达101页的总结报告。报告广泛而具体地介绍了制造电子计算机和程序设计的新思想。这份报告是计算机发展史上一个划时代的文献,它向世界宣告:电子计算机的时代开始了。
EDVAC方案明确奠定了新机器由五个部分组成,包括:
- 运算器
- 逻辑控制装置
- 存储器
- 输入和输出设备
并描述了这五部分的职能和相互关系.报告中,诺伊曼对EDVAC中的两大设计思想作了进一步的论证,为计算机的设计树立了一座里程碑。
设计思想之一是二进制,他根据电子元件双稳工作的特点,建议在电子计算机中采用二进制。报告提到了二进制的优点,并预言,二进制的采用将大大简化机器的逻辑线路。
冯诺依曼体系结构和图灵机的联系与区别
提到冯诺依曼体系结构,我不得不推荐一部我最近正在看的科幻小说《三体》,在第一部中作者描绘一个人列计算机,我也是因为这一段描述深深地佩服作者的文字能力和想象能力,作者能够将一些科学理论自然而然地嵌入到这本小说中,单单是从文字中就能感受到那种令人震撼的场景。
冯·诺伊曼用秦始皇的士兵构建人列计算机计算的系统部件:与门、与非门、或非门、异或门、同或门和三态门及非门。
构建“与门”:
“我不知道你们的名字,”冯·诺伊曼拍拍前面两个士兵的肩,“你们两个负责信号输入,就叫‘入1’、‘入2’吧,”他又指指最后一名士兵,“你,负责信号输出,就叫‘出’吧。”他伸手拨动三名士兵,“这样,站成一个三角形,出是顶端,入1和入2是底边。”
……
冯·诺伊曼指着下方巨大的人列回路开始介绍:“陛下,我们把这台计算机命名为‘秦一号’。请看,那里,中心部分,是CPU,是计算机的核心计算元件,由您最精锐的五个军团构成,对照这张图您可以看到里面的加法器、寄存器、堆栈存贮器;外围整齐的部分是内存,构建这部分时我们发现人手不够,好在这部分每个单元的动作最简单,就训练每个士兵拿多种颜色的旗帜,组合起来后,一个人就能同时完成最初二十个人的操作,这就使内存容量达到了运行‘秦1.0’操作系统的最低要求;你再看那条贯穿整个阵列的通道,还有那些在通道上待命的轻骑兵,那是BUS,系统总线,负责在整个系统间传递信息。
“总线结构是个伟大的发明,新的插件,最大可由十个军团构成,能够快捷地挂接到总线上运行,这使得‘秦一号’的硬件扩展和升级十分便利;再看最远处那一边,可能要用望远镜才能看清,那是外存,我们又用了哥白尼起的名字,叫它‘硬盘’,那是由三百万名文化程度较高的人构成,您上次坑儒时把他们留下是对了,他们每个人手中都有一个记录本和一支笔,负责记录运算结果,当然,他们最大的工作量还是作为虚拟内存,存贮中间运算结果,运算速度的瓶颈就在他们那里。这儿,离我们最近的地方,是显示阵列,能显示计算机运行的主要状态参数。”
看完了小说,让我们回到冯诺依曼体系和图灵机
冯诺依曼体系结构
根据冯诺依曼体系结构构成的计算机,必须具有如下功能:
- 把需要的程序和数据送至计算机中。
- 必须具有长期记忆程序、数据、中间结果及最终运算结果的能力。
- 能够完成各种算术运算、逻辑运算和数据传送等数据加工处理的能力。
- 能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作。
- 能够按照要求将处理结果输出给用户。
为了实现计算机的上述功能,计算机必须具备五大基本组成部件,包括:
- 运算器:用于完成各种算术运算、逻辑运算和数据传送等数据加工处理。
- 控制器:用于控制程序的执行,是计算机的大脑。运算器和控制器组成计算机的中央处理器(CPU)。控制器根据存放在存储器中的指令序列(程序)进行工作,并由一个程序计数器控制指令的执行。控制器具有判断能力,能根据计算结果选择不同的工作流程。
- 存储器:用于记忆程序和数据,例如:内存。程序和数据以二进制代码形式不加区别地存放在存储器中,存放位置由地址确定。
- 输入设备:用于将数据或程序输入到计算机中,例如:鼠标、键盘。
- 输出设备:将数据或程序的处理结果展示给用户,例如:显示器、打印机。
五大基本组成部件之间通过指令进行控制,并在不同部件之间进行数据的传递。
这种体系结构一直延续至今,现在使用的计算机,其基本工作原理仍然是存储程序和程序控制,所以现在一般计算机被称为冯诺依曼结构计算机。
图灵机
图灵机的基本思想:使用机器来模拟人们用纸笔进行数学运算的过程,他把这样的过程看做是以下两种动作
- 在纸上写上或擦除某个符号
- 把注意力从纸的一个位置移动到另一个位置
而在每个阶段,人要决定下一步的动作,依赖于此人当前所关注的纸上某个位置的符号和此人当前思维的状态。
为了模拟人的这种运算过程,图灵构造出一台假想的机器,该机器由以下几个部分组成:
- 一条无限长的纸带 TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号 表示空白。纸带上的格子从左到右依此被编号为 0,1,2,... ,纸带的右端可以无限伸展。
- 一个读写头 HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
- 一套控制规则 TABLE。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态。
- 一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。参见停机问题。
注意这个机器的每一部分都是有限的,但它有一个潜在的无限长的纸带,因此这种机器只是一个理想的设备。图灵认为这样的一台机器就能模拟人类所能进行的任何计算过程。
联系与区别
图灵机是一个计算机的理论模型,本质上是状态机;冯诺依曼体系是图灵机的实现,包括运算、控制、存储、输入、输出五个部分。诺依曼体系相对之前的计算机最大的创新在于程序和数据的存储,以此实现机器内部编程。图灵机的纸带应对应诺依曼计算机体系中的存储,读写头对应输入和输出,规则(读了一个符号后下一步做什么)对应运算,纸带怎么移动对应控制。
程序=指令+数据
我对于程序=指令+数据
的理解,计算机中存储的一切都会成为二进制的数据,准确来说代码也是一串二进制的数,即机器代码。百度百科中,对于计算机程序的定义是:
计算机程序(英语:Computer program),也称为软件(英语:software),简称程序(英语:Program)是指一组指示计算机或其他具有信息处理能力装置执行动作或做出判断的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。
数据可以被定义为被程序处理的信息。当我们考虑到整个计算机系统时,有时程序和数据的区别就不是那么明显了。中央处理器有时有一组微指令控制硬件,数据可以是一个有待执行的程序(参见脚本编程语言),程序可以编写成去编写其它的程序;所有这些例子都使程序和数据的比较成为一种视角的选择。有人甚至断言程序和数据没有区别。
指令是对于数据的一系列操作方法,CPU将读取指令,来对数据进行操作,从而达到所设计程序的目的。
三种安全问题
缓冲区溢出
缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况。这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段。这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出会引起返回地址被重写。
回顾上次课的实践:seed的缓冲区溢出实践,使用一种攻击方案来利用漏洞并最终获得root权限。
-
Ubuntu 和其它一些 Linux 系统都 适用了地址空间随机化机制(ASLR)来随机变化堆栈的起始地址。这将使猜测精确的地址非常困难,猜测地址是缓冲区溢出攻击中关键的一步。在这个实验中,我们使用下面的命令关闭 ASLR
su root sysctl -w kernel.randomize_va_space=0
GCC 编译器中实现了一种”Stack Guard”的安全机制来防止缓冲区溢出。你可以关闭该保护,方法是当编译时使用-fno-stack-protector.
- 实验开始前,我们需要一个Shellcode,shellcode是登录到shell的一段代码,它必须被存入内存中,我们才能强迫程序转跳到它。
shellcode是一段用于利用软件漏洞而执行的代码,shellcode为16进制的机器码,因为经常让攻击者获得shell而得名。shellcode常常使用机器语言编写。 可在暂存器eip溢出后,塞入一段可让CPU执行的shellcode机器码,让电脑可以执行攻击者的任意指令。
-
stack.c是一个有缓冲区溢出漏洞的程序,该程序有一个缓冲区溢出漏洞。它一开始从一个叫“badfile”的文件读了一个输入, 然后将这个输入传递给了另一个bof()功能里的缓冲区。原始输入最大长度为 517 bytes,然 而 bof()的长度仅为 12 bytes。由于 strcpy()不检查边界,将发生缓冲区溢出。由于此程序有 效执行用户为 root,如果一个普通用户利用了此缓冲区溢出漏洞,他有可能获得 root shell。 应该注意到此程序是从一个叫做“badfile”的文件获得输入的,这个文件受用户控制。现在我们的目标是为“badfile”创建内容,这样当这段漏洞程序将此内容复制进它的缓冲区,便产生了一个 shell。
gcc -o stack -fno-stack-protector stack.c //这里产生了缓冲区溢出,所以需要使用-fno-stack-protector chmod 4755 stack exit
4.exploit.c代码为“badfile”创建内容,编译并运行,它将为“badfile”生成内容。然后运行漏洞程序栈,如果 你的攻击正确实现,你将得到一个 shell。
-
所以执行过程是首先利用exploit.c文件,创建badfile文件,当出现缓冲区溢出时,将badfile的内容复制进缓冲区
$ gcc -o exploit exploit.c $./exploit // 创建badfile $./stack //缓冲区溢出
5.地址随机化打开后,执行./stack将出现段错误
6.-fstack-protector-all gcc的堆栈保护打开后,执行./stack将会出现段错误
XSS攻击
- 在SEED实验环境中的PHPBB论坛程序中引入XSS安全漏洞,我们利用如下步骤来测试与利用该漏洞。
- 通过
http://www.sqllabmysqlphpbb.com
访问,首先需要运行Apache service
- 测试XSS漏洞,在phpbb论坛发布含有脚本
<script>alert('XSS');</script>
的帖子,验证该论坛程序存在XSS安全漏洞,修改如下代码,不需要密码就可以登录相应的账号。
- 显示用户的会话Cookie
将发布帖子中的脚本换为
- 窃取用户的会话Cookie
攻击者可以进一步利用XSS漏洞进行用户会话Cookie的窃取。攻击者首先架设一个服务器,该服务器将所有收到的HTPP请求显示在屏幕中,然后在论坛中发布帖子。当其他用户访问到该帖子页面时,植入脚本会在浏览器中自动执行。
SQL注入攻击
- SQL error可以查看SQL语句
- 对select语句的攻击 WHEREusername=‟\(username‟AND user_password=‟md5(\)password)‟; 这用户名'#是对用户登录的判断,由于页面不让输入=,我们输入 ted '# 就可以登陆成功
-
对update语句的攻击 以Alice登陆,目标是修改Ted的资料信息,包括他的密码。攻击成功后将可以登陆Ted的账号
- 修改ted的资料,在interests输入 1111' 会显示SQL ERROR 在interests输入 test' wher user_id = 6#
- 那么如果输入 test' wher user_id = 3# 就可以修改Alice的信息 我们就可以修改Alice的密码
- 攻击成功
针对三种攻击的防御措施
SQL攻击(SQL injection),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户浏览器的控制。
缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击行动。缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。
SQL攻击和XSS攻击都是在用户输入中,插入恶意脚本或者是SQL语句,达到控制数据库或者是恶意脚本对用户浏览器的控制。缓冲区溢出则是利用了缓冲区将数据长度与所分配的存储空间匹配,这也就为缓冲区溢出埋下了隐患。前两种的防范方式我认为还是比较好避免的,规范用户输入,规范程序设计过程中的安全问题也要全面考虑。对于缓冲区溢出的防范方式包括可以通过操作系统使得缓冲区不可执行、强制编写正确的代码、利用编译器的边界检查来实现缓冲区的保护。