当我尝试查找一行代码并以通常的方式获取密码(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客户端添加到缓冲区。
答案 0 :(得分:3)
这不是实际的方法。您将需要编写一些辅助函数。
recv()
不会对读入缓冲区的数据进行空终止。它返回已读取的字节数;您需要使用此值。
recv()
不保证将以与发送数据相同的帧接收数据。特别是,它不能保证一整行输入-或仅一行输入! -将会收到。在最坏的情况下,您的应用程序可能在单个recv()
调用中仅接收一个字节的输入或两行输入。您需要先将数据读取到缓冲区中,然后等待换行符(或其他合适的终止符),然后再处理它。