Chinaunix首页 | 论坛 | 博客
  • 博客访问: 329532
  • 博文数量: 57
  • 博客积分: 146
  • 博客等级: 入伍新兵
  • 技术积分: 769
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-29 14:57
文章分类
文章存档

2014年(39)

2013年(13)

2012年(5)

我的朋友

分类: C/C++

2014-06-25 16:33:16

环境:32位 ubuntu

整数值可以因为
异常情况(溢出,截断或符号错误)失效,导致可利用的漏洞。
1.使用size_t表示一个对象的大小的所有整数值
size_t为无符号整数类型。
错误代码:

点击(此处)折叠或打开

  1. char *copy(size_t n, char *str) {
  2. int i;
  3. if(p == NULL) {
  4. /* Handle malloc failure */
  5. }
  6. for ( i = 0; i < n; ++i ) {
  7. p[i] = *str++;
  8. }
  9. p[i] = '\0';
  10. return p;
  11. }
  12. char *p = copy(SIZE_MAX, argv[1])
变量i为符号整型,最大值范围INT_MAX,变量n为无符号整形,最大值范围UINT_MAX。定义在limits.h头文件中,

点击(此处)折叠或打开

  1. /* Minimum and maximum values a `signed int' can hold. */
  2. # define INT_MIN (-INT_MAX - 1)
  3. # define INT_MAX 2147483647
  4. /* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
  5. # define UINT_MAX 4294967295U
若n大小等于UINT_MAX, 当变量i自加大于INT_MAX就会变为负数,则for循环不会停止,p[i]指向错误内存区域。

正确代码,变量i声明为size_t:

点击(此处)折叠或打开

  1. char *copy(size_t n, char *str) {
  2. size_t i;
  3. char *p = malloc(n);
  4. if(p == NULL) {
  5. /* Handle malloc failure */
  6. }
  7. for ( i = 0; i < n; ++i ) {
  8. p[i] = *str++;
  9. }
  10. return p;
  11. }
  12. char *p = copy(20, "hi there")

错误代码2:

点击(此处)折叠或打开

  1. #define BUFF_SIZE 10
  2. int main(int argc, char *argv[]){
  3. int size;
  4. char buf[BUFF_SIZE];
  5. size= atoi(argv[1]);
  6. if (size <= BUFF_SIZE){
  7. memcpy(buf, argv[2], size);
  8. }
  9. }
变量size为符号整型,memcpy函数原型,第三个参数为size_t无符号整形。

点击(此处)折叠或打开

  1. void *memcpy(void *dest, const void *src, size_t n)
根据ANSI C标准,当负数转换为无符号整型时,size+(UINT_MAX+1)。例如size为-2时,转换为无符号数-2+(UINT_MAX+1),等于4294967249。

正确代码:

点击(此处)折叠或打开

  1. #define BUFF_SIZE 10
  2. int main(int argc, char *argv[]){
  3. size_t size;
  4. char buf[BUFF_SIZE];
  5. size = atoi(argv[1]);
  6. if (size <= BUFF_SIZE){
  7. memcpy(buf, argv[2], size);
  8. }
  9. }

阅读(623) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~