Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19943
  • 博文数量: 8
  • 博客积分: 547
  • 博客等级: 中士
  • 技术积分: 220
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-14 11:44
文章分类
文章存档

2012年(8)

我的朋友

分类: C/C++

2012-05-18 11:57:56

其实 overflow 有两种, 一种被称为 上溢, 一种被称为下溢,但是这两个都不符合问题中描述的 堆栈溢出(stack overflow),只是被定义为 超过了所能表示的 最大正数或者最小负数范围形成的现象被称为 上溢或下溢。 

果断简单的描述一下,堆栈溢出(stack overflow)是神马情况。 
典型的栈(stack)属于LIFO(后进先出)结构, 
众所周知在一个函数调用的时候会使用栈传递参数, 
比如 void XXnigeOO(char* szContext); 假设有这么一个函数,接受一个字符串并显示,函数体如下 

char szBuffer[16];strcpy(buffer,szContext); 

上面的strcpy()将直接把szContext中的内容copy到局部缓冲区中。这样只要参数szContext的长度大于16,就会造成szBuffer的溢出.这个就是堆栈溢出(stack overflow) 

但是 重点在这里,普通的溢出 也许没啥,但是有针对目的的溢出,是有重大安全隐患的, 

比如还是这个XXnigeOO函数调用的时候 堆栈结构如下(概述下吧) 

xxxxxxxx: 返回strcpy调用地址 
xxxxxxxx: 被复制的初始参数 (YUP!这里就是关键处了!) 
。。。。。。 
xxxxxxxx:   返回地址 
xxxxxxxx  : 初始参数入栈 

上面关键位置处的有效空间只有16个字节的位置,并且木有做任何长度校验判断,如果参数传递了超过16个字节的字符串进来,马上就发生了堆栈溢出,并且,如果传递的参数是某小坏蛋,恶意构造的,那么这个长度的溢出会一直增长到N个字节处,也就是说 可能会淹没主调函数的返回地址,于是呢 O,.O 发挥你的想象力,会导致啥后果?恩 ?不知道?那我告诉你吧,比如跳转到某小坏蛋自己申请的空间中去执行一段代码,可能是上传你的A片种子?也可能是启动一个木马控制你的摄像头打造你自己的XX门?都说不准呢,然后再正常返回,咳咳.. 这种空间劫持技术就是建立在堆栈溢出(stack overflow)的基础上,明白了吧,堆栈溢出本身并不是什么特别的东东,无非就是一个BUG,但是这个BUG引发的安全隐患,是非常大的。 
今儿就普及到这里。推荐个博客—— http://blog.chinaunix.net/uid/26972032.html _延首咏康-ChinaUnix博客

阅读(1104) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~