缓冲区溢出理论学习-小白踩坑

缓冲区溢出(buffer overflow),是针对程序设计缺陷,向程序输入缓冲区写入使之溢出的内容(通常是超过缓冲区能保存的最大数据量的数据),从而破坏程序运行、趁著中断之际并获取程序乃至系统的控制权。
缓冲区溢出原指当某个数据超过了处理程序限制的范围时,程序出现的异常操作。造成此现象的原因有:
• 存在缺陷的程序设计。
• 尤其是C语言,不像其他一些高级语言会自动进行数组或者指针的边界检查,增加溢出风险。
• C语言中的C标准库还具有一些非常危险的操作函数,使用不当也为溢出创造条件。
因黑客在Unix的内核发现通过缓冲区溢出可以获得系统的最高等级权限,而成为攻击手段之一。也有人发现相同的问题也会出现在Windows操作系统上,以致其成为黑客最为常用的攻击手段,蠕虫病毒利用操作系统高危漏洞进行的破坏与大规模传播均是利用此技术。比较知名的蠕虫病毒冲击波蠕虫,就基于Windows操作系统的缓冲区溢出漏洞。
例如一个用途是对SONY的掌上游戏机PSP-3000的破解,通过特殊的溢出图片,PSP可以运行非官方的程序与游戏。同样在诺基亚智能手机操作系统Symbian OS中发现漏洞用户可以突破限制运行需要DRM权限或文件系统权限等系统权限的应用程序。
缓冲区溢出攻击从理论上来讲可以用于攻击任何有相关缺陷的程序,包括对杀毒软件、防火墙等安全产品的攻击以及对银行程序的攻击。在嵌入式设备系统上也可能被利用,例如PSP、智能手机等。
在部分情况下,当一般程序(除了驱动和操作系统内核)发生此类问题时,C++运行时库通常会终止程序的执行。

原理
覆盖不能重写随机输入和在进程中执行代码的内存。
进程内存由下面三个部分组成:
代码段,在这一段代码中的数据是通过处理器中执行的汇编指令。该代码的执行是非线性的,它可以跳过代码,跳跃,在某种特定情况下调用函数。以此,我们使用EIP指针,或是指针指令。其中EIP指向的地址总是包含下一个执行代码。
数据段,变量空间和动态缓冲器。
堆栈段,这是用来给函数传递变量的和为函数变量提供空间。栈的底部位于每一页的虚拟内存的末端,同时向下运动。汇编命令PUSHL会增加栈的顶部,POPL会从栈的顶部移除项目并且把它们放到寄存器中。为了直接访问栈寄存器,在栈的顶部有栈顶指针ESP。
函数帧结构
语言C(或者C++),在函数开头的几指令要建立好函数帧结构,而函数返回时要撤消函数帧
在函数体里面最先执行的几条指令,通常称为function prologue,它完成建立函数帧的功能。
在这里插入图片描述
0x08048484 <+0> push %ebp
0x08048485 <+1> mov %esp,%ebp
0x08048487 <+3> and $0xfffffff0,%esp
0x0804848a <+6> sub $0x40,%esp
功能是:先将调用者的ebp压到栈上,然后将此时的esp作为被调用者的ebp(栈顶),然后根据函数局部变量的大小,将esp将压地址扩展,作为被调用者的esp(栈底);这样ebp和esp这对寄存器描述的栈空间就函数帧的空间。
在函数返回时,它总执行以下两条指令,通常称为function epilogue

0x080484ff <+123> leave
0x08048500 <+124> ret

它的功能是:先将当前函数的ebp赋给esp,然后再从栈中弹出(pop)调用者的ebp值到ebp寄存器,然后再从栈中弹出EIP值到pc寄存器。指令执行完后,ebp和esp就是父函数的函数帧。当buf变量发生溢出时,就会往高地址空间覆盖。先是覆盖main函数的其它局部变量(图1没有画出来),然后是父函数的ebp,再次重点是eip,最后是父函数的栈空间。

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

上面的strcpy()将直接吧str中的内容copy到buffer中。这样只要str的长度大于16,就会造成buffer的溢出,使程序运行出错。存在象strcpy这样的问题的标准函数还有strcat(),sprintf(),vsprintf(),gets(),scanf()等。
  当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。
  感谢作者海枫https://blog.csdn.net/linyt/article/details/43315429

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值