首页 > 其他分享 >C语言存在的问题——缓冲区溢出

C语言存在的问题——缓冲区溢出

时间:2024-08-12 13:50:34浏览次数:13  
标签:buffer dangerousString C语言 char 内存 缓冲区 MyString 溢出

缓冲区溢出(Buffer Overflow)是一种常见的安全漏洞,发生在当程序尝试向一个固定长度的缓冲区写入过多数据时。这可能会导致超出缓冲区分配的内存范围,覆盖相邻内存区域的数据,从而可能引起程序崩溃或安全漏洞。

举个例子:

 

#include <cstring>
#include <iostream>

void vulnerableFunction(char* input) {
    char buffer[10]; // 缓冲区只有10个字节
    strcpy(buffer, input); // 没有检查输入长度,直接复制
}

int main() {
    char dangerousString[12]; // 创建一个长度为12的字符串
    strcpy(dangerousString, "Hello, World!"); // 字符串长度为12,超出了缓冲区大小
    vulnerableFunction(dangerousString);
    std::cout << "Program did not crash." << std::endl;
    return 0;
}

在这个例子中,dangerousString 的长度为12个字节(包括最后的空字符 '\0'),而 buffer 只有10个字节。当 strcpy 被调用时,它将复制整个 dangerousStringbuffer,导致溢出。这将覆盖 buffer 后面的内存,可能破坏返回地址或其他重要的程序状态。

我们可以使用一个 MyString 类,用来封装 C 风格的字符串。

例如:

#include<iostream>
#include<string>

using namespace std;
// 析构函数
// 在对象被销毁时调用
// MyString 封装了C风格字符串(MyString::buffer)使用字符时无需分配内存和释放内存

class MyString{
    private:
    // 字符型的指针 
        char * buffer;
    public:
    // 构造函数
    // 常量指针
        MyString(const char *initString){
            if(initString != NULL){
                // 分配动态内存 使用new在堆上为buffer分配内存  大小为init string的长度+1
                buffer = new char[strlen(initString)+1];
                // 使用strcpy将initstring复制到新分配到内存中
                strcpy(buffer,initString);
            }
            else{
                buffer = NULL;
            }
        }
    ~MyString(){
        if (buffer!=NULL){
            delete []buffer;
        }
    }
    int GetLength(){
        return strlen(buffer);
    }
    const char * GetString(){
        return buffer;
    }
};

int main(){
    MyString sayhello("hihihiqhj");
    cout << "buffer is :" << sayhello.GetLength() << endl;
    cout << "String is :" << sayhello.GetString() << endl;

}

这个 MyString 类实现了基本的字符串封装功能,包括动态内存分配、复制、获取长度和获取字符串。析构函数确保了动态分配的内存在对象生命周期结束时被释放,避免了内存泄漏。然而,这个类还没有实现拷贝构造函数和赋值操作符,这意味着如果直接复制 MyString 对象,可能会发生浅拷贝,导致多个对象共享同一块内存,这可能会引起问题。

标签:buffer,dangerousString,C语言,char,内存,缓冲区,MyString,溢出
From: https://www.cnblogs.com/qhj384343045-/p/18354809

相关文章

  • 使用C语言构建Lua库
    Lua本身是用C语言编写的,因此使用C编写扩展可以更好地与Lua引擎集成,减少性能瓶颈,同时C语言提供了对底层硬件和操作系统功能的直接访问能力,让Lua可以通过C扩展来实现对文件系统、网络等高级功能的支持。因为C语言非常适合模块化编程,可以很容易地将复杂的Lua功能拆......
  • C语言编译和链接超详解
    文章目录1.翻译环境和运行环境2.翻译环境2.1预处理(预编译)2.2编译2.2.1词法分析2.2.2语法分析2.2.3语义分析2.3汇编2.4链接3.运行环境1.翻译环境和运行环境在ANSIC的任何一种实现中,存在两个不同的环境。第1种是翻译环境,在这个环境中源代......
  • C语言:指针
     目录指针变量和地址取地址操作符指针变量的大小指针变量类型意义指针解引⽤指针的+-整数const修饰指针const修饰变量const修饰指针变量指针的运算指针+-整数 指针的关系运算野指针指针未初始化 指针越界访问指针指向的空间被释放了避免野指针assert......
  • C语言 ——猜数字
    目录1.前言2.游戏描述2.1游戏内容2.2游戏方法3.代码实现3.1生成游戏菜单3.2构建主函数3.3构建游戏函数4.代码附上1.前言猜数字小游戏是我们大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,下面我将详细介绍该游戏的实现和编程逻辑。并用二分法......
  • C语言之旅0---(看了就有收获的优质系列博客)
    本章概览1.关键字介绍2.字符和ASCII编码3.字符串和\04.转义字符5.看图放松一下呗!!!1.关键字介绍关键字就是一些具有特殊意思的一些单词,比如:if,int,while等。这个int,各位应该都熟悉吧!(对喽,前面咱们写过–intmain()),在C语言中,有些单词被赋予特殊含义和用法,以供程序员......
  • C语言
    sizeofonarrayfunctionparameterwillreturnsizeof'char*'insteadof'char[]'注意,在C语言中,当把一个数组指针作为参数传给函数后,他会降级成为一个单纯的指针,所以charmyChars[20]Sizeof(myChars)==20但是作为参数传递之后Sizeof(myChars)==sizeof(char*)=......
  • day13(C语言)共用体
    共用体 union不同类型的成员变量共用同一块地址空间使用union格式:union共用体名{成员变量1;成员变量2;};unionhello{inta;charb;};intmain(){unionhelloh1;h1.a=20;h1.b='a';printf("a=%d\n",h1.a);//97}可用验......
  • C语言入门教程——手把手教零基础/新手入门(完整C语言学习笔记整理)
    前言    作为一名拥有多年开发经验的技术人员,我的职业生涯涵盖了多种编程语言,包括C语言、C++、C#和JavaScript等。出于对编程的热爱以及希望帮助更多初学者的目的,我决定利用业余时间整理一套全面的C语言学习指南。这套指南旨在为C语言初学者和编程爱好者提供......
  • c语言实现俄罗斯方块
    #include<stdio.h>#include<stdlib.h>#include<time.h>#include<windows.h>#include<conio.h>#defineSPACE32#defineLEFT 75#defineRIGHT77#defineDOWN80#defineESC27#defineWall2#defineBox1#defineKong0#define......
  • C语言——最强版操作符详解
    1.操作符的分类•算术操作符:+、-、*、/、%•移位操作符:<<>>•位操作符:&|^•赋值操作符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=•单⽬操作符:!、++、–、&、*、+、-、~、sizeof、(类型)•关系操作符:>、>=、<、<=、==......