防范缓冲区溢出攻击的方法--备份返回地址

本文探讨了缓冲区溢出攻击的原理,以及两种常见的防御措施:stack guard和stack shield。stack guard通过堆栈中插入探测值来检测溢出,而stack shield则在运行时使用数组备份返回地址。作者还介绍了一种通过运行时库支持的返回地址备份方法,通过修改gcc源码实现,以增强程序的安全性。
摘要由CSDN通过智能技术生成

1 引言

缓冲区溢出是C/C++语言种常见的一种攻击手段,主要是利用了C/C++语言中缺少对数组边界的检查机制。典型的一段代码如下所示:

#include <stdio.h>
#include <string.h>

#define	N	256
#define n	16

void foo(char *str){
  char buf[n];

  buf[0] = 'a';
  strcpy(buf, str);
  return;
}

int main(){
  int idx;
  char str1[N];
  char str2[n];

  for(idx=0; idx<N; idx++)
    str1[idx] = 'b';
  foo(str1);
  return 0;
}


库函数strcpy负责把字符串str复制到buf中,但是因为缺乏字符串边界检查,而buf的长度为16,str的长度为256,把str的内容复制到buf中,必然会覆盖栈中某些数据,其中就有可能把函数的返回地址覆盖了。下图中是x86运行时候的栈帧结构虚线之上表示前一个栈的栈帧,虚线下面表示当前栈的栈帧。堆栈的生长方向通常是向下增长(地址减少),而堆栈中数组的增长方向是向上增长。所以当向buff中写入越界的数据时,会首先覆盖帧指针,然后覆盖返回地址。攻击者就能够通过利用此种攻击,改变程序的返回地址,把程序返回到一段恶意的代码区域,从而进行攻击活动,包括非法获得某些权限、窃取信息等。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值