0

这是一些代码。

#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结果(密码是管理员)。为了验证这一点,我需要将盐与结果分开。

我的理解是,一个字符串C实际上是一个char array单独包含所有字母的字符串('\0'末尾带有)。我使用for循环来剪切前三个字符,但我猜是因为ASLR,我得到的结果总是随机的。实际上,没有 ASLR,我总是得到相同的随机结果。

4

2 回答 2

4

当然你得到“随机”数据,你分配哈希而不是盐。你想要相反的方式:

salt[i] = npass[i+3];

或者您可以跳过循环并执行以下操作:

memcpy(salt, npass + 3, sizeof(salt) - 1);
salt[sizeof(salt) - 1] = '\0';
于 2013-02-07T08:34:16.970 回答
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;
}
于 2013-02-07T08:47:24.490 回答