整数溢出

一.定义

每个数据类型都有其能表示的范围,一旦超出这个范围,结果就会无法正确表示,也就是整数溢出。

32位
int    -2,147,483,648 ~2,147,483,647
uint    0 ~ 4,294,967,295
char    -128~127
uchar   0~255
short   -32,768~32,767
ushort   0~65,535
long     -2,147,483,648 ~2,147,483,647
ulong    0 ~ 4,294,967,295


64位
int    -2,147,483,648 ~2,147,483,647
uint    0 ~ 4,294,967,295
char    -128~127
uchar   0~255
short   -32,768~32,767
ushort   0~65,535
long     -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulong    0 ~ 18,446,744,073,709,551,615

二.分类

1.溢出

a.上溢出:运算后结果超过了该整数类型的最大值

b.下溢出:运算后结果小于了该整数类型的最小值

2.回绕

将结果的高位截断,只保留低位部分,然后将溢出的部分"回绕"到数据类型的最小值或最大值。如果将255加1,结果256超出了8位整数的表示范围,回绕处理会将结果截断为0,并将溢出的1回绕到最小值,结果为1。

3.截断

两个十六进制数相加或相乘超出数据类型范围,而截断高位保留低位。

三.利用

#include <stdio.h>
void vulnerable_function(int user_value) {
    int offset = 100;
    int result = user_value + offset;
    printf("Result: %d\n", result);
}
int main() {
    int user_input = -200;
    vulnerable_function(user_input);
    return 0;
}

在上面的代码中,我们将用户输入的整数值user_input 加上 offset 偏移量,并打印出结果,如果用户输入的user_input 是 -2147483548,而 offset是 100,那么结果会溢出并成为一个较大的正整数.

它本身不会导致程序错误,但是会造成栈溢出和堆溢出,整数溢出是通过一些漏洞函数去造成溢出,例如memcpy(**char *dest, const char *src**,size_n),中,size_n是指sizeof()这个的大小为n,该函数表示将第2个参数加到第1个参数,并将值赋给第1个参数,n表示这个被赋值的第一个参数的大小,如果将size_n这个参数利用错了,就可能造成整数溢出,另一个漏洞函数为strcpy(**char *dest, const char *src**)是将字符串参数src复制到dest上。

#整数溢出#
全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务