在整数溢出的情况下,(unsigned int)*(int)的结果是什么?unsigned还是int?

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 iunsigned 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)

因此,乘法返回的类型无关紧要.重要的是消费者功能是否需要intunsigned.

这里的问题不是功能有多糟糕,或者如何改进功能以使其更好.该功能无疑具有漏洞.问题是关于函数的确切行为,基于标准中规定的行为.

Mic*_*urr 2

回答你的问题: int 和 unsigned int 相乘的表达式的类型将是 C/C++ 中的 unsigned int 。

为了回答您隐含的问题,处理整数算术中可能溢出的一种不错的方法是使用IntSafeMicrosoft 的“”例程集:

http://blogs.msdn.com/michael_howard/archive/2006/02/02/523392.aspx

它在 SDK 中提供,并包含内联实现,因此如果您在其他平台上,您可以研究它们正在做什么。