一、漏洞原理

在计算机中,整数类型分为无符号整数和有符号整数 两种。

有符号整数会在最高位用0表示正数,1表示负 数,而无符号整数则没有这种规则。

常见的整数类型有8位(单字节字符类型、布尔类型)、 16位(短整型)、32位(长整型)等。

当一个整数存入了比它本身小的存储空间中,超出了 数据类型所能表示的范围时,就会发生整数溢出。

二、基础知识

整数数据类型 数据类型 :

三、实验

3.1上溢

例1:一个unsigned short类型的变量a = 65535, 当a累加5时会变成4

这是因为在计算机中,(65535)10 + (5)10 = (1111111111111111)2 + (101)2 = (10000000000000100)2,而由于unsigned short 数据类型的空间是16位,最高位的1被丢弃,因此只保 留了低16位,即(0000000000000100)2 = (4)10

例2:一个short类型的变量a = 32767,当a累加5时会 变成-32764

这是因为在计算机中,(32767)10 + (5)10 = (0111111111111111)2 + (0000000000000101)2 = (1000000000000100)2,而由于short数据类型的 最高位为符号位,0表示正数,1表示负数,因此上式运 算后超出了short类型的数据范围,造成上溢,即 (1000000000000100)2 = (-32764)10

[注]在计算机中,整数以补码形式存储,正数的补码与原 码一致,负数的补码等于原码按位取反+1 (1000000000000100)2的补码,等于反码后 (111111111111011)2,再加1,等于(-11111111111100)2 ,即(-32764)10

先看如下程序:

输出如下:

上溢:一个整数通过运算(赋值),超过了它能 表示的上限,则会变成一个很小的数。

3.2 下溢

下溢:一个整数通过运算(赋值),低于它能表 示的下限,则会变成一个很大的数。

例3,由于无符号整数不能识别负数(无符号整数类型 接收一个负数会变成一个大正数),因此一个short类 型的变量a = -4赋给unsigned short类型的变量b时 ,b = 65532

这是因为-4是负数,在计算机中以补码形式存储,-4 的补码为(-4)10 = (1111111111111100)2,而由 于unsigned short数据类型的首位不表示符号位,所 有位全部用来表示数据,因此b =  (1111111111111100)2 = (65532)10

3.3 截断

截断:将数据放入了比它本身小的存储空间中, 从而出现了溢出(短整型接收整型时只能接收低 16位)。

例4,一个int类型的变量a = 65537赋给short类型的 变量b时,b = 1

(65537)10 = (*10000000000000001)2

 

3.4 符号问题

符号问题:指符号问题引发的整数溢出漏 洞,大致有三点需要注意

a.有符号整数之间的比较

从汇编中可以看到,当两个有符号整数比较大小时 ,是将两数作差,若结果为正则显示被减数大,若 结果为负则显示减数大

当两个有符号整数作差时出现上溢或下溢时,比较 结果会与事实相反。

例如,short类型的32767与-5比较大小时,由例 1可知,在计算机中,short类型的32767-(-5) =-32764<0,从而得出32767<-5的错误结论。

b.有符号整数的运算

当两个有符号整数运算时,有可能发生上溢或者下溢。

c.无符号整数和有符号整数的比较(运算)

当无符号整数和有符号整数进行比较或运算时,会将有符号整 数转化成无符号整数之后进行比较或运算,从而导致上溢下溢 以及与事实相反的结论。

例如,short类型的-5与unsigned short类型的13比较大小 时,-5转化成无符号整数后等于65531>13,与事实相反。

3.5 实例分析

输入一个合适的数值,使得程序显示“Welcome!”

number和Number的数据类型不同,可以表 示的数据范围不同,因此,可以通过整数溢出 的方式

输入一个合适的较大的值给Number,使得在 Number给number赋值时发生截断之后, number的值较小,从而满足if条件。


发表评论

电子邮件地址不会被公开。


CAPTCHA Image
Reload Image
皖ICP备18016857号-1