• 【C语言】缓冲区溢出攻击的极简情形


    缓冲区(buffer)是计算机里的一块连续内存区域,其通常用于存储同一数据类型的多个实例,比如下述程序中的字符数组sActualPass。如果程序向缓冲区里填充数据时没有进行恰当的容量检查,就可能发生缓冲区溢出,溢出的数据覆盖在合法数据上。

    本文引用自作者编写的下述图书; 本文允许以个人学习、教学等目的引用、讲授或转载,但需要注明原作者"海洋饼干叔
    叔";本文不允许以纸质及电子出版为目的进行抄摘或改编。
    1.《Python编程基础及应用》,陈波,刘慧君,高等教育出版社。免费授课视频 Python编程基础及应用
    2.《Python编程基础及应用实验教程》, 陈波,熊心志,张全和,刘慧君,赵恒军,高等教育出版社Python编程基础及应用实验教程
    3. 《简明C及C++语言教程》,陈波,待出版书稿。免费授课视频

    恶意的攻击者可以利用缓冲区溢出漏洞来展开攻击,其中一个最简单的途径就是故意输入“超长”的数据,通过多余的数据来修改程序内的合法数据,比如密码,从而获取操作权限。

    下述程序模拟了缓冲区溢出攻击的最简单情形。字符数组sActualPass存储了真正的登录密码“secret”。程序通过scanf()读取操作者输入的密码存入字符数组sInputPass,然后再将sInputPass和sActualPass进行比较,两者一致则允许登录。

    //Project - CrackPassword
    #include 
    #include 
    
    int main(){
        char sActualPass[8] = "secret";
        char sInputPass[8] = "";
    
        while (1){
            printf("Enter your password:");
            scanf("%s",sInputPass);
            if (strcmp(sInputPass,sActualPass)==0){
                printf("Login sucessfully.\n");
                break;
            }
            else
                printf("Wrong password.\n");
        }
    
        printf("Start using the system...\n");
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    上述程序的执行结果为(第1行的12345678crack为操作者输入):

    Enter your password:12345678crack
    Wrong password.
    Enter your password:crack
    Login sucessfully.
    Start using the system...
    
    • 1
    • 2
    • 3
    • 4
    • 5

    如执行结果的第1行所示,不知道登录密码的“恶意”使用者在录入密码时故意输入了超长密码12345678crack,成功地将系统密码修改为“crack”,然后通过新密码crack成功登录了系统。

    图1展示了程序中两个字符数组sActualPass和sInputPass的内存分布。图中可见,两个字符数组的内存区域紧邻,且sInputPass位于sActualPass之前。读者可以在程序中加入下述代码,打印两个字符数组的地址来证实。

    1   printf("addr of sInputPass,sActualPass:%p,%p\n",sInputPass,sActualPass);
    
    
    • 1
    • 2

    图1 缓冲区溢出攻击示意图
    从图中可见,由于scanf()函数没有进行输入容量检查,当操作者输入超长密码时,12345678的部分填入了sInputPass,而超长的crack部分则填入了sActualPass。这事实上“破解”了程序密码,使得攻击者可以在第二次尝试中成功登录。

    为了帮助更多的年轻朋友们学好编程,作者在B站上开了两门免费的网课,一门零基础讲Python,一门零基础C和C++一起学,拿走不谢!

    简洁的C及C++
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造
    Python编程基础及应用
    由编程界擅长教书,教书界特能编程的海洋饼干叔叔打造

    如果你觉得纸质书看起来更顺手,目前Python有两本,C和C++在出版过程中。

    Python编程基础及应用

    Python编程基础及应用实验教程
    在这里插入图片描述

  • 相关阅读:
    有关异常的处理、捕获、抛出、自定义
    网络安全(4)
    元素跟随鼠标移动
    Flink架构&重要概念解析-超详理解
    青鸟新生攻略 | 先收好这篇入学防诈骗指南
    Ubuntu22.04 安装 MongoDB 7.0
    2022R2移动式压力容器充装考题及答案
    ZCMU--1415: Box of Bricks(C语言)
    GBASE 8A v953报错集锦23--多 sql 任务并发操作报错 get cluster task id fail
    ipv6笔记及总结
  • 原文地址:https://blog.csdn.net/SeaBiscuitUncle/article/details/126555120