c语言/c++溢出问题浅谈 <font color=red>原创</font>

 更新时间:2021年2月24日 16:16  点击:2281

在c语言或是c++中有一类很典型的问题,那就是溢出。

如果说溢出对程序有什么危害的话,好像就是在编译的时候会报错,运行的时候会崩溃。但是当有了研究安全的人之后,安全性问题就会随之出现了。

在开发的阶段,由于各种压力的迫使之下,往往开发团队都是拼命地赶工期,先把功能实现了,后期再慢慢地打补丁完善,这就容易造成很多问题没有得到充分的考虑。在众多溢出类型中,我觉得的最容易理解的应该是数组的溢出。说白了,就是在调用数组成员的时候超出下标了,这就是数组的溢出。总之,在有涉及到数据的边界问题上,就可能会发生溢出的情况。

为了避免反汇编界面太过于让人头大,所以就先写一小段代码来打印一下内存里面数据的存储情况。

这个程序运行结果是这样的。

从结果里可以看到,在内存里(指的是程序运行的虚拟内存而非物理内存),短整型变量a,b和数组c之间的距离还是很近的。
下面是产生越界的代码

在利用指针实现输出之前,有对数组c的成员赋值成666的操作,至于要给多少个c的成员赋值,这个和用户的输入n有关系。

先输入个2,看输出还是正常的

当输入3时,可以看到b的值被覆盖成了666

当输入变成5的时候,a,b都被覆盖了

要说明的一点是,现在写代码基本不用担心这个问题,因为像visual studio这样的编译器会自动检查有没有越界,我的这个程序之所以能够越界是因为我把visual studio里面有关安全检查的选项全给关了。

我这个是直接覆盖变量的值,对于程序的走向还没有什么影响。假如,精心构造一段输入,使变量指针的值被覆盖,就完全可以改变程序的走向,甚至使其指向一段恶意函数的地址,那么在使用该指针时候,就会导致恶意代码的执行,从而导致非常严重的安全问题。

除了数组溢出之外,还有整数溢出,缓冲区溢出,栈溢出,字符串溢出等等。整数溢出在Linux服务器上经常被黑客拿来进行提权。在一些存在内核溢出漏洞的Linux系统里,他们可以通过专门的提权exp来对gid和uid进行溢出,将用户id的gid和uid权限设置为0,从而获得超级管理员权限。

要解决这一类问题也很简单,就是程序一定要做溢出检查,还有就是尽量不要用像scanf(),strcpy()这样的C语言内置的函数,它们都有一个缺陷,就是不做溢出检查,很可能会导致各种各样的溢出,建议是替换成带有_s后缀的安全函数,即scanf_s(),strcpy_s()。这些都是是微软自己写的,安全性有很大提升。但缺点是,安全函数只在visual studio下能用,别的编译器识别不了。所以说,安全也是要付出代价的。

值得注意的是,漏洞的危害性也不在于漏洞本身,而是在于利用它的方法。同样的漏洞,在不同人看来利用的方式也不同,所带来的危害也程度也不尽相同。只有赶在攻击者之前,不断地发现漏洞,修补漏洞,才能最大程度上避免安全问题。

总结

本文作者:Mr Six

本文为猪先飞公众号(ID:jb51net)专栏作者投稿文章,如果你也有投稿需求,可以点击这里

更多优质文章,可以关注猪先飞公众号(ID:jb51net)查看

(微信扫码关注,获取更多内容)

[!--infotagslink--]

相关文章

  • C语言实现放烟花的程序

    这篇文章主要为大家详细介绍了C语言实现放烟花的程序,有音乐播放,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-23
  • C语言中的字符(char)详细讲解

    本篇文章主要介绍C语言中char的知识,并附有代码实例,以便大家在学习的时候更好的理解,有需要的可以看一下...2020-04-25
  • C++ STL标准库std::vector的使用详解

    vector是表示可以改变大小的数组的序列容器,本文主要介绍了C++STL标准库std::vector的使用详解,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2022-03-06
  • C++中取余运算的实现

    这篇文章主要介绍了C++中取余运算的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • 详解C++ string常用截取字符串方法

    这篇文章主要介绍了C++ string常用截取字符串方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • 详解如何将c语言文件打包成exe可执行程序

    这篇文章主要介绍了详解如何将c语言文件打包成exe可执行程序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-25
  • C++中四种加密算法之AES源代码

    本篇文章主要介绍了C++中四种加密算法之AES源代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...2020-04-25
  • C++ 整数拆分方法详解

    整数拆分,指把一个整数分解成若干个整数的和。本文重点给大家介绍C++ 整数拆分方法详解,非常不错,感兴趣的朋友一起学习吧...2020-04-25
  • C++中 Sort函数详细解析

    这篇文章主要介绍了C++中Sort函数详细解析,sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变...2022-08-18
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • C语言中free函数的使用详解

    free函数是释放之前某一次malloc函数申请的空间,而且只是释放空间,并不改变指针的值。下面我们就来详细探讨下...2020-04-25
  • C语言中计算正弦的相关函数总结

    这篇文章主要介绍了C语言中计算正弦的相关函数总结,包括正弦和双曲线正弦以及反正弦的函数,需要的朋友可以参考下...2020-04-25
  • 详解C语言中的rename()函数和remove()函数的使用方法

    这篇文章主要介绍了详解C语言中的rename()函数和remove()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下...2020-04-25
  • 详解C++ bitset用法

    这篇文章主要介绍了C++ bitset用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-04-25
  • 浅谈C++中的string 类型占几个字节

    本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节...2020-04-25
  • C语言中求和、计算平均值、方差和标准差的实例

    这篇文章主要介绍了C语言中求和、计算平均值、方差和标准差的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-10
  • C++ Eigen库计算矩阵特征值及特征向量

    这篇文章主要为大家详细介绍了C++ Eigen库计算矩阵特征值及特征向量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
  • VSCode C++多文件编译的简单使用方法

    这篇文章主要介绍了VSCode C++多文件编译的简单使用方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-29
  • C语言的基本语法详解

    本篇文章主要讲解C语言 基本语法,这里提供简单的示例和代码来详细讲解C语言的基本语法,开始学习C语言的朋友可以看一下,希望能够给你带来帮助...2021-09-18