微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

我认为问题可能与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]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。