版权所有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位模式下,都应当使用长型变量执行所有指针算法.
指针赋值只应在其他指针或长型变量之间执行.
vollcloud LLC首次推出6折促销,本次促销福利主要感恩与回馈广大用户对于我们的信任与支持,我们将继续稳步前行,为广大用户们提供更好的产品和服务,另外,本次促销码共限制使用30个,个人不限购,用完活动结束,同时所有vps产品支持3日内无条件退款和提供免费试用。需要了解更多产品可前往官网查看!vollcloud优惠码:VoLLcloud终生6折促销码:Y5C0V7R0YW商品名称CPU内存S...
最近主机参考拿到了一台恒创科技的美国VPS云服务器测试机器,那具体恒创科技美国云服务器性能到底怎么样呢?主机参考进行了一番VPS测评,大家可以参考一下,总体来说还是非常不错的,是值得购买的。非常适用于稳定建站业务需求。恒创科技服务器怎么样?恒创科技服务器好不好?henghost怎么样?henghost值不值得购买?SonderCloud服务器好不好?恒创科技henghost值不值得购买?恒创科技是...
VPSDime是2013年成立的国外VPS主机商,以大内存闻名业界,主营基于OpenVZ和KVM虚拟化的Linux套餐,大内存、10Gbps大带宽、大硬盘,有美国西雅图、达拉斯、新泽西、英国、荷兰机房可选。在上个月搞了一款达拉斯Linux系统VPS促销,详情查看:VPSDime夏季促销:美国达拉斯VPS/2G内存/2核/20gSSD/1T流量/$20/年,此次推出一款Windows VPS,依然是...