C/C 程序中的缓冲区下溢指的是什么
1、缓冲区下溢
本文将描述另一种缓冲区溢出情况,即缓冲区下溢。在前续专题(见第7期)中已对缓冲区上溢进行了分析。原因同样适用于缓冲区下溢,所以在本文中不再重复介绍导致缓冲区上溢的因素。说得简单点,缓冲区下溢是指填充数据溢出时,下一级缓冲区被覆盖的情况。本文将描述缓冲区下溢的危害、在源代码中显露的迹象以及如何解决这个问题。
2、 缓冲区下溢的危害
在 C/C 程序中,缓冲区下溢是一种严重的漏洞类型,可能导致程序崩溃或执行恶意代码等后果。从2018年1月到10月,共涉及494条CVE漏洞信息。部分漏洞如下:
CVE | 漏洞概述 |
---|---|
CVE-2018-1000001 | Libc Realpath 缓冲区下溢漏洞,漏洞的产生是由于 GNU C 库没有正确处理 getcwd() 系统调用返回的相对路径,其他库也很可能受此影响。在受影响的系统中,通过 SUID binary 可以获得 root 权限。 |
CVE-2018-1000637 | zutils 是一款压缩文件处理实用程序包。该程序支持压缩/解压缩、压缩文件比较和压缩文件完整性校验等功能。zcat 是其中的一个解压缩实用程序。zutils 1.8-pre2 之前版本中的 zcat 存在缓冲区溢出漏洞。攻击者可借助特制的压缩文件利用该漏洞造成拒绝服务或执行任意代码。 |
CVE-2018-5388 | strongSwan 5.6.3 之前版本在实现上存在缓冲区下溢漏洞,攻击者利用此漏洞可耗尽资源,导致拒绝服务。 |
3、示例代码
示例源于 Samate Juliet Test Suite for C/C v1.3 (https://samate.nist.gov/SARD/testsuite.php),源文件名:CWE121_Stack_Based_Buffer_Overflow__CWE193_char_alloca_cpy_01.c。
3.1 缺陷代码
在上述示例代码中,在第36行对指针 data
进行赋值,通过赋值操作可以看出指针 data
指向 dataBadBuffer
,当第41行使用 strcpy()
进行内存拷贝时,源缓冲区长度大于目的缓冲区长度从而产生溢出,溢出部分超出了 dataBadBuffer
的下边界,导致缓冲区下溢问题。
使用360代码卫士对上述示例代码进行检测,可以检出“缓冲区下溢”缺陷,显示等级为高。如图1所示:
图1:缓冲区下溢检测示例
3.2 修复代码
在上述修复代码中,Samate 给出的修复方式为:在第37行对指针 data
进行赋值,将 data
指向 dataGoodBuffer
,此时 data
的长度与 source
一致,当第42行使用 strcpy()
进行拷贝操作时,源缓冲区与目的缓冲区长度相同,从而避免了缓冲区下溢的问题。该问题也可以通过对边界进行检查等其他方法来进行避免。
使用360代码卫士对修复后的代码进行检测,可以看到已不存在“缓冲区下溢”缺陷。如图2:
图2:修复后检测结果
4 、如何避免缓冲区下溢
要避免缓冲区下溢,需要注意以下几点:
(1)尽量避免使用不安全的内存操作函数。
(2)对返回值有明确指示意义的内存操作函数,应对函数返回值进行有效判断,从而判断操作是否成功。
(3)在向缓冲区中填充数据时必须进行边界检查。
以上是C/C 程序中的缓冲区下溢指的是什么的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C#和C 的历史与演变各有特色,未来前景也不同。1.C 由BjarneStroustrup在1983年发明,旨在将面向对象编程引入C语言,其演变历程包括多次标准化,如C 11引入auto关键字和lambda表达式,C 20引入概念和协程,未来将专注于性能和系统级编程。2.C#由微软在2000年发布,结合C 和Java的优点,其演变注重简洁性和生产力,如C#2.0引入泛型,C#5.0引入异步编程,未来将专注于开发者的生产力和云计算。

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

在 Visual Studio Code(VSCode)中编写代码简单易行,只需安装 VSCode、创建项目、选择语言、创建文件、编写代码、保存并运行即可。VSCode 的优点包括跨平台、免费开源、强大功能、扩展丰富,以及轻量快速。

Golang适合快速开发和并发场景,C 适用于需要极致性能和低级控制的场景。1)Golang通过垃圾回收和并发机制提升性能,适合高并发Web服务开发。2)C 通过手动内存管理和编译器优化达到极致性能,适用于嵌入式系统开发。

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。
