Вырезать символы для строки в C

Вот код

#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Я всегда получаю один и тот же случайный результат.

2 ответа

Решение

Конечно, вы получаете "случайные" данные, вы назначаете хэш, а не соль. Вы хотите наоборот:

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

Или вы можете пропустить цикл и сделать:

memcpy(salt, npass + 3, sizeof(salt) - 1);
salt[sizeof(salt) - 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;
}
Другие вопросы по тегам