这是一些代码。
#include <stdio.h>
int main()
{
char npass[] = "$1$bUZXMjKz$08Ps4NPTfj6ZNkoqrsP/D.";
char salt [12];
int i;
for (i = 0; i < 12; i++)
{
npass[i+3] = salt[i];
i++;
}
salt[12] = '\0';
puts(salt);
return 0;
}
基本上, npass 是md5crypt
结果(密码是admin)。为了验证这一点,我需要将盐与结果分开。
我的理解是C
中的字符串实际上是一个char array
,其中包含所有字母(最后都是'\0'
)。我使用for
循环来剪切前三个字符,但我想因为ASLR
,我得到的结果总是随机的。实际上,没有 ASLR
,我总是得到相同的随机结果。
答案 0 :(得分:4)
当然你得到“随机”数据,你将分配给哈希而不是盐。你想要反过来:
salt[i] = npass[i+3];
或者你可以跳过循环并执行:
memcpy(salt, npass + 3, sizeof(salt) - 1);
salt[sizeof(salt) - 1] = '\0';
答案 1 :(得分:0)
由于已经指出了所有错误,以及一些美学修正,你应该得到这样的结论:
#include <stdio.h>
#include <string.h>
#define SALT_N 12
int main()
{
const char npass[] = "$1$bUZXMjKz$08Ps4NPTfj6ZNkoqrsP/D.";
char salt [SALT_N+1];
memcpy(salt, npass, SALT_N);
salt[SALT_N] = '\0';
puts(salt);
return 0;
}