精华内容
下载资源
问答
  • 缓存溢出攻击实例

    2012-11-17 11:55:08
    #include ...//缓存溢出攻击 int main(int argc,char *argv[]) { int flag=0; char buffer[7]; strcpy(buffer,argv[1]); if(0==strcmp("pxhero",buffer)) { flag=1; } if(flag) { cout << "code corret

    #include <iostream>
    using namespace std;
    //缓存溢出攻击
    int main(int argc,char *argv[])
    {
    int flag=0;
    char buffer[7];
    strcpy(buffer,argv[1]);
    if(0==strcmp("pxhero",buffer))
    {
    flag=1;
    }
    if(flag)
    {
    cout << "code corret!" << endl;
    }
    else
    {
    cout << "code incorrect!!!" <<endl;
    }
    return 0;
    }

    *相关详细分析请稍后
    展开全文
  • 网络信息安全之缓冲溢出攻击的原理,以及防御措施
  • 缓存溢出

    2020-02-22 13:11:28
    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,...1. 缓存溢出攻击方式 1.1 破坏活动记录 函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指...

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

    1. 缓存溢出攻击方式

    1.1 破坏活动记录

    函数调用发生时,调用者会在栈中留下函数的活动记录,包含当前被调函数的参数、返回地址、前栈指针、变量缓存区等值,它们在栈中的存放顺序如图所示。
    在这里插入图片描述

    由它们在栈中的存放顺序可知,返回地址、栈指针与变量缓存区紧邻,且返回地址指向函数结束后要执行的下一条指令。栈指针指向上一个函数的活动记录,这样攻击者可以利用变量缓存区溢出来修改返回地址值和栈指针,从而改变程序的执行流。

    1.2 破坏堆数据

    程序运行时,用户用C、C++内存操作库函数如malloc、free等在堆内存空间分配存储和释放删除用户数据,对内存的使用情况如内存块的大小、它前后指向的内存块用一个链接类的数据结构予以记录管理,管理数据同样存放于堆中,且管理数据与用户数据是相邻的。这样,攻击者可以像破坏活动记录一样来溢出堆内存中分配的用户数据空间,从而破坏管理数据。因为堆内存数据中没有指针信息,所以即使破坏了管理数据也不会改变程序的执行流,但它还是会使正常的堆操作出错,导致不可预知的结果。

    1.3 更改函数指针

    指针在C、C++等程序语言中使用得非常频繁,空指针可以指向任何对象的特性使得指针的使用更加灵活,但同时也需要人们对指针的使用更加谨慎小心,特别是空的函数指针,它可以使程序执行转移到任何地方。攻击者充分利用了指针的这些特性,千方百计地溢出与指针相邻的变量、缓存区,从而修改函数指针指向达到转移程序执行流的目的。

    1.4 溢出固定缓存区

    C标准库函数中提供了一对长跳转函数setjmp/longjmp来进行程序执行流的非局部跳转,意思是在某一个检查点设置setjmp(buffer),在程序执行过程中用longjmp(buffer)使程序执行流跳到先前设置的检查点。它们跟函数指针有些相似,在给用户提供了方便性的同时也带来了安全隐患,攻击者同样只需找一个与longjmp(buffer)相邻的缓存区并使它溢出,这样就能跳转到攻击者要运行的代码空间。典型的例子有Perl5.003的缓冲区溢出漏洞,攻击者首先进入用来恢复缓冲区溢出的longjmp缓冲区,然后诱导进入恢复模式,这样就使Perl的解释器跳转到攻击代码上了。

    2. 防范缓冲区溢出

    缓冲区溢出是代码中固有的漏洞,除了在开发阶段要注意编写正确的代码之外,对于用户而言,一般的防范错误为

    1. 关闭端口或服务。管理员应该知道自己的系统上安装了什么,并且哪些服务正在运行
    2. 安装软件厂商的补丁,漏洞一公布,大的厂商就会及时提供补丁
    3. 在防火墙上过滤特殊的流量,无法阻止内部人员的溢出攻击
    4. 自己检查关键的服务程序,看看是否有可怕的漏洞
    5. 以所需要的最小权限运行软件
    展开全文
  • 缓存溢出攻击

    2018-05-16 19:32:53
    一直听说过缓存溢出攻击,今天查了下到底什么是缓存溢出攻击。由于汇编知识和操作系统知识的缺乏,先写下今天学习到的,以后再来补充。原因之一是缓存区越界没有检查。程序内存布局:代码区,常量数据去,静态...

    一直听说过缓存区溢出攻击,今天查了下到底什么是缓存区溢出攻击。由于汇编知识和操作系统知识的缺乏,先写下今天学习到的,以后再来补充。

    原因之一是缓存区越界没有检查。

    程序内存布局:代码区,常量数据去,静态数据区,堆栈和堆。

    展开全文
  • 实现了一个支持远程缓存溢出攻击的可视化管理平台,能够通过该平台执行特定主机、特定端口、特定任务的缓存溢出攻击测试。 该平台基于VC++的MFC编写,并且内置了针对CCProxy、WarFTP两种攻击模板与Shellcode。
  • 缓存溢出Buffer Overflow

    2018-01-22 16:38:00
    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者可以用超出常规长度的字符数来填满一个域,通常是内存区地址。在某些情况下,这些过量的字符能够作为“可执行”代码来...缓存溢出攻击从...

    缓存溢出(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 < 255; i++)   large_string[i] = 'A';

      function(large_string); }

      这段程序中就存在 Buffer Overflow 的问题. 我们可以看到, 传递给function的字符串长度要比buffer大很多,而function没有经过任何长度校验直接用strcpy将长字符串拷入buffer. 如果你执行这个程序的话,系统会报告一个 Segmentation Violation 错误.下面我们就来分析一下为什么会这样?

      首先我们看一下未执行strcpy时堆栈中的情况:     16   4   4     4 ...[buffer] [ebp] [ret地址] [large_string地址]        esp     ebp

      当执行strcpy时, 程序将256 Bytes拷入buffer中,但是buffer只能容纳16 Bytes,那么这时会发生什么情况呢? 因为C语言并不进行边界检查, 所以结果是buffer后面的250字节的内容也被覆盖掉了,这其中自然也包括ebp, ret地址 ,large_string地址.因为此时ret地址变成了0x41414141h ,所以当过程结束返回时,它将返回到0x41414141h地址处继续执行,但由于这个地址并不在程序实际使用的虚存空间范围内,所以系统会报Segmentation Violation.

      从上面的例子中不难看出,我们可以通过Buffer Overflow来改变在堆栈中存放的过程返回地址,从而改变整个程序的流程,使它转向任何我们想要它去的地方.这就为黑客们提供了可乘之机, 最常见的方法是: 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址, 这样当过程返回时,程序就转而开始执行这段我们自编的代码了. 一般来说,这段代码都是执行个Shell程序(如\bin\sh),因为这样的话,当我们入侵一个带有Buffer Overflow缺陷且具有suid-root属性的程序时,我们会获得一个具有root权限的shell,在这个shell中我们可以干任何事. 因此, 这段代码一般被称为Shell Code.

      下面我们就来看一下如何编写Shell Code.(待续) 

     


    Buffer Overflow 机理剖析(三)

     3. Shell Code 的编写   下面是一个创建Shell的C程序shellcode.c: (本文以IntelX86上的Linux为例说明)  void main() {   char *name[2];

      name[0] = "/bin/sh";   name[1] = NULL;   execve(name[0], name, NULL); }

      我们先将它编译为执行代码,然后再用gdb来分析一下.(注意编译时要用-static选项,否则execve的代码将不会放入执行代码,而是作为动态链接在运行时才链入.)  ------------------------------------------------------------------------------ [aleph1]$ gcc -o shellcode -ggdb -static shellcode.c [aleph1]$ gdb shellcode GDB is free software and you are welcome to distribute copies of it under certain conditions; type "show copying" to see the conditions. There is absolutely no warranty for GDB; type "show warranty" for  details. GDB 4.15 (i586-unknown-linux), Copyright 1995 Free Software Foundation, Inc... (gdb) disassemble main Dump of assembler code for function main: 0x8000130 <main>: pushl %ebp 0x8000131 <main+1>: movl %esp,%ebp 0x8000133 <main+3>: subl $0x8,%esp 0x8000136 <main+6>: movl $0x80027b8,0xfffffff8(%ebp) 0x800013d <main+13>: movl $0x0,0xfffffffc(%ebp) 0x8000144 <main+20>: pushl $0x0 0x8000146 <main+22>: leal 0xfffffff8(%ebp),%eax 0x8000149 <main+25>: pushl %eax 0x800014a <main+26>: movl 0xfffffff8(%ebp),%eax 0x800014d <main+29>: pushl %eax

     
    缓冲区是内存中存放数据的地方。在程序试图将数据放到计算机内存 
    中的某一位置,但没有足够空间时会发生缓冲区溢出。 
      下面对这种技术做一个详细的介绍。 
      缓冲区是程序运行时计算机内存中的一个连续的块,它保存了给定类 
    型的数据。问题随着动态分配变量而出现。为了不用太多的内存,一个有 
    动态分配变量的程序在程序运行时才决定给他们分配多少内存。 
      如果程序在动态分配缓冲区放入太多的数据会有什么现象?它溢出了, 
    漏到了别的地方。一个缓冲区溢出应用程序使用这个溢出的数据将汇编语 
    言代码放到计算机的内存中,通常是产生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语言中,静态变量是分配在数据段中的,动态变量是分配在堆栈 
    段的。缓冲区溢出是利用堆栈段的溢出的。
    展开全文
  • 通过缓存溢出进行的攻击占所有系统攻击总数的80%以上,最近各大网站所遭受的所谓分布式服务拒绝(ddos)式的攻击也是一种利用缓存溢出原理的攻击方式。
  • 缓存溢出攻击原理

    千次阅读 2014-04-15 07:47:43
    缓冲区溢出攻击是一种常见的攻击其攻击原理和相关知识见: http://blog.programfan.com/article.asp?id=30692  下面是小型的攻击演示程序,程序源代码如下: #include #include #include void callCmd(){ ...
  • 缓存溢出攻击实验(1)

    千次阅读 2016-03-24 01:00:00
    缓存溢出攻击实验(1)本实验预计分 3 个小实验来做,本文是第一个实验。
  • 缓存溢出攻击实验(3)

    千次阅读 2016-03-28 01:26:54
    缓存溢出攻击实验(3)本实验预计分 3 个小实验来做,本文是第三个实验。
  • 缓存溢出攻击实验(2)

    千次阅读 2016-03-24 01:02:30
    缓存溢出攻击实验(2)本实验预计分 3 个小实验来做,本文是第二个实验。
  • CCProxy缓存溢出攻击代码

    千次阅读 2013-03-19 21:27:43
    针对CCProxy6.2的一个缓存溢出漏洞(telnet到CCProxy服务器,当执行ping命令主机名输入超过1012字节时),实现Shellcode的代码注入。   #include #include #include #pragma comment (lib,"ws2_32") ...
  • 2016年4月19日作业五:缓存溢出实验实验一 题目: 利用lab.c代码完成作业,当然你也可以使用自己写其他的代码完成。程序要求使用Set-UID获取root权限,在程序中存储了两个数值,SECRET1和SECRET2;这两个值,...
  • 缓存溢出问题简述

    2014-07-17 11:17:00
    缓存溢出(Buffer overflow),是指在存在缓存溢出安全漏洞的计算机中,攻击者能够用超出常规长度的字符来填满一个域,一般是内存区地址。这篇文章就是解说简单的缓存溢出问题。文章以x86_32 和 linux 系统平台为蓝本...
  • warftp缓存溢出攻击C代码

    千次阅读 2013-03-19 21:31:43
    针对war-ftp 1.65,当用户在执行登录时,若其用户名输入长度大于485,则会发生溢出错误,下面给出一段示例代码: #include #include #pragma comment(lib,"ws2_32") #define JUMPESP "\x12\x45\xfa\x7...
  • 这个实验主要是熟悉栈,和了解数据缓存溢出的问题。 数据缓存溢出:程序每次调用函数时,会把当前的eip指针保存在栈里面,作为被调用函数返回时的程序指针。在被调用程序里面,栈是向下增长的。所有局部变量都...
  • 这里根据实验讲义添加了两句话,这两句话决定了我们的程序从哪里开始取shellcode的代码来执行,所以这两句话是缓存溢出攻击的关键。 因为没有设置 stack.c 程序读 badfile 文件的多少,所以在往后读的时候,读...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 175
精华内容 70
关键字:

缓存溢出攻击