整数溢出
一.定义
每个数据类型都有其能表示的范围,一旦超出这个范围,结果就会无法正确表示,也就是整数溢出。
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上。
#整数溢出#