使用 crypt() 在 for 循环中意外覆盖变量

Variable is unexpectedly overwritten in for loop with crypt()

我正在尝试构建一个 C 程序,该程序将暴力破解参数中给定的哈希值。这是代码:

#include <unistd.h>
#include <stdio.h>
#include <crypt.h>
#include <string.h>

const char setting[] = "$QSX8hjVa$";
const char values[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

int main(int argc, char *argv[])
{
    char *hashToCrack = crypt(argv[1], setting);

    printf("%s\n", hashToCrack);

    for (int i = 0; i < strlen(values); i++)
    {
        printf("trying %c ...\n", values[i]);
        char *try = crypt(&values[i], setting);

        if (strcmp(hashToCrack, try) == 0)
        {
            printf("calc: %s\n", try);
            printf("init: %s\n", hashToCrack);
            printf("Found!\n");
        } 
    }
    
    return 0;
}

为方便起见,我只是在参数中给出了一个字符串,它将成为破解的字符串。它在主函数的开头被加密(存储在 hashToCrack 中)。现在,我只使用一个字符。我这样编译程序:gcc main.c -o main -lcrypt -Wall.

问题 - 当我启动这个程序时,我“找到了!”在 for 循环的每次迭代中。看来hashToCrack和try是一样的。但是,我从不覆盖 hashToCrack,所以它永远不会改变。

可能有一些我不明白的地方,但我找不到。

有什么想法吗? :D

crypt函数returns指向静态数据缓冲区的指针。所以再次调用时,hashToCrack指向的字符串就变了。

您需要将第一次调用 crypt 的结果复制到单独的缓冲区中。

char *hashToCrack = strdup(crypt(argv[1], setting));

不要忘记在完成此缓冲区后调用 free