缓冲区缓冲区溢出教程

缓冲区溢出教程  时间:2021-02-19  阅读:()

版权所有IBM公司2009商标LoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题第1页,共8LoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题RamondeCarvalhoValle软件工程师IBM2009年2月09日了解运行在基于Power/CellBroadbandEngineArchitecture处理器的服务器中的Linux缓冲区溢出漏洞.
当进程尝试将数据储存到固定长度的缓冲区的范围之外时,将出现缓冲区溢出.

当出现这种情况时,可能会导致出现各种异常的系统行为,并且某些行为可能会对系统安全性造成威胁.
本系列文章的第1部分将简要介绍缓冲区溢出及Power和Cell/B.
E.
架构,然后说明如何更改目标系统中的进程执行流程以及如何在32位和64位模式中重写局部变量(第2部分将介绍如何在32位和64位模式中重写函数指针并阐述如何通过shell、网络和套接字代码样例组装组件).
在本文中,运行在基于Power/CellBroadbandEngineArchitecture处理器的服务器上的Linux中的所有缓冲区溢出漏洞示例都是在运行RedHatEnterpriseLinux4Update7的IBMBladeCenterJS22Express服务器、IBMBladeCenterQS21服务器和SonyPlaystation3中开发和执行的.
回顾缓冲区溢出问题现在让我们快速回顾一下缓冲区溢出问题.
当进程尝试将数据储存到固定长度的缓冲区的范围之外时,就会出现缓冲区溢出.
结果导致额外的数据重写邻近的内存位置.
重写的数据可以包括其他缓冲区、变量、程序流数据等.
重写此数据会导致出现诸如异常程序行为、内存访问异常、由各种崩溃引起的程序终止、错误的返回结果或者最严重的系统完整性问题:安全性违背.

缓冲区溢出导致许多软件出现漏洞,并因此为恶意开发提供了可乘之机.
C/C++系统特别容易出现溢出问题,这类系统没有提供内置保护来停止对某块内存数据的访问或重写,而且也不自动检查写到内置缓冲区数组中的数据是否位于该数组的边界范围内.
这就是为什么您应当始终支持执行边界检查的系统(检查可由您或者编译器和运行时执行)的原因.
要了解关于缓冲区溢出及如何避免缓冲区溢出的更多信息,请阅读developerWorks文章"安全编程:防止缓冲区溢出--防止如今最常见的程序缺陷".
PowerArchitecture在20世纪90年代初,IBM开始开发POWER(PerformanceOptimizationWithEnhancedRISC)Architecture,并引入到RISCSystem/6000产品系列中.
1991年,Apple、IBM和Motorola(称为AIM联盟)开始协作开发PowerPCArchitecture,扩展该架构的适用性.
1997developerWorksibm.
com/developerWorks/cn/LoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题第2页,共8年,Motorola和IBM启动了另一项协作,旨在针对嵌入式系统优化PowerPC.
2004年年底,Power.
org联盟启动,该联盟的目标是开发社区规范并为开发工具提供支持,这些开发工具有助于实现以PowerArchitecture为中心的集成及增强实现.
PowerArchitecture是PowerArchitectureAdvisoryCouncil所维护的PowerInstructionSetArchitecture(PowerISA)定义的开放架构,这将提供实现之间的兼容性并且让任何人都可以设计、创建与PowerArchitecture兼容的处理器.
Xbox360处理器和CellBroadbandEngine处理器都是优秀的示例.
遵循PowerArchitecture的处理器实现有四类基本指令:分支指令使用定点寄存器的定点指令和其他指令浮点指令和十进制浮点指令矢量指令定点指令作用于字节、半字、字和双字操作数.
浮点指令作用于单精度和双精度浮点操作数.

矢量指令作用于标量的矢量及标量,其中标量范围为字节、半字、字和四字.
处理器使用长度为四个字节并且字与字对齐的指令.
它规定在存储设备与一组32位通用寄存器(GeneralPurposeRegister,GPR)之间存取和储存的字节、半字、字和双字操作数.
它规定在存储设备与一组32位浮点寄存器(Floating-PointRegister,FPR)之间存取和储存的字和双字操作数.
它还规定在存储设备与一组32位矢量寄存器(VectorRegister,VR)之间存取和储存的字节、半字、字和四字操作数.
条件寄存器(ConditionRegister,CR)是反映特定操作结果并提供测试(及分支)机制的32位寄存器.
链接寄存器(LinkRegister,LR)是64位寄存器.
它可用于为BranchConditionaltoLinkRegister指令提供分支目标地址,并且它将保存Branch指令后面的返回地址.
计数寄存器(CountRegister,CTR)是64位寄存器.
它可用于保存可以在执行Branch指令期间递减的循环计数.
机器状态寄存器(MachineStateRegister,MSR)是64位寄存器.
此寄存器将定义处理器的状态.
第64位将定义处理器是32位模式还是64位模式(0或1).
处理器将提供两种执行模式:64位和32位模式.
在两种模式下,设定64位寄存器的指令将影响所有64位.
计算模式将控制有效地址的解析方法、状态位的设置方法、Branch指令设置链接寄存器的方法,以及BranchConditional指令测试计数寄存器的方法.
几乎所有指令都可用于两种模式.
在两种模式下,有效地址计算将使用所有64位相关寄存器(GPR、LR、CTR等)并生成64位结果.
但是,在32位模式下,为了解决存储寻址问题,将忽略高阶32位有效地址.
所有指令的长度都是四个字节并且字和字之间对齐.
因此,只要将指令地址提供给处理器(如Branch指令),就会忽略低阶的两位.
同样,只要处理器利用指令地址,低阶的两位就为零.

位0:5总是指定操作码.
许多指令还有扩展操作码.
指令的其他位包含其他指令格式的一个或多个字段.
在程序执行StorageAccess或Branch指令或者在存取下一条顺序指令时,它将使用处理器计算出的有效地址引用存储设备.
存储设备中的字节是从0开始依次编号的.
每个编号都是相应字节的地址.
存储器存取的字节顺序(Big-Endian或Little-Endian)是由操作系统指定的.
ibm.
com/developerWorks/cn/developerWorksLoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题第3页,共8CellBroadbandEngineArchitecture(CBEA)CellBroadbandEngine(Cell/B.
E.
)处理器是遵循CellBroadbandEngineArchitecture(CBEA)的新型微处理器系列的第一个实现.
CBEA是扩展64位PowerArchitecture的架构.
CBEA和Cell/B.
E.
处理器是Sony、Toshiba与IBM(称为STI,正式启动于2001年初)之间协作的成果.
虽然Cell/B.
E.
处理器最初针对的是具有丰富媒体的消费性电子设备(例如游戏控制台及高清电视)中的应用程序,但是该架构在设计时主要是为了显著提升处理器性能.
人们期望这些性能提升可以支持商业领域及科学领域中的各种应用程序.
Cell/B.
E.
处理器最与众不同的特性是,在所有处理器元素共享内存的情况下,其功能可以分为两类:PowerProcessorElement(PPE)和SynergisticProcessorElement(SPE).
处理器有一个PPE和八个SPE.
第一类处理器元素PPE包含64位PowerArchitecture内核.
它遵循64位PowerArchitecture并且可以运行32位和64位操作系统及应用程序.
第二类处理器元素SPE最适于运行计算密集型SIMD应用程序;它不适合运行操作系统.
SPE是独立的处理器元素,每个SPE都运行自己的独立应用程序或线程.
每个SPE都可以完全访问连续的共享内存,包括内存映射的I/O空间.
PPE与SPE之间有相互依赖关系.
SPE依赖于PPE才可以运行操作系统,并且在许多情况下,还可以运行应用程序的顶层线程控制.
PPE需要依赖SPE来提供主要的应用程序性能.
SPE与PPE之间最显著的差别在于访问内存的方法.
PPE用载入和存储指令访问主存储器(有效地址空间),可以在主存储器与内容可以缓存的私有寄存器文件之间移动数据.

SPE用直接内存访问(DMA)命令访问主存储器,可以在主存储器与称为本地库或本地存储(LS)的私有本地内存之间移动数据和指令.
SPE的存取指令及载入和存储指令将访问其私有LS,而不访问共享主存储器;LS没有关联缓存.
这种三级存储结构(寄存器文件、LS、主存储器)以及在LS与主存储器之间使用的异步DMA传输,与传统的架构和编程模型截然不同,因为它将在传输数据和指令(提供计算并存储主存储器计算结果)的同时执行计算.
控制缓冲区溢出现在我们将查看以下内容:更改进程执行流程在32位模式下重写局部变量在64位模式下重写局部变量(并且在第2部分中,我们将介绍如何在32位和64位模式下重写函数指针并提供一些示例代码).
更改进程执行流程类似于x86/x86_64架构,可以通过以下操作更改Power/CBEA中给定进程的执行流程:developerWorksibm.
com/developerWorks/cn/LoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题第4页,共8重写靠近缓冲区(保存给定进的虚拟地址空间)的局部变量以更改应用程序的行为.

重写栈框架中经过保存的返回指令指针.
从调用函数处返回指针后,将在指定的返回指令指针处恢复执行.
重写随后执行的函数指针或异常处理程序.
在32位模式下重写局部变量本节将讨论如何通过重写局部变量更改给定进程的执行流程.
以下示例容易出现基于堆的缓冲区溢出:清单1.
example1.
c(容易出现基于堆的缓冲区溢出)#include#include#includestructmystruct{unsignedcharbuffer[16];unsignedlongcookie;};intmain(intargc,char**argv){structmystruct*s;if((s=malloc(sizeof(structmystruct)))==NULL){perror("malloc");exit(EXIT_FAILURE);}s->cookie=0;if(argc>1)strcpy(s->buffer,argv[1]);if(s->cookie==0x42424242){printf("Congratulations!
Youwonacookie!
\n");exit(EXIT_SUCCESS);}printf("Helloworld!
\n");exit(EXIT_SUCCESS);}在使用strcpy函数将用户提供的数据复制到先前分配的structmystruct的buffer成员中时,清单1不验证用户提供的数据,造成堆中缓冲区溢出.
正常执行该示例将把"Helloworld!
"字符串写到stdout中.
清单2.
编译并执行清单1$gcc-Wall-oexample1example1.
c$.
/example1Helloworld!
$图1表示堆分段中的structmystruct及其成员.
ibm.
com/developerWorks/cn/developerWorksLoP/Cell/B.
E.
:缓冲区溢出漏洞,第1部分:理解基于LinuxonPower的系统缓冲区溢出问题第5页,共8图1.
structmystructLesserGreateraddressesaddressesstructmystructbuffercookie[][]BottomofTopofheapheap通过重写structmystruct的cookie成员,可以更改进程的执行流程,structmystruct位于保存0x42424242值(ASCII字符集中的BBBB)的缓冲区之后.
清单3.
重写cookie成员$.
/example1AAAAAAAAAAAAAAAABBBBCongratulations!
Youwonacookie!
$图2表示溢出后的堆分段中的structmystruct及其成员.
图2.
溢出后的structmystructLesserGreateraddressesaddressesstructmystructbuffercookie[AAAAAAAAAAAAAAAA][BBBB]BottomofTopofheapheap在64位模式下重写局部变量现在让我们讨论一下,如何通过在64位模式下重写局部变量更改给定进程的执行流程.
在C语言中,在32位与64位模式之间只更改长型和指针数据类型.
无论是处于32位模式下还是处于64位模式下,都应当使用长型变量执行所有指针算法.
指针赋值只应在其他指针或长型变量之间执行.

.asia域名是否适合做个人网站及.asia域名注册和续费成本

今天看到群里的老秦同学在布局自己的网站项目,这个同学还是比较奇怪的,他就喜欢用这些奇怪的域名。比如前几天看到有用.in域名,个人网站他用的.me域名不奇怪,这个还是常见的。今天看到他在做的一个范文网站的域名,居然用的是 .asia 后缀。问到其理由,是有不错好记的前缀。这里简单的搜索到.ASIA域名的新注册价格是有促销的,大约35元首年左右,续费大约是80元左右,这个成本算的话,比COM域名还贵。...

Virmach($5.23/年)年付VPS闪购

每每进入第四季度,我们就可以看到各大云服务商的促销力度是一年中最大的。一来是年底的促销节日活动比较多,二来是商家希望最后一个季度冲刺业绩。这不还没有到第四季度,我们看到有些商家已经蠢蠢欲动的开始筹备活动。比如素有低价VPS收割机之称的Virmach商家居然还没有到黑色星期五就有发布黑五促销活动。Virmach 商家有十多个数据中心,价格是便宜的,但是机器稳定性和速度肯定我们也是有数的,要不这么低的...

星梦云60元夏日促销,四川100G高防4H4G10M,西南高防月付特价

星梦云怎么样?星梦云好不好,资质齐全,IDC/ISP均有,从星梦云这边租的服务器均可以备案,属于一手资源,高防机柜、大带宽、高防IP业务,一手整C IP段,四川电信,星梦云专注四川高防服务器,成都服务器,雅安服务器 。官方网站:点击访问星梦云官网活动方案:1、成都电信年中活动机(封锁UDP,不可解封):机房CPU内存硬盘带宽IP防护流量原价活动价开通方式成都电信优化线路4vCPU4G40G+50...

缓冲区溢出教程为你推荐
站长故事爱迪生的故事51自学网站推荐一个好一点的自学网站,关于网站建设的。ghostxp3GHOSTxp sp3系统有什么优点和缺点???flash导航条如何用Flash制作简单的导航栏显卡温度多少正常显卡温度多少正常不兼容WIN7 64位系统与某些软件不兼容怎么办?直播加速手机上什么软件可以帮助直播加速,大神们推荐推荐神雕侠侣礼包大全神雕侠侣手游每天送的元宝买什么合适数据库损坏数据库坏了,怎么修复?雅虎天盾有没有用用雅虎天盾的啊?
台湾虚拟主机 大庆服务器租用 阿云浏览器 美国独立服务器 创宇云 patcha 一点优惠网 建站代码 java空间 腾讯实名认证中心 跟踪路由命令 上海电信测速网站 免费网络空间 云销售系统 cpu使用率过高怎么办 linux服务器系统 nic tracert vim命令 华为云服务器宕机 更多