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

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

(0)

相关推荐

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

    在c语言或是c++中有一类很典型的问题,那就是溢出. 如果说溢出对程序有什么危害的话,好像就是在编译的时候会报错,运行的时候会崩溃.但是当有了研究安全的人之后,安全性问题就会随之出现了. 在开发的阶段,由于各种压力的迫使之下,往往开发团队都是拼命地赶工期,先把功能实现了,后期再慢慢地打补丁完善,这就容易造成很多问题没有得到充分的考虑.在众多溢出类型中,我觉得的最容易理解的应该是数组的溢出.说白了,就是在调用数组成员的时候超出下标了,这就是数组的溢出.总之,在有涉及到数据的边界问题上,就可能会发生

  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套: go中的struct类型理解为类,可以定义方法,和函数定义有些许区别: struct类型是值类型. struct定义 type User struct { Name string Age int32 mess string } var user User var user1 *User = &User{} var user2 *User = new(User) struct使用 下面示例中user1和

  • 浅谈Linux C语言动态库及静态库

    假设在math目录下已编辑好add.c sub.c div.c mul.c func_point.c文件,func_point.c为包含main()的源文件! 动态库的制作: 方法一: gcc -c -fPIC add.c sub.c div.c mul.c //-c表示生成.o目标文件,-f后加一些编译选项,PIC表示与位置无关 gcc -shared -o libmymath.so add.o sub.o mul.o div.o//创建共享库mymath,添加add.o,sub.o,mul.

  • 浅谈c语言中一种典型的排列组合算法

    c语言中的全排列算法和组合数算法在实际问题中应用非常之广,但算法有许许多多,而我个人认为方法不必记太多,最好只记熟一种即可,一招鲜亦可吃遍天 全排列: #include<stdio.h> void swap(int *p1,int *p2) { int t=*p1; *p1=*p2; *p2=t; } void permutation(int a[],int index,int size) { if(index==size) { for(int i=0;i<size;i++) print

  • 浅谈C语言共用体和与结构体的区别

    共用体与结构体的区别 共用体: 使用union 关键字 共用体内存长度是内部最长的数据类型的长度. 共用体的地址和内部各成员变量的地址都是同一个地址 结构体大小: 结构体内部的成员,大小等于最后一个成员的偏移量+最后一个成员大小+末尾的填充字节数. 结构体的偏移量:某一个成员的实际地址和结构体首地址之间的距离. 结构体字节对齐:每个成员相对于结构体首地址的偏移量都得是当前成员所占内存大小的整数倍,如果不是会在成员前面加填充字节.结构体的大小是内部最宽的成员的整数倍. 共用体 #include <

  • 浅谈C语言的字符串分割

    说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,既累人又容易出错.感概技术学得不够全面啊!这里引用一段strtok用法: The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that

  • 浅谈C语言之字符串处理函数

    下面介绍8种基本的常用的字符串处理函数,在数值数组中也常常用到(部分函数).所有的C语言编译系统中一般都提供这些函数. 1.puts函数--输出字符串的函数 一般的形式为puts(字符串组) 作用:将一个字符串输出到终端.如,char一个string,并赋予初值.调用puts(string);进行字符串的输出. 2.gets函数--输入字符串的函数 一般的形式:gets(字符数组) 作用:从终端输入一个字符串到字符数组,并且得到一个函数值成为字符数组的起始地址. gets(str); 键盘输入,

  • 浅谈python和C语言混编的几种方式(推荐)

    Python这些年风头一直很盛,占据了很多领域的位置,Web.大数据.人工智能.运维均有它的身影,甚至图形界面做的也很顺,乃至full-stack这个词语刚出来的时候,似乎就是为了描述它. Python虽有GIL的问题导致多线程无法充分利用多核,但后来的multiprocess可以从多进程的角度来利用多核,甚至affinity可以绑定具体的CPU核,这个问题也算得到解决.虽基本为全栈语言,但有的时候为了效率,可能还是会去考虑和C语言混编.混编是计算机里一个不可回避的话题,涉及的东西很多,技术.架

  • 浅谈C语言转义字符和格式控制符

    转义字符参考: \a:蜂鸣,响铃 \b:回退:向后退一格 \f:换页 \n:换行,光标到下行行首 \r:回车,光标到本行行首 \t:水平制表 \v:垂直制表 \\:反斜杠 \':单引号 \":双引号 \?:问号 \ddd:三位八进制 \xhh:二位十六进制 \0:空字符(NULL),什么都不做 注: 1,\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作. 2,\n其实应该叫回车换行.换行只是换一行,不改变光标的横坐标:回车只是回到行首,不改变光标的纵坐标. 3,\t 光标向

  • 浅谈C语言函数调用参数压栈的相关问题

    参数入栈的顺序 以前在面试中被人问到这样的问题,函数调用的时候,参数入栈的顺序是从左向右,还是从右向左.参数的入栈顺序主要看调用方式,一般来说,__cdecl 和__stdcall 都是参数从右到左入栈. 看下面的代码: #include <stdio.h> int test(int a, int b) { printf("address of a %x.\n", &a); printf("address of b %x.\n", &b)

随机推荐