Integer Overflow
基本信息
整数溢出的核心是计算机编程中数据类型的大小限制和数据的解释。
例如,一个8位无符号整数可以表示0到255的值。如果尝试将值256存储在8位无符号整数中,由于其存储容量的限制,它会回绕到0。同样,对于16位无符号整数,它可以保存0到65,535的值,将65,535加1会将值回绕到0。
此外,一个8位有符号整数可以表示**-128到127的值。这是因为一个比特用于表示符号(正或负),剩下的7位用于表示大小。最负数表示为-128**(二进制10000000
),最正数为127(二进制01111111
)。
最大值
对于潜在的网络漏洞,了解最大支持的值非常有趣:
整数溢出是一种常见的安全漏洞,发生在对整数进行算术运算时,结果超出了该整数类型所能表示的范围。这可能导致未预期的行为,如数据损坏、程序崩溃或甚至远程代码执行。要防止整数溢出,应该在进行算术运算前检查操作数的范围,并采取适当的措施,如使用更大的数据类型或添加边界检查。 ```c #include #include
int main() { int a = INT_MAX; int b = 0; int c = 0;
b = a * 100; c = a + 1;
printf("%d\n", INT_MAX); printf("%d\n", b); printf("%d\n", c); return 0; }
有符号转无符号转换
考虑这样一种情况:从用户输入中读取一个有符号整数,然后在一个将其视为无符号整数的上下文中使用,但没有进行适当的验证:
在这个例子中,如果用户输入一个负数,由于二进制值的解释方式,它将被解释为一个大的无符号整数,可能导致意外行为。
其他示例
只使用1B来存储密码的大小,因此可能会发生溢出,并使其认为长度为4,而实际上长度为260,以绕过长度检查保护
给定一对数字,使用z3找出一个新数字,使其乘以第一个数字得到第二个数字:
只使用1B来存储密码的大小,因此可能会发生溢出,并使其认为长度为4,而实际上长度为260,以绕过长度检查保护并覆盖堆栈中的下一个局部变量,并绕过两个保护
ARM64
这在ARM64中没有改变,如您可以在这篇博客文章中看到的。
最后更新于