2018-2019-2 20189221 《网络攻防技术》第十周作业
冯·诺依曼体系结构和图灵机
冯·诺依曼体系结构描述了指令和数据被存储在存储器中所存储的程序的计算机和机的工作原理,通过改变其内部状态,即,一个指令在某些数据进行操作,并修改数据。因此,系统中存在状态。
图灵机体系结构的工作原理是在磁带上操纵符号。即存在具有无限数量的槽的带,并且在任何一个时间点,图灵机都在特定的槽中。根据在该插槽读取的符号,机器可以更改符号并移动到不同的插槽。所有这些都是确定性的。
冯·诺依曼体系结构是用于构建实际计算机的架构(其实现图灵机在理论上描述的内容)。
图灵机是发明的理论概念,用于在数学上探索可计算问题的领域并获得描述这些计算的方法。
图灵构造出一台假想的机器,该机器由以下几个部分组成:
-
一条无限长的纸带TAPE。纸带被划分为一个接一个的小格子,每个格子上包含一个来自有限字母表的符号,字母表中有一个特殊的符号{displaystyle square }表示空白。纸带上的格子从左到右依次被编号为0, 1, 2, ...,纸带的右端可以无限伸展。
-
一个读写头HEAD。该读写头可以在纸带上左右移动,它能读出当前所指的格子上的符号,并能改变当前格子上的符号。
-
一套控制规则
TABLE
。它根据当前机器所处的状态以及当前读写头所指的格子上的符号来确定读写头下一步的动作,并改变状态寄存器的值,令机器进入一个新的状态,按照以下顺序告知图灵机命令:
- 1. 写入(替换)或擦除当前符号;
- 2. 移动 HEAD, 'L'向左, 'R'向右或者'N'不移动;
- 3. 保持当前状态或者转到另一状态
-
一个状态寄存器。它用来保存图灵机当前所处的状态。图灵机的所有可能状态的数目是有限的,并且有一个特殊的状态,称为停机状态。
冯·诺伊曼结构基于1945年的描述由数学家和物理学家约翰·冯·诺伊曼等人在edvac报告书的第一份草案该文件描述了具有以下组件的电子数字计算机的设计架构:
冯·诺伊曼结构在体系结构上主要特点有:
- 以运算单元为中心
- 采用存储程序原理
- 存储器是按地址访问、线性编址的空间
- 控制流由指令流产生
- 指令由操作码和地址码组成
- 数据以二进制编码
就计算能力而言,图灵机和冯·诺伊曼机器是等价的。任何一方都可以模仿另一方(IIRC,在图灵机上模拟von Neuman程序是O(n ^ 6)操作)。以lambda演算形式的函数式编程也是等价的。实际上,至少与图灵机一样强大的所有已知计算框架都是等效的:
- 图灵机
- Lambda演算(函数式编程)
- 冯诺伊曼机器
- 部分递归函数
可以使用任何这些模型计算的函数集没有区别。
函数式编程源自lambda演算,因此它不直接映射到Turing或von Nemuan机器。然而它们中的任何一个都可以通过仿真运行功能程序。我认为图灵机的映射可能比冯诺伊曼机器的映射更繁琐.
程序=指令+数据
上学期学习的深入理解计算机系统,以及本科时学习的计算机系统结构教程(第2版)对这方面有了一些了解。
我对于这种说法的理解是这是偏向于硬件思维或者说是程序执行方面的,另一种很常见的说法:程序=算法+数据结构是偏向于软件思维或者说是程序编写方面的。
所有的程序,或者说程序操作、程序语言都可以分为两类:
-
命令式
声明性编程语言描述应该执行什么计算而不是如何计算它。声明性程序省略了控制流程,并被视为指令集。两大类声明性语言是函数式语言和逻辑语言。函数式语言(如Haskell)背后的原理是不允许副作用,这使得更容易推理像数学函数这样的程序。[17]逻辑语言背后的原理(如Prolog)是定义要解决的问题 - 目标 - 并将详细的解决方案留给Prolog系统本身。[18]通过提供子目标列表来定义目标。然后通过进一步提供其子目标等的列表来定义每个子目标。如果子目标的路径未能找到解决方案,则该子目标被回溯并且系统地尝试另一路径。
-
声明式
当程序执行时:
- 在编译阶段(此时称为编译时),程序中的每条指令都由编译器转换为二进制操作码。当您运行程序时(此时称为运行时),二进制操作码将从辅助内存移动到RAM。然后cpu从RAM执行指令。
- 当数据是在编译时提供的,那时程序是用'int a = 10;'之类的指令编写的。或'MOV A,#0FFH'提供的数据10,在这种情况下,FFH将成为操作码的一部分,并将与操作码一起移动到RAM中。
- 如果程序包含'scanf(“%d”,&a);'等指令,则操作系统会在移动程序时为数据分配RAM中的内存,但等待用户输入,这是输入设备进入的位置。输入设备(通常是键盘或鼠标)用于在程序执行的运行期间获取输入。
- 输出设备用于查看结果,在运行期间,当遇到诸如'printf(“%d”,a)'之类的指令时,数据将从RAM发送到输出设备(通常是监视器)。
- 执行程序后,先前分配的内存将被释放到RAM中。
安全问题及其防范方法
SQL注入攻击
利用web应用程序数据层存在的输入验证不完善型安全漏洞实施的一类代码注入攻击技术。SQL注入攻击的原理是WEB应用程序提供的用户输入接口(如一个动态页面的输入参数、变淡的输入框等)输入一段精心构造的SQL查询命令,攻击和利用不完善的输入验证机制,是的注入代码得以执行完成非预期的攻击操作行为。
SEED SQL注入实践
运行 Apache Server:镜像已经安装,只需运行命令sudo service apache2 start
关闭对抗措施:找到/etc/php5/apache2/php.ini,找到magic_ quotes_ gpc = On这一行改为magic_quotes_ gpc = Off
phpBB2 web 应用:镜像已经安装,通过 http://www.sqllabmysqlphpbb.com 访问。
尝试密码:
密码错误:
修改登陆验证文件中的sql语句:
绕过密码登陆:
XSS攻击
XSS跨站脚本攻击的最终目标是使用web应用程序的用户。XSS攻击的根源同样是WEB应用程序对用户输入内容的安全验证与过滤不够完善。现有两种主要的XSS漏洞类型,持久性XSS漏洞和非持久性XSS漏洞。对XSS的防范措施可以分为服务器端和客户端。服务器端防范措施包括输入验证、输出净化、消除危险的输入点。
SEED XSS攻击:
发布包含<script>alert(/xss/);</script>
的帖子:
显示/xss/
帖子中包含cookie信息:
消息窗口显示cookie
缓冲区溢出
缓冲区溢出是一种最为基础的软件安全漏洞与利用技术,计算机程序中存在的一类内存安全违规类漏洞,在计算机程序向特定缓冲区内填充数据时,超出了缓冲区本身的容量,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变了程序执行流程破坏系统运行完整性。
- Linux平台上的栈溢出与Shellcode
- Linux平台栈溢出攻击技术:NSR、RNS、RS三种模式。NSR和RNS模式适用于本地缓冲区溢出和远程栈溢出攻击,而RS模式只能用于本地缓冲区溢出攻击。
- Linux平台的Shellcode实现技术:Linux本地Shellcode实现机制、Linux远程Shellcode实现机制
- Windows平台上的栈溢出与Shellcode
- Windows平台栈溢出攻击技术:Windows平台栈溢出攻击技术机理(对程序运行过程中废弃栈的处理方式差异、进程内存空间的布局差异、系统功能调用的实现方式差异)、远程栈溢出攻击示例、野外Windows栈溢出实例
- Windows平台Shellcode实现技术:Windows本地Shellcode、Windows远程Shellcode
- 堆溢出攻击
- 函数指针改写
- C++类对象虚函数表改写
- Linux下堆管理glibc库free()函数本身漏洞
SEED 缓冲区溢出:
1.输入命令“linux32”进入32位linux环境,输入“/bin/bash”使用bash(可以补全tab)。
2.使用命令sudo sysctl -w kernel.randomize_va_space=0关闭地址空间随机化功能。
3.为了进一步防范缓冲区溢出攻击及其它利用shell程序的攻击,许多shell程序在被调用时自动放弃它们的特权(能欺骗一个Set-UID程序调用一个shell,也不能在这个shell中保持root权限)。这个防护措施在/bin/bash中实现。使用以下指令将另一个shell程序(zsh)代替/bin/bash,从而重现这一防护措施被实现之前的情形。
4.攻击漏洞
5.Stack+Guard
防范方法
防范SQL注入:
- 不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双”-“进行转换等。
- 不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取
- 不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接
- 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息
- 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
防范XSS攻击:
原则:不相信用户输入的数据
- 将重要的cookie标记为http only,这样的话Javascript 中的document.cookie语句就不能获取到cookie了
- 只允许用户输入我们期望的数据。例如:年龄的textbox中,只允许用户输入数字,而数字之外的字符都过滤掉
- 对数据进行Html Encode 处理。< 转化为 <、> 转化为 >、& 转化为 &、' 转化为 '、" 转化为 "、空格 转化为
- 过滤或移除特殊的Html标签。
- 过滤JavaScript 事件的标签。例如 “onclick=”、”onfocus” 等等 (很多浏览器都加入了安全机制来过滤XSS)
防范缓冲区溢出:
-
stack guard
比较常见的一种防范缓冲区溢出攻击的措施是stack guard方法,也是gcc所支持的一种方法(对应选项为-fstack-protector)。此种方法在堆栈中插入一个探测值。若利用缓冲区溢出来改写返回地址的话,通常也会覆盖这个探测值,编译器在编译函数时,分别在函数的入口处生成探测值,出口处比较探测值,通过探测值的被改动与否来判断是否有缓冲区溢出攻击的发生。
-
stack shield
stack shield方法在程序运行时,使用数组来备份返回地址,这样即使用户通过缓冲区溢出攻击手段修改了栈帧中的返回地址,但是很难改变数组中所备份的返回地址。因此,可以通过比较数组中的返回地址和堆栈中的返回地址的不同来判断是否有缓冲区溢出攻击的发生,或者直接使用数组中保存的返回地址,来保证程序正常的控制流。
-
运行时库支持的返回地址备份
-
库中声明一个数组,在函数的入口处,调用库中的入口函数,把当前堆栈中的返回地址备份到数组中;
-
在函数的出口处,调用库中的出口函数,把当前堆栈中的返回地址和堆栈中的返回地址做比较,判断是否有缓冲区溢出攻击的发生。
参考资料
- A Turing Machine
- Von Neumann architecture
- von Neumann,John(1945),EDVAC报告初稿 (PDF), 2011年8月24日检索
- 从图灵机模型到冯诺依曼结构
- Computer program
- 深入理解计算机系统
- 计算机系统结构教程(第2版)
- 防sql注入和跨脚本攻击