escape
驱动老牛
驱动老牛
  • 注册日期2002-02-01
  • 最后登录2004-08-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2011回复:8

关于缓冲区溢出的入门文章

楼主#
更多 发布于:2002-08-14 14:53
缓冲区溢出
缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存中的某一位置,但没有足够空间时会发生缓冲区溢出。

缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有动态分配变量的程序在程序运行时才决定给他们分配多少内存。如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了,漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语言代码放到计算机的内存中,通常是产生root权限的地方。单单的缓冲区溢出,并不会产生安全问题。只有将溢出送到能够以root权限运行命令的区域才行。这样,一个缓冲区利用程序将能运行的指令放在了有root权限的内存中,从而一旦运行这些指令,就是以root权限控制了计算机。总结一下上面的描述。缓冲区溢出指的是一种系统攻击的手段,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的。据统计,通过缓冲区溢出进行的攻击占所有系统攻击总数的80%以上。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。例如下面程序:

  example0.c
  -----------------------------------------------------------
  void function(char *str) {
  char buffer[16];
  
  strcpy(buffer,str);
  }
  -----------------------------------------------------------

上面的strcpy()将直接把str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf(),以及在循环内的getc(),fgetc(),getchar()等。在C语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈段的。缓冲区溢出是利用堆栈段的溢出的。一个程序在内存中通常分为程序段,数据端和堆栈三部分。程序段里放着程序的机器码和只读数据,这个段通常是只读,对它的写操作是非法的。数据段放的是程序中的静态数据。动态数据则通过堆栈来存放。在内存中,它们的位置如下:

  
  /

最新喜欢:

yjx2003yjx200...
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-08-15 09:43
问一下,spf是什么东东?
for( i = 0; i < 255; i++)
  large_string = \'A\';
  
  
是不是large_string=\'A\';?//有一个下标

文章中:
/***********************
char buffer1[5];
  char buffer2[10];
这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20。
/****************************
  这里不明白 :(

文章中
/************************
低内存端buffer sfp ret *str高内存端
  < ------ [ ][ ][ ][ ]
  栈顶栈底

很明显,程序执行的结果是\"Segmentation fault (core dumped)\"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容\'A\'覆盖
/*********************************
在调用function时,这时候给*str分配多少个字的空间?256/2=128个?但是不管怎么说,ret怎么会被覆盖? :(
我不仅要金子,我还要点石成金的手指!
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-08-16 17:57
好冷清啊,问题贴了这么久无人问津!! :(
我不仅要金子,我还要点石成金的手指!
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-19 21:41
问一下,spf是什么东东?
for( i = 0; i < 255; i++)
  large_string = \'A\';
  
  
是不是large_string=\'A\';?//有一个下标

文章中:
/***********************
char buffer1[5];
  char buffer2[10];
这里的buffer1用了8字节(2个字,一个字4字节)。Buffer2用了12字节(3个字)。所以这里将ESP减了20。
/****************************
  这里不明白 :(

文章中
/************************
低内存端buffer sfp ret *str高内存端
  < ------ [ ][ ][ ][ ]
  栈顶栈底

很明显,程序执行的结果是\"Segmentation fault (core dumped)\"或类似的出错信息。因为从buffer开始的256个字节都将被*str的内容\'A\'覆盖
/*********************************
在调用function时,这时候给*str分配多少个字的空间?256/2=128个?但是不管怎么说,ret怎么会被覆盖? :(

你的问题太简单了,所以大家不愿意回答,我今天高兴,就随便几句:
1、sfp就是EBP,它是LINUX的汇编
2、当然有小标,是否是\'A ‘无所谓,只要不是0X0
3、8和12是为了对齐
4、比buffer大了,当然要覆盖啊
最后,以后先写写程序,再问
一剑西来,天外飞仙
Alexander
驱动大牛
驱动大牛
  • 注册日期2002-02-04
  • 最后登录2005-06-16
  • 粉丝0
  • 关注0
  • 积分-5分
  • 威望-1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-19 22:57
长知识了。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-20 09:10
楼中间的我4还不清楚
比buffer大,被覆盖,也盖不到ret啊?
此时栈的情况是下面所示吗?

内存低端AAAA...AAA sfp ret *str 内存高端?



 :P
我不仅要金子,我还要点石成金的手指!
hunterkiller
驱动牛犊
驱动牛犊
  • 注册日期2002-05-20
  • 最后登录2004-03-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-22 15:39
栈的空间是反向的,push时sp减小,调用strcpy时栈中数据地址从高到底是:
该函数返回地址1(call指令造成),局部变量和缓冲区空间,调用strcpy时push进的缓冲区地址,函数返回地址2(call造成)等参数,strcpy根据参数缓冲区地址向缓冲区里写数据,正向增长,最终覆盖返回地址1。
trent
驱动老牛
驱动老牛
  • 注册日期2002-03-01
  • 最后登录2014-09-18
  • 粉丝0
  • 关注0
  • 积分61分
  • 威望185点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-22 18:08
谢了,楼上的 :D
我不仅要金子,我还要点石成金的手指!
ooze
驱动牛犊
驱动牛犊
  • 注册日期2001-09-26
  • 最后登录2004-03-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-10-14 13:56
缓冲溢出,关键在最后,要使host被shellcoded之后还正常结束,让shellcode保存原来程序的下条指令才可以
Be a true hacker of Windows NT alike
游客

返回顶部