Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2089014
  • 博文数量: 519
  • 博客积分: 10070
  • 博客等级: 上将
  • 技术积分: 3985
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-29 14:05
个人简介

只问耕耘

文章分类

全部博文(519)

文章存档

2016年(1)

2013年(5)

2011年(46)

2010年(220)

2009年(51)

2008年(39)

2007年(141)

2006年(16)

我的朋友

分类: 网络与安全

2009-11-22 15:30:51

缓冲区溢出通常是向数组中写数据时,写入的数据的长度超出了数组原始定义的大小。
比如前面你定义了int buff[10],那么只有buff[0] - buff[9]的空间是我们定义buff 时
申请的合法空间,但后来往里面写入数据时出现了buff[12]=0x10 则越界了。C 语言常用的
strcpy、sprintf、strcat 等函数都非常容易导致缓冲区溢出问题。
查阅C 语言编程的书籍时通常会告诉你程序溢出后会发生不可预料的结果。在网络安
全领域,缓冲区溢出利用的艺术在于让这个“不可预料的结果”变为我们期望的结果。
看下面这个演示程序:buf.c
/* buffer overflow example by watercloud@xfocus.org */
#include
void why_here(void) /*这个函数没有任何地方调用过*/
{
printf("why u here ?!\n");
_exit(0);
}
int main(int argc,char * argv[])
{
int buff[1];
buff[2]=(int)why_here;
return 0;
}
在命令行用VC 的命令行编译器编译(在Linux 下用gcc 编译并运行也是同样结果):
C:\Temp>cl buf.c
运行程序:
C:\Temp>buf.exe
why u here ?!
仔细分析程序和打印信息,你可以发现程序中我们没有调用过why_here 函数,但该函数却
在运行的时候被调用了!!
这里唯一的解释是buff[2]=why_here;操作导致了程序执行流程的变化。
要解释此现象需要理解一些C 语言底层(和计算机体系结构相关)及一些汇编知识,尤其是
“栈”和汇编中CALL/RET 的知识,如果这方面你尚有所欠缺的话建议参考一下相关书籍,
否则后面的内容会很难跟上。
假设你已经有了对栈的基本认识,我们来理解一下程序运行情况:
进入main 函数后的栈内容下:
[ eip ][ ebp ][ buff[0] ]
高地址<---- 低地址
以上3 个存储单元中eip 为main 函数的返回地址,buff[0]单元就是buff 申明的一个int
空间。程序中我们定义int buff[1],那么只有对buff[0]的操作才是合理的(我们只申请
了一个int 空间),而我们的buff[2]=why_here 操作超出了buff 的空间,这个操作越界了,
也就是溢出了。溢出的后果是: 对buff[2]赋值其实就是覆盖了栈中的eip 存放单元的数
据,将main 函数的返回

http://www.xfocus.net/articles/200708/941.html

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