什么是一个整数溢出?
这种常见问题的答案是书面的k4thryn :
一个整数溢出,或整数包装,是一个潜在的问题,在一个程序的事实为基础的价值,可在一个有限的数字数据类型的数据类型的大小以字节为单位。 的ANSI C使用下列最低大小:
| 数据类型 | 大小(字节) |
|---|---|
| 焦炭 | 1 |
| 短的 | 2 |
| 国际 | 2 |
| 长的 | 4 |
在实践中,许多编译器使用一个4字节的诠释。 还应当指出的是,实际范围的数据类型取决于它们是否签署。 例如,签署2字节短期可能-32767和32767之间,而一个无符号短可能是介于0和65535 。 看到您的[包括] / limits.h文件进行了具体的数字为您的编译器。
为什么要你照顾? 如果您尝试将值的数据类型是太小,无法举行,该高阶位的下降,只有低阶位存储。 换句话说,就是模算术上执行之前存放的价值,以确保它符合的数据类型。 考虑我们的无符号短例如:
| 限制: | 65535或1111 1111 1111 1111 |
| 太大: | 65536或1 0000 0000 0000 0000 |
| 什么是存储: | 0或0000 0000 0000 0000 |
由于上述使得显然,这种结果是因为高阶(或最左边的)位的价值是太大的下降。 或者你可以说,什么是存储的结果
存储=值% (上限+ 1 ) 或 65536 % ( 65535 + 1 ) = 0
在签署的数据类型,其结果是有些不同,导致一些看似奇怪的行为:
| 积极的限制: | 32767或0111 1111 1111 1111 |
| 太大: | 32768或1000 0000 0000 0000 |
| 什么是存储: | -32768 |
为什么? 这是因为“ 2的恭维, ”这是如何负数代表二进制。 作出长话短说,上半年的范围( 0到0111 1111 1111 1111 )是用于积极的号码顺序至少最大。 下半年的范围内,然后用于负数的顺序至少最大 。 所以会出现负增长的签署2字节短是-32768通过-1 ,在这一秩序。
您还在问为什么这个问题,是不是? 假设内存分配的基础上签署的整数数据类型的值。 如果该值已缠,可能是太少内存将提供。 或者正在取得比较之间签署的整数值和其他一些数字,假设前应小于后者,如果该值已经飞越到否定的,比较会通过。 但是,事情的行为方式的程序员呢? 也许不能。
额外的信息来源整数溢出
虽然它已超出本文的范围,还有其他资源,进入更详细整数溢出漏洞,预防,和他们的剥削。 即,有两个非常有趣的文章Phrack # 60 ( 1的乌迪德Horovitz ,和一个由blexim )整数溢出漏洞。 整数包装问题也包括在“专业的源代码审计”介绍从2002年美国黑帽简报 (多德等作为) 。
一种工具,实验与整数溢出
该计划int_wrap.c允许你玩这种行为是具体的命令行是否数据类型(短)应签署或签署,并价值要使用。
注意:的Perl似乎有一个250位数的限制号码,以及模具的错误“号码太长” (版本5.8.0测试) 。 然而,一些重要的数字远低于这一点。
|
漏洞管理傻瓜
我们的朋友在Qualys的是提供免费的副本,电子版的漏洞管理傻瓜以技术问题解答读者。 漏洞管理傻瓜:
| |






