缓存溢出Buffer Overflow

您所在的位置:网站首页 labview缓冲区溢出 缓存溢出Buffer Overflow

缓存溢出Buffer Overflow

2023-06-15 15:46| 来源: 网络整理| 查看: 265

缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来运行。从而使得攻击者可以不受安全措施的约束来控制被攻击的计算机。

缓存溢出(或译为缓冲溢出)为黑客最为常用的攻击手段之一,蠕虫病毒对操作系统高危漏洞的溢出高速与大规模传播均是利用此技术。 缓存溢出攻击从理论上来讲可以用于攻击任何有缺陷不完美的程序,包括对杀毒软件、防火墙等安全产品的攻击以及对银行程序的攻击。

 

下面让我们了解一下缓存溢出的原理。众说周知,c语言不进行数组的边界检查,在许多运用c语言实现的应用程序中,都假定缓冲区的大小是足够的,其容量肯定大于要拷贝的字符串的长度。然而事实并不总是这样,当程序出错或者恶意的用户故意送入一过长的字符串时,便有许多意想不到的事情发生,超过的那部分字符将会覆盖与数组相邻的其他变量的空间,使变量出现不可预料的值。如果碰巧,数组与子程序的返回地址邻近时,便有可能由于超出的一部分字符串覆盖了子程序的返回地址,而使得子程序执行完毕返回时转向了另一个无法预料的地址,使程序的执行流程发生了错误。甚至,由于应用程序访问了不在进程地址空间范围的地址,而使进程发生违例的故障。这种错误其实是编程中常犯的。

 

http://hi.baidu.com/caterqiu/item/29598d475bcbf8af61d7b922 参考这哥们汇编调试。

组成部分 一个利用缓冲区溢出而企图破坏或非法进入系统的程序通常由如下几个部分组成: 1. 准备一段可以调出一个shell的机器码形成的字符串,在下面我们将它称为shellcode。 2. 申请一个缓冲区,并将机器码填入缓冲区的低端。 3. 估算机器码在堆栈中可能的起始位置,并将这个位置写入缓冲区的高端。这个起始的位置也是我们执行这一程序时需要反复调用的一个参数。 4. 将这个缓冲区作为系统一个有缓冲区溢出错误程序的入口参数,并执行这个有错误的程序。 通过以上的分析和实例,我们可以看到缓存溢出对系统的安全带来的巨大威胁。在unix系统中,使用一类精心编写的程序,利用suid程序中存在的这种错误可以很轻易地取得系统的超级用户的权限。当服务程序在端口提供服务时,缓冲区溢出程序可以轻易地将这个服务关闭,使得系统的服务在一定的时间内瘫痪,严重的可能使系统立刻宕机,从而变成一种拒绝服务的攻击。这种错误不仅是程序员的错误,系统本身在实现的时候出现的这种错误更多。如今,缓冲区溢出的错误正源源不断地从unix、windows、路由器、网关以及其他的网络设备中被发现,并构成了对系统安全威胁数量最大、程度较大的一类。 Buffer Overflow 机理剖析(一)

Buffer Overflow 机理剖析(一)

 

 

使用Buffer Overflow 方法来入侵目的主机是黑客们经常采用的一种手段,本文将几篇介绍其机理的文章作了一些加工整理, 对它的机理作出了由浅入深的剖析.

  本文分为下面几个部分, 朋友们可以按照自己的兴趣选择不同的章节:

  1.关于堆栈的基础知识

  2.Buffer Overflow 的原理

  3.Shell Code 的编写

  4.实际运用中遇到的问题

  5.附录 I 若干操作系统/平台上的 Shell Code

  6.附录 II 通用 Buffer Overflow 攻击程序

--------------------------------------------------------------------------------

  1. 关于堆栈的基础知识

  一个应用程序在运行时,它在内存中的映像可以分为三个部分: 代码段, 数据段和堆栈段(参见下图). 代码段对应与运行文件中的 Text Section ,其中包括运行代码和只读数据,这个段在内存中一般被标记为只读,任何企图修改这个段中数据的指令将引发一个 Segmentation Violation 错误.

  数据段对应与运行文件中的 Data Section 和 BSS Section ,其中存放的是各种数据(经过初始化的和未经初始化的)和静态变量. 

  下面我们将详细介绍一下堆栈段.  |--------| 虚存低端 |        | |  代码段   | |        | |--------| |        | |  数据段   | |        | |--------| |        | |  堆栈段   | |        | |--------| 虚存高端

  堆栈是什么?

  如果你学过这门课的话, 就会知道堆栈是一种计算机中经常用到的抽象数据类型. 作用于堆栈上的操作主要有两个: Push 和 Pop , 既压入和弹出. 堆栈的特点是LIFO(Last in , First out), 既最后压入堆栈的对象最先被弹出堆栈.

  堆栈段的作用是什么?

  现在大部分程序员都是在用高级语言进行模块化编程, 在这些应用程序中,不可避免地会出现各种函数调用, 比如调用C 运行库,Win32 API 等等. 这些调用大部分都被编译器编译为Call语句. 当CPU 在执行这条指令时, 除了将IP变为调用函数的入口点以外, 还要将调用后的返回地址放入堆栈. 这些函数调用往往还带有不同数量的入口参数和局部变量, 在这种情况下,编译器往往会生成一些指令将这些数据也存入堆栈(有些也可通过寄存器传递). 

  我们将一个函数调用在堆栈中存放的这些数据和返回地址称为一个栈帧(Stack Frame).

  栈帧的结构:

  下面我们通过一个简单的例子来分析一下栈帧的结构.  void proc(int i) {   int local;  local=i; } void main() {  proc(1); }

  这段代码经过编译器后编译为:(以PC为例) 

 

Buffer Overflow 机理剖析(二)

 2. Buffer Overflow 的机理

  我们先举一个例子说明一下什么是 Buffer Overflow :  void function(char *str) {   char buffer[16];   strcpy(buffer,str); }

void main() {   char large_string[256];   int i;

  for( i = 0; i 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3