加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

有关 C - gets 函数 的缓冲区溢出漏洞问题

发布时间:2023-11-13 10:44:38 所属栏目:安全 来源:
导读:缓冲区是在数据从一个位置传输到另一个位置时临时保存数据的内存存储区域。当数据量超过内存缓冲区的存储容量时,就会发生缓冲区溢出(或缓冲区溢出)。结果,试图将数据写入缓冲区的程序会覆盖相邻的内存位置。C语言

缓冲区是在数据从一个位置传输到另一个位置时临时保存数据的内存存储区域。当数据量超过内存缓冲区的存储容量时,就会发生缓冲区溢出(或缓冲区溢出)。结果,试图将数据写入缓冲区的程序会覆盖相邻的内存位置。

C语言中的C标准库还具有一些非常危险的操作函数,使用不当也为溢出创造条件。

什么是缓冲区溢出攻击

攻击者通过覆盖应用程序的内存来利用缓冲区溢出问题。这会改变程序的执行路径,触发损坏文件或暴露私人信息的响应。例如,攻击者可能会引入额外的代码,向应用程序发送新指令以访问 IT 系统。

哪些编程语言更容易受到攻击?

C 和 C++ 是两种极易受到缓冲区溢出攻击的语言,因为它们没有内置的保护措施来防止覆盖或访问内存中的数据。Mac OSX、Windows 和 Linux 都使用用 C 和 C++ 编写的代码。

PERL、Java、JavaScript 和 C# 等语言使用内置的安全机制来最大限度地减少缓冲区溢出的可能性。

结构化异常处理程序覆盖保护 (SEHOP)— 帮助阻止恶意代码攻击结构化异常处理 (SEH),这是一种用于管理硬件和软件异常的内置系统。因此,它可以防止攻击者利用 SEH 覆盖利用技术。在功能级别上,使用基于堆栈的缓冲区溢出来覆盖存储在线程堆栈中的异常注册记录来实现 SEH 覆盖。

代码和操作系统保护中的安全措施是不够的。当组织发现缓冲区溢出漏洞时,它必须迅速做出反应以修补受影响的软件,并确保软件用户可以访问补丁。

示例代码展示

根据STACK1_VS_2017.cpp代码进行修改;

#include <stdlib.h>

#include <stdio.h>

#include "Windows.h"

int main(int argc, char **argv) {

MessageBoxA((HWND)-0, (LPCSTR) "缓冲区溢出测试\n", (LPCSTR)"功能", (UINT)0);

int cookie;

char buf[2];

int *a = &cookie;

char * b = buf;

printf("buf: %08x cookie: %08x\n", b, a);

u_int64 p =(u_int64)a-(u_int64)b;

printf("两变量内存地址之差=%d\n",p);

gets(buf);

if (cookie == 0x41424344)

printf("缓冲区溢出成功!\n");

}

运行效果展示;

使用MessageBoxA函数检测程序是否正常运行,点击确定开始测试

使用printf()函数输出提示信息,使用gets()函数获取用户输入信息;

任意输入两个数值,不满足条件,程序运行完毕;

诱因:char buf[2]; 代码部分解析---使用char 将变量buf声明成了一个拥有2个元素数组其中元素类型为字符.buf有了两个自己长度。

隐患:使用gets()函数获取输入数据,因gets()函数无限读取数据并不检查缓冲区的大小限制,会将超出缓冲区的数据继续写入堆栈,导致存在溢出隐患。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章