Chinaunix首页 | 论坛 | 博客
  • 博客访问: 242188
  • 博文数量: 95
  • 博客积分: 400
  • 博客等级: 一等列兵
  • 技术积分: 906
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-04 16:04
个人简介

人生意义在于积累,而不是日复一日的重复

文章分类

全部博文(95)

文章存档

2016年(2)

2015年(44)

2014年(35)

2011年(5)

2010年(9)

我的朋友

分类: C/C++

2014-11-21 09:29:59

先给出一个有漏洞的二分查找,c语言实现

点击(此处)折叠或打开

  1. static int binary_search(int target, int array[], int size)
  2. {
  3.     int l = 1;
  4.     int r = size - 1;
  5.     int h = 0;
  6.     if (size <= 0)
  7.         return -1;
  8.     while(l <= r){
  9.         h = (1+r)/2;
  10.         if(target > array[h])
  11.             l = h+1;
  12.         else if(target < array[h])
  13.             l = h-1;
  14.         else
  15.             return h;
  16.     }
  17.     return -1;
  18. }
分析:
该代码最大的漏洞在于:

点击(此处)折叠或打开

  1. h = (l+r)/2;
因为h是int类型,在32位或64位机器上它所能表示的最大的数是2147483647,如果l与r的和大于这个数就会导到加法溢出,会得到一个负数,结果可能:
1.    如果数组array是在堆中分配,系统则会崩溃;
2.    如果数组array是在栈中分配,则会导到数据漏洞,黑客可以依次尝试获取有用的信息。
那么正确的表示方式应该是怎么样的叫?

点击(此处)折叠或打开

  1. h = l + ((r-1)/2);
引用:《码农增刊Linux与Linux》
阅读(425) | 评论(0) | 转发(0) |
0

上一篇:《大清相国》

下一篇:SELinux模式

给主人留下些什么吧!~~