当前位置: 首页 > 编程笔记 >

c语言/c++溢出问题浅谈 原创

华知
2023-03-14
本文向大家介绍c语言/c++溢出问题浅谈 原创,包括了c语言/c++溢出问题浅谈 原创的使用技巧和注意事项,需要的朋友参考一下

在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)查看

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

 类似资料:
  • 本文向大家介绍浅谈C语言=与==的区别详解,包括了浅谈C语言=与==的区别详解的使用技巧和注意事项,需要的朋友参考一下 在 C 语言中,最容易产生混淆的操作符要属“=”与“==”。其中,“=”并不等于符号,而是赋值操作符,如 x=3。除此之外,还可以在一个语句中向多个变量赋同一个值,即多重赋值。例如,在下面代码中把 0 同时赋给 x、y 与 z。 相对于只有一个等号的赋值操作符,关系操作符中的等于

  • 本文向大家介绍浅谈C# winForm 窗体闪烁的问题,包括了浅谈C# winForm 窗体闪烁的问题的使用技巧和注意事项,需要的朋友参考一下 在构造函数里加上以下代码: 以上这篇浅谈C# winForm 窗体闪烁的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 本文向大家介绍浅谈C语言之字符串处理函数,包括了浅谈C语言之字符串处理函数的使用技巧和注意事项,需要的朋友参考一下 下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数)。所有的C语言编译系统中一般都提供这些函数。 1、puts函数——输出字符串的函数  一般的形式为puts(字符串组) 作用:将一个字符串输出到终端。如,char一个string,并赋予初值。调用puts(st

  • 老师们好: C 语言实现, 给定一个字符串长度不是16字节倍数时,请将字符串左边用0填充,使其长度为16字节的整倍数。 期望得到下面给出的结果

  • 我开始读一本名为《编程:c语言的原理与实践》的书。但书中的第一个程序就是这样的。现在,有两个问题。行我的编译器无法识别为有效代码(我认为您应该编写include iostream),并且在代码所在的位置,不存在使用名称空间std命名的代码;因为代码不能用短版本编写。

  • 本文向大家介绍浅谈c++ stl迭代器失效的问题,包括了浅谈c++ stl迭代器失效的问题的使用技巧和注意事项,需要的朋友参考一下 之前看《C++ Primier》的时候,也解到在顺序型窗口里insert/erase会涉及到迭代器失效的问题,并没有深究。今天写程序的时候遇到了这个问题。 1 莫名其妙的Erase 最初我的程序是酱紫的,别说话,我知道这样是有问题的,可这样是最直观的想法 没错,程序崩