recv () получает неверные данные - PullRequest
0 голосов
/ 13 декабря 2018

Когда я пытаюсь найти строку кода и получить пароль (id, salt, hash) обычным способом, он работает правильно.

struct spwd *shadow_file_line;
char *full_pass;

int main(int argc, char *argv[])
{
  shadow_file_line = getspnam("root");
  full_pass = shadow_file_line->sp_pwdp;
  printf("%s\n", full_pass);
}

Но когда я пытаюсь сделать то же самоеиспользуя recv (), что-то идет не так.

char recieve_login_buffer[20];
    char recieve_password_buffer[20];

    char *send_msg_greet = "proftpd clone 0.1beta\n";
    send(new_sck, send_msg_greet, strlen(send_msg_greet), 0);

    char *send_msg_login_request = "Login: ";
    send(new_sck, send_msg_login_request, strlen(send_msg_login_request), 0);

    recv(new_sck, &recieve_login_buffer, sizeof recieve_login_buffer, 0);
    printf("Login entered: %s", recieve_login_buffer);

    char *send_msg_password_request = "Password: ";
    send(new_sck, send_msg_password_request, strlen(send_msg_password_request), 0);

    recv(new_sck, &recieve_password_buffer, sizeof recieve_password_buffer, 0);
    printf("Password entered: %s", recieve_password_buffer);

    sp = getspnam(recieve_login_buffer);
    full_encrypted_pass = sp->sp_pwdp;
    printf("%s\n", full_encrypted_pass);

Так как мне изменить слово, полученное сервером?Я не знаю, какой сервер или клиент telnet, который я использую, добавляет в буфер.

1 Ответ

0 голосов
/ 13 декабря 2018

Это не практический подход.Вам нужно будет написать несколько вспомогательных функций.

  1. recv() не завершает данные, считываемые в буфер, с нулевым завершением.Возвращает количество прочитанных байтов;вам необходимо использовать это значение.

  2. recv() в потоковом сокете не гарантирует получение данных с тем же кадрированием, что и при передаче.В частности, это не гарантирует, что вся строка ввода - или только одна строка ввода!- будет получено.В худшем случае ваше приложение может получить только один байт ввода или обе строки ввода за один recv() вызов.Вам нужно прочитать данные в буфер и дождаться новой строки (или любого другого подходящего терминатора) перед обработкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...