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

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

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

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

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

//Project - CrackPassword
#include <stdio.h>
#include <string.h>

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行的12345678crack为操作者输入):

Enter your password:12345678crack
Wrong password.
Enter your password:crack
Login sucessfully.
Start using the system...

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

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

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

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

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

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

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

Python编程基础及应用

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值