yin*_*uge 8 c c++ buffer overflow
在整数溢出的情况下,结果是(unsigned int) * (int)什么?unsigned还是int?什么类型确实数组索引运算符(operator[])承担char*:int,unsigned int或其他什么东西?
我正在审核以下功能,突然出现了这个问题.该功能在第17行有一个漏洞.
// Create a character array and initialize it with init[]
// repeatedly. The size of this character array is specified by
// w*h.
char *function4(unsigned int w, unsigned int h, char *init)
{
char *buf;
int i;
if (w*h > 4096)
return (NULL);
buf = (char *)malloc(4096+1);
if (!buf)
return (NULL);
for (i=0; i<h; i++)
memcpy(&buf[i*w], init, w); // line 17
buf[4096] = '\0';
return buf;
}
Run Code Online (Sandbox Code Playgroud)
考虑两者w并且h是非常大的无符号整数.第9行的乘法有机会通过验证.
现在的问题是在第17行乘int i用unsigned int w:如果结果是int,有可能的是该产品是负,导致访问位置即前buf.如果结果是unsigned int,产品将始终为正,从而导致访问后面的位置buf.
编写代码来证明这一点很难:int太大了.有没有人有这方面的想法?
是否有任何文件指明产品的类型?我已经搜索过了,但到目前为止还没有找到任何东西.
我认为就漏洞而言,无论是(unsigned int) * (int)产生unsigned int还是int无关紧要,因为在编译的目标文件中,它们只是字节.无论产品类型如何,以下代码均相同:
unsigned int x = 10;
int y = -10;
printf("%d\n", x * y); // print x * y in signed integer
printf("%u\n", x * y); // print x * y in unsigned integer
Run Code Online (Sandbox Code Playgroud)
因此,乘法返回的类型无关紧要.重要的是消费者功能是否需要int或unsigned.
这里的问题不是功能有多糟糕,或者如何改进功能以使其更好.该功能无疑具有漏洞.问题是关于函数的确切行为,基于标准中规定的行为.
回答你的问题: int 和 unsigned int 相乘的表达式的类型将是 C/C++ 中的 unsigned int 。
为了回答您隐含的问题,处理整数算术中可能溢出的一种不错的方法是使用IntSafeMicrosoft 的“”例程集:
http://blogs.msdn.com/michael_howard/archive/2006/02/02/523392.aspx
它在 SDK 中提供,并包含内联实现,因此如果您在其他平台上,您可以研究它们正在做什么。