环境:32位 ubuntu
整数值可以因为异常情况(溢出,截断或符号错误)失效,导致可利用的漏洞。
1.使用size_t表示一个对象的大小的所有整数值
size_t为无符号整数类型。
错误代码:
-
char *copy(size_t n, char *str) {
-
int i;
-
if(p == NULL) {
-
/* Handle malloc failure */
-
}
-
for ( i = 0; i < n; ++i ) {
-
p[i] = *str++;
-
}
-
p[i] = '\0';
-
return p;
-
}
-
char *p = copy(SIZE_MAX, argv[1])
变量i为符号整型,最大值范围INT_MAX,变量n为无符号整形,最大值范围UINT_MAX。定义在limits.h头文件中,
-
/* Minimum and maximum values a `signed int' can hold. */
-
# define INT_MIN (-INT_MAX - 1)
-
# define INT_MAX 2147483647
-
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
-
# define UINT_MAX 4294967295U
若n大小等于UINT_MAX, 当变量i自加大于INT_MAX就会变为负数,则for循环不会停止,p[i]指向错误内存区域。
正确代码,变量i声明为size_t:
-
char *copy(size_t n, char *str) {
-
size_t i;
-
char *p = malloc(n);
-
if(p == NULL) {
-
/* Handle malloc failure */
-
}
-
for ( i = 0; i < n; ++i ) {
-
p[i] = *str++;
-
}
-
return p;
-
}
-
char *p = copy(20, "hi there")
错误代码2:
-
#define BUFF_SIZE 10
-
int main(int argc, char *argv[]){
-
int size;
-
char buf[BUFF_SIZE];
-
size= atoi(argv[1]);
-
if (size <= BUFF_SIZE){
-
memcpy(buf, argv[2], size);
-
}
-
}
变量size为符号整型,memcpy函数原型,第三个参数为size_t无符号整形。
-
void *memcpy(void *dest, const void *src, size_t n)
根据ANSI C标准,当负数转换为无符号整型时,size+(UINT_MAX+1)。例如size为-2时,转换为无符号数-2+(UINT_MAX+1),等于4294967249。
正确代码:
-
#define BUFF_SIZE 10
-
int main(int argc, char *argv[]){
-
size_t size;
-
char buf[BUFF_SIZE];
-
size = atoi(argv[1]);
-
if (size <= BUFF_SIZE){
-
memcpy(buf, argv[2], size);
-
}
-
}
阅读(623) | 评论(0) | 转发(0) |