一.原理分析

缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件中广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。

要了解缓冲区溢出攻击,就得先了解程序函数调用的栈内存分布:

如上图所示:堆栈帧的顶部为函数的实参,下面是函数的返回地址以及前一个堆栈帧的指针,最下面是分配给函数的局部变量使用的空间。一个堆栈帧通常都有两个指针,其中一个称为堆栈帧指针,另一个称为栈顶指针。前者所指向的位置是固定的,而后者所指向的位置在函数的运行过程中可变。因此,在函数中访问实参和局部变量时都是以堆栈帧指针为基址,再加上一个偏移。对照图可知,实参的偏移为正,局部变量的偏移为负。

那么当函数的局部变量有一个为字符串时,函数调用的栈会怎么分布呢?

void fun(const char* input) {char buf[8]; }
1
2
3
4

void fun ( const char * input )
{
       char buf [ 8 ] ;
}

如上代码所示的函数调用栈为:

如图所示,操作系统在给buf分配栈空间时,看到buf的长度为8,即申请8个字节长的地址空间,然后按照倒序将buf的内容填充入栈地址中。而缓冲区溢出攻击正是利用这一机制,如果将长度大于8的一个字符串赋值给buf,那么操作系统就会倒序一直填充栈地址,导致覆盖掉了”previous frame pointer”和”return adress”,而攻击者如果让覆盖”return adress”的内容为一个有意义的地址,即攻击者想要让操作系统执行的攻击代码,那么当函数返回时就会去执行攻击代码达到了攻击者的目的。

图中灰色的区域会根据不同的机器硬件,不同的操作系统而有长度的变化。

二.实例演示

以下面代码为例:

#include <stdio.h>; void fun(const char* input) {char buf[8];printf("Addr of buf = %p", &amp;buf);strcpy(buf,input);printf("n%sn", buf); } void haha() {printf("nOK!success"); } int main(int argc, char* argv[]) {printf("Address of foo=%pn",fun);printf("Address of haha=%pn",haha);char ss[]="ABCDEFGHIGKL12ABCDEFx58x013x40x00";fun(ss);return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

#include <stdio.h>;
void fun ( const char * input )
{
       char buf [ 8 ] ;
       printf ( "Addr of buf = %p" , & amp ; buf ) ;
       strcpy ( buf , input ) ;
       printf ( "n%sn" , buf ) ;
}
void haha ( )
{
     printf ( "nOK!success" ) ;
}
int main ( int argc , char * argv [ ] )
{
         printf ( "Address of foo=%pn" , fun ) ;
         printf ( "Address of haha=%pn" , haha ) ;
         char ss [ ] = "ABCDEFGHIGKL12ABCDEFx58x013x40x00" ;
         fun ( ss ) ;
         return 0 ;
}

如上,当代码第18行的fun()函数调用结束后,应该换回19行的return 0;执行,但如果我们传入fun()的ss参数在给buf赋值时,ss的长度大于buf的长度,覆盖了栈中buf上面return adress区域,而此区域正好是fun的返回地址,如果我们知道函数haha()的入口地址,那么可以把此入口地址填入return adress处,这样当fun执行完后,就会“很神奇”的去执行haha()函数,如果haha()函数是一段恶意代码,那么就实现了所谓的缓冲区溢出攻击。

我们在windows下用codeblocks演示整个实验的过程:

1.得到haha()函数的地址,通过第16行打印我们可以得到,如下图所示,haha的地址以16进制的形式显示为00401358。

2.我们得获得fun函数执行完成后的返回地址,也就是return 0;语句的地址。进入调试模式,通过查看编译后的汇编语言,可以看到ret语句(最后一行)的返回地址为004013C7。

3.查看fun()函数buf存放地址与其返回地址之间的距离,由图中有深蓝背景的区域我们可以看到为fun的返回地址。这个地址与buf的开始地址即下图所示地址的开始(由其中内容可看到为我们赋值的“41 42 43..”,即AB…)距离为20,所以我们只需要将buf变成长度为25,从21-24字节为haha的地址即可。

4.又由于操作系统在分配内存是用了大端对齐的方式,所以每个字节应该倒叙填入即为“58 13 40 00”,程序19行可见。我们用已经写好的溢出字符串调试程序,可见如下图,返回地址已经变成了haha()的地址。

5.然后运行程序可以看到如下结果,执行了haha()中的代码输出了“OK!Success”。实验成功

二.如何防止此类攻击

C语言编译器充分信任编程人员,认为在进行strcpy()这些字符串操作时,参数长度的检查应该由编程人员完成。而如果编程人员忽略了这一点,程序就有了漏洞,攻击者就有机可趁,所以写C语言时一定要注意了。

“缓冲区溢出攻击”原理分析及实例演示相关推荐

  1. 缓冲区溢出攻击原理分析

    <缓冲区溢出攻击实践>以实践者角度介绍了初级缓冲区溢出攻击方法,本文从原理上对该方法做原理性介绍. 函数帧结构 现在高级语言C(或者C++),在函数开头的几指令要建立好函数帧结构,而函数返 ...

  2. 缓冲区溢出攻击原理、方法及防范(一)

    由于C/C++语言本身没有数组越界检查机制,当向缓冲区里写入的数据超过了为其分配的大小时,就会发生缓冲区溢出. 攻击者可以利用缓冲区溢出来窜改进程运行时栈,从而改变程序的正常流向.在分析缓冲区溢出攻击 ...

  3. 计算机缓冲器原理,缓冲区溢出攻击原理-信息安全工程师知识点

    信息安全工程师知识点:缓冲区溢出攻击原理 缓冲区是计算机内存中的一个连续块,保存了给定类型的数据.当进行大量动态内存分配而又管理不当时,就会出现问题.动态变量所需要的缓冲区,是在程序运行时才进行分配的 ...

  4. 关于缓冲区溢出攻击原理的简单例子(C语言编写)

    一.什么是缓冲区溢出? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈 ...

  5. linux缓冲区攻击实验报告,linux 下缓冲区溢出攻击原理及示例

    一.溢出目标 无论是在windows下还是在linux下,溢出攻击基本上都是以控制计算机的执行路径为目标,而x86下执行哪条指令是由eip寄存器来控制的,所以如果能够修改eip寄存器的值,就可以修改计 ...

  6. 网站管理后台被破解原理分析及实例演示

    不管是作为一名个人站长.一名 Hacker 初学者还是一名网站运维人员,在这形形色色的世界中,都充满了各种挑战,在网站的运维中我们关注的是网站的安全,如何提高网站的安全性就显得有为重要. 在本场 Ch ...

  7. 实验8 缓冲区溢出攻击实验

    实验8 缓冲区溢出攻击实验 缓冲区溢出是目前最常见的一种安全问题,操作系统以及应用程序大都存在缓冲区溢出漏洞.缓冲区是一段连续内存空间,具有固定的长度.缓冲区溢出是由编程错误引起的,当程序向缓冲区内写 ...

  8. 缓冲区溢出攻击(详细解析)

    定义:利用缓冲区溢出漏洞进行攻击行动 攻击原理 通过往程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,使程序转而执行其它指令,以达到攻击的目的.造成缓冲区溢出的原因是程序中没有仔 ...

  9. 缓冲区溢出攻击(Buffer Overflows实验笔记)

    缓冲区溢出是什么? 缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量溢出的数据在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数 ...

最新文章

  1. mem 族函数的实现
  2. HTML5 服务器发送事件(Server-Sent Events)介绍
  3. seo说_百度指数看世间沉浮_如何快速排名-互点快速排名_网站关键词排名常见问题 - 搜狗快速排名...
  4. 073_JS JSON
  5. js 异步和同步的区别
  6. URG与PSH的联系和区别
  7. java测试类生成对象,java编写student类 用Java编写一段测试程序,生成student类的两个对象,并输出每个对象基本信息?...
  8. coco2dx c++ HTTP实现
  9. python的继承与多态
  10. python3 struct.pack方法报错argument for 's' must be a bytes object
  11. oracle sap mas,MAS 移动业务整合系统
  12. Doug Lea 在 J.U.C 包里面写的 BUG 又被网友发现了......
  13. SharePoint Framework 企业向导(六)
  14. beanshell断言_Beanshell断言
  15. nginx参数keepalive_timeout
  16. 大白菜U盘启动制作 1.2 官方下载
  17. 论文常用图表一:柱状图【MATLAB】
  18. 宜搭自建费控应用如何与金蝶云星空对接打通
  19. 浙江众源自控系统有限公司亮相2022生物发酵展(济南)7月14日与您相约
  20. postMan请求结果中文乱码

热门文章

  1. 【已解决】因为计算机丢失D3DCOMPILER_47.dll 的解决方法
  2. win10怎么找工作组计算机,win10无法查看工作组的解决方法|win10系统怎么找工作组...
  3. vscode EIDE 使用手册
  4. 中关村创业大街是贵重金属垃圾场,我捡到一只产品经理
  5. BAT文件语法和技巧(bat文件的编写及使用)
  6. MAX8722 CCFL背光控制器
  7. phpcms 点赞_php+js实现点赞功能的示例详解
  8. 地缘剧本杀 (七):民意(原创小说连载,内含语音)
  9. 1079.活字印刷(Python)
  10. c语言上机考试指导,全国计算机二级C语言上机考试指导资料.doc