sha-1 c ++中的堆栈检查失败

时间:2014-05-28 11:54:43

标签: c++ sha1

我在主线程中有一个__stack_chk_fail。 我不知道为什么会这样?

Stack Flow

我从这个网站获得了代码: http://www.packetizer.com/security/sha1/
我试图使用示例添加一个函数来计算文件的摘要。

.h文件

#include <stdio.h>
#include <string>
std::string digestFile( char *filename );

.cpp文件

std::string SHA1::digestFile( char *filename )
{
    Reset();

    FILE *fp = NULL;
    if (!(fp = fopen(filename, "rb")))
    {
        printf("sha: unable to open file %s\n", filename);
        return NULL;
    }

    char c = fgetc(fp);
    while(!feof(fp))
    {
        Input(c);
        c = fgetc(fp);
    }

    fclose(fp);

    unsigned message_digest[5];
    if (!Result(message_digest))
    { printf("sha: could not compute message digest for %s\n", filename); }

    std::string hash;
    for (int i = 0; i < 5; i++)
    {
        char buffer[8];
        int count = sprintf(buffer, "%08x", message_digest[i]);
        if (count != 8)
        { printf("converting unsiged to char ERROR"); }

        hash.append(buffer);
    }

    return hash;
}

1 个答案:

答案 0 :(得分:3)

写入无效地址时会出现

__stack_chk_fail

事实证明你做到了:

    char buffer[8];
    int count = sprintf(buffer, "%08x", message_digest[i]);

C字符串以NUL终止。这意味着当sprintf写入8位数时,它会添加第9个 char'\0'。但是buffer只有8 char s的空间,所以第9个超过了缓冲区的末尾。

您需要char buffer[9]。或者使用std::stringstream的C ++方式,它不涉及任何固定大小,因此没有缓冲区溢出的风险。