整数溢出

一.定义

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

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上。

#整数溢出#
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
码农索隆:想看offer细节
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
昨天 11:00
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务