什么是一个整数溢出?

这种常见问题的答案是书面的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测试) 。 然而,一些重要的数字远低于这一点。

书写安全的代码 建设安全的软件 安全编码 安全编程食谱
购买这些优秀的书籍安全编程在Amazon.com


最常见的5个免费网络工具

漏洞管理傻瓜

我们的朋友在Qualys的是提供免费的副本,电子版的漏洞管理傻瓜以技术问题解答读者。

漏洞管理傻瓜:

  • 说明了迫切需要的漏洞管理
  • 详细介绍了基本最佳实践步骤,一个成功的脆弱性管理程序
  • 概述了各种漏洞管理解决方案-包括优点和缺点每个
  • 聚焦屡获殊荣的QualysGuard漏洞管理解决方案
  • 提供了一个10点的清单,消除安全漏洞从您的关键资源
书签什么是一个整数溢出?

最新的博客帖子


英文 英文 德语 德语 西班牙语 西班牙语 法文 法文 意大利语 意大利语 葡萄牙语 葡萄牙语 俄文 俄文 荷兰文 荷兰文
希腊语 希腊语 印地文 印地文 日语 日语 韩文 韩文 中文 中文 中文(简体) 中文(简体) 阿拉伯语 阿拉伯语

版权所有2009年技术常见问题解答 保留所有权利。 隐私政策。