使用 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
。
我正在尝试构建一个 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
。