整数溢出

什么是整数溢出:

参考文章:http://blog.csdn.net/ioio_jy/article/details/50576353
【有完整的整数溢出原理讲解,基础】
在计算机中,整数分为无符号整数以及有符号整数两种。其中有符号整数会在最高位用0表示正数,用1表示负数,而无符号整数则没有这种限制。另外,我们常见的整数类型有8位(单字节字符、布尔类型)、16位(短整型)、32位(长整型)等。关于整数溢出,其实它与其它类型的溢出一样,都是将数据放入了比它本身小的存储空间中,从而出现了溢出。这里可以举一个简单的例子:

    #include <stdio.h>    
    int main()    
    {    
        int InputTest;                    
        unsigned short OutputTest;        

        printf("InputTest:");    
        scanf("%d", &InputTest);    
        OutputTest = InputTest;    

        printf("OutputTest:%d\n", OutputTest);    

        getchar();    
        return 0;    
    }    
  • 上述程序的功能其实就是将用户输入的int型变量赋值给无符号短整型的变量,然后再将后者打印出来。我们知道,无符号的16位整数可以表示0~216-1,也就是0~65535这么多的数值。同理,32位无符号整数可以表示的范围是0~232-1,也就是0~4294967295这么多的数值。
  • 当我们的输入不超过65535的时候,程序是可以得到正确的显示的。而超过了这个值,那么输出结果就不正确了,也就是出现了整数溢出的情况。

一般来说,主要有3类整数操作可以导致安全性漏洞:

  1. 无符号整数的下溢和上溢
    无符号整数的下溢问题是由于无符号整数不能识别负数所导致的
    【在计算机中,正数是直接用原码表示的,如单字节的1,在计算机中就表示为0000 0001。负数用补码表示,如单字节-1,在计算机中表示为1111 1111。这个是怎么计算的呢。首先因为是负数,所以最高位是1,那么可以表示为1000 0001,然后求反,变成1111 1110,再加上1,从而变成了1111 1111。也就是说,负数的反码加上1就是补码。】
  2. 符号问题
    符号的问题有以下三点是需要注意的。
    (1)有符号整数之间的比较。
    (2)有符号整数的运算。
    (3)无符号整数和有符号整数的对比。

  3. 截断问题
    截断问题主要发生在高位数的整数(如32位)复制到低位数的整数(如16位)的时候,发生的溢出现象

Nginx

Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。其特点是占有内存少,并发能力较强,Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。

弱弱地说一声,又是一篇不太用心文,有打击才有动力吧

猜你喜欢

转载自blog.csdn.net/laon_chan/article/details/78566979