在一段代码中找不到可能的缓冲区溢出

问题描述

我一直在写下面的代码,有人告诉我它存在缓冲区溢出的风险。

现在公认的是,我对缓冲区溢出的了解可能不如我所愿,但我认为缓冲区溢出是指正在写入的数据将不适合缓冲区的边界并且会溢出到相邻内存中位置。

我认为问题可能与fread有关,使用起来不是安全的函数,但是通读文档似乎并没有告诉我将strcpy()这样的不安全性与strncpy()。因此,我对问题可能位于何处或如何解决尚不确定。而且,如果有人对我的去向(或阅读哪本书)有任何建议,可以帮助我扩大对这一主题或其他漏洞弱点的了解,我将不胜感激。

bool readLong(FILE *f,long *n)
{
    unsigned char *ptr,tmp;

    if (fread(n,8,1,f) != 1)
        return false;

    ptr = (unsigned char *)n;
    tmp = ptr[0];
    ptr[0] = ptr[7];
    ptr[7] = tmp;
    tmp = ptr[1];
    ptr[1] = ptr[6];
    ptr[6] = tmp;
    tmp = ptr[2];
    ptr[2] = ptr[5];
    ptr[5] = tmp;
    tmp = ptr[3];
    ptr[3] = ptr[4];
    ptr[4] = tmp;

    return true;
}

解决方法

您正在尝试将8个字节fread转换为longlong 可能在您的系统上为8个字节,但这绝不能保证。如果只有4个字节长,那么您肯定在破坏周围的内存。当您将值分配给ptr[7]时也会出现这种情况。

您应该做的是fread(n,sizeof(*n),1,f)。您也可以将ptr[7]替换为ptr[sizeof(long)-1]