读csspp有感:从unsigned 谈到freeBSD的漏洞

先看代码,大家看看是否有输出

int main()
{
	unsigned a = -1;
	if (a > 1) {
		printf("a > 1");
	}
	return 0;
}
咋看起来a > 1为假,但是考虑一下 unsigned的表示范围是 0 - 2^32-1,-1会先转化为unsigned 类型(4294967295),然后再进行相应的处理,这样结果就很明了。

再看看freeBSD里头的一段代码

void *memcpy(void *dest, void *src, size_t n);
#define KSIZE 1024
char kbuf[KSIZE];

int copy_from_kernel(void *user_dest, int maxlen) {
	int len = KSIZE < maxlen ? KSIZE : maxlen;
	memcpy(user_dest, kbuf, len);
	return len;
}
我们看看参数 maxlen是int型的,当传参数时maxlen为负数时,此时len的值为KSIZE,然后memcpy把字节从缓冲区中复制到user_dest中去。这样就出错了。

修改方法,最简单的修改方法就是把参数的类型修改一下

void copy_from_kernel(void *user_dest, unsigned maxlen);

这样就好了。

你可能感兴趣的:(读csspp有感:从unsigned 谈到freeBSD的漏洞)