预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共68页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

标题:缓冲区溢出的原理和实践(Phrack) 作者:Sinbad .oOPhrack49Oo. VolumeSeven,IssueForty-Nine File14of16 BugTraq,r00t,andUnderground.Org bringyou XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX SmashingTheStackForFunAndProfit 以娱乐和牟利为目的践踏堆栈 (缓冲区溢出的原理和实践) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 原作byAlephOne aleph1@underground.org 翻译xuzq@chinasafer.com www.chinasafer.com '践踏堆栈'[C语言编程]n.在许多C语言的实现中,有可能通过写入例程 中所声明的数组的结尾部分来破坏可执行的堆栈.所谓'践踏堆栈'使用的 代码可以造成例程的返回异常,从而跳到任意的地址.这导致了一些极为 险恶的数据相关漏洞(已人所共知).其变种包括堆栈垃圾化(trashthe stack),堆栈乱写(scribblethestack),堆栈毁坏(manglethestack); 术语mungthestack并不使用,因为这从来不是故意造成的.参阅spam? 也请参阅同名的漏洞,胡闹内核(fandangooncore),内存泄露(memory leak),优先权丢失(precedencelossage),螺纹滑扣(overrunscrew). 简介 ~~~~~~~ 在过去的几个月中,被发现和利用的缓冲区溢出漏洞呈现上升趋势.例如syslog, splitvt,sendmail8.7.5,Linux/FreeBSDmount,Xtlibrary,at等等.本文试图 解释什么是缓冲区溢出,以及如何利用. 汇编的基础知识是必需的.对虚拟内存的概念,以及使用gdb的经验是十分有益 的,但不是必需的.我们还假定使用Intelx86CPU,操作系统是Linux. 在开始之前我们给出几个基本的定义:缓冲区,简单说来是一块连续的计算机内 存区域,可以保存相同数据类型的多个实例.C程序员通常和字缓冲区数组打交道. 最常见的是字符数组.数组,与C语言中所有的变量一样,可以被声明为静态或动态 的.静态变量在程序加载时定位于数据段.动态变量在程序运行时定位于堆栈之中. 溢出,说白了就是灌满,使内容物超过顶端,边缘,或边界.我们这里只关心动态 缓冲区的溢出问题,即基于堆栈的缓冲区溢出. 进程的内存组织形式 ~~~~~~~~~~~~~~~~~~~~ 为了理解什么是堆栈缓冲区,我们必须首先理解一个进程是以什么组织形式在 内存中存在的.进程被分成三个区域:文本,数据和堆栈.我们把精力集中在堆栈 区域,但首先按照顺序简单介绍一下其他区域. 文本区域是由程序确定的,包括代码(指令)和只读数据.该区域相当于可执行 文件的文本段.这个区域通常被标记为只读,任何对其写入的操作都会导致段错误 (segmentationviolation). 数据区域包含了已初始化和未初始化的数据.静态变量储存在这个区域中.数 据区域对应可执行文件中的data-bss段.它的大小可以用系统调用brk(2)来改变. 如果bss数据的扩展或用户堆栈把可用内存消耗光了,进程就会被阻塞住,等待有了 一块更大的内存空间之后再运行.新内存加入到数据和堆栈段的中间. /------------------\内存低地址 | | |文本 | | | |------------------ | |(已初始化) | |数据 | |(未初始化) | |------------------ | | | |堆栈 | | | \------------------/内存高地址 Fig.1进程内存区域 什么是堆栈? ~~~~~~~~~~~~~ 堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来,这个特性通常称为后进先处(LIFO)队列. 堆栈中定义了一些操作.两个最重要的是PUSH和POP.PUSH操作在堆栈的顶部加入一 个元素.POP操作相反,在堆栈顶部移去一个元素,并将堆栈的大小减一. 为什么使用堆栈? ~~~~~~~~~~~~~~~~ 现代计算机被设计成能够理解人们头脑中的高级语言.在使用高级语言构造程序时 最重要的技术是过程(procedure)和函数(function).从这一点来看,一个过程调用可 以象跳转(jump)命令那样改变程序的控制流程,但是与跳转不同的是,当工作完成时, 函数把控制权返回给调用之后的语句或指令.