Profile

youngsouk

youngsouk

코딩중

2021.05.11 - [1인 1프로젝트] - 코딩 중

 

코딩 중

데이터의 패킹&언패킹 함수 구현과 process함수의 동작방식을 자세하게 구상해보았다. 내가 구현한 패킹&언패킹 함수는 이렇다. unsigned long long * p64(unsigned long long value){ unsigned long long * tmp =..

youngsouk-hack.tistory.com

이전의 글에 이어 Process함수와 그 함수를 바탕으로 recv, send함수를 구현했다.

void remote(char * ip, int port){
    int SocketNum = socket(PF_INET, SOCK_STREAM, 0);
    struct sockaddr_in    server_addr;
    
    if(SocketNum < 0){
        printf("Socket 오류");
        exit(0);
    }

    memset( &server_addr, 0, sizeof( server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(port);
    server_addr.sin_addr.s_addr= inet_addr(ip);

    if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) != 1) {
        printf("inte_pton");
        exit(0);
    }
    if( -1 == connect( SocketNum, (struct sockaddr*)&server_addr, sizeof( server_addr) ) )
    {
        printf( "접속 실패\n");
        exit( 1);
    }
    fd[1][0] = SocketNum;
    fd[0][1] = SocketNum;
    
    printf("Set Connnection with %s:%d", ip, port);
}

int process(char * path){
    pid_t pid;
    if(pipe(fd[0]) < 0){
        printf("pipe error");
        exit(0);
    } 
    if(pipe(fd[1]) < 0){
        printf("pipe error");
        exit(0);
    } 
    
    switch(pid = fork()){
    case -1:
        printf("fork error");
        return -1;
    case 0:
        close(fd[1][0]);
        close(fd[0][1]);

        close(1);
        close(0);
        
        dup2(fd[1][1], STDOUT_FILENO);
        dup2(fd[0][0], STDIN_FILENO);
        
        execl(path, path, NULL);
    }

    close(fd[1][1]);
    close(fd[0][0]);

    char buf[1000];
    printf("[*] Starting local process... pid is %d\n", pid);
    return 0;
}

int Recvuntil(char * str, int print){
    int i = 0, len = strlen(str), cnt = 0; // i : index, len : source length, cnt : total recv amount
    char * tmp = (char * ) calloc(1, len);

    while(1){
        read(fd[1][0], tmp + i, 1);

        cnt++;
        if(print == 1) write(1, tmp + i, 1);
        if(*(tmp + i) == *(str + i)) i++;
        else i = 0;
        if(i == len - 1){
            free(tmp);
            return cnt;
        };
    }
}

char * Recv(int cnt, int print){
    char * tmp;
    int len;

    tmp = (char * ) calloc(1, cnt + 1); // cnt + 1 : NULL 문자 때문에
    len = read(fd[1][0], tmp, cnt);
    if(print == 1) printf("%s\n", tmp);

    return tmp;
}

int Send(char * str){
    return write(fd[0][1], str, strlen(str));
}

int Send32(char * str){ // 0 값을 보내기 위한 함수. strlen("\x00") = 0이기 때문
    return write(fd[0][1], str, 4);
}

int Send64(char * str){
    return write(fd[0][1], str, 8);
}

int Sendline(char * str){
    int len;
    char * tmp = (char * ) calloc(1, strlen(str) + 2); // strlen(str) + 2 : '\n' 개행 문자 , NULL 때문에

    strcpy(tmp, str);
    strcat(tmp, "\n");
    len = Send(tmp);
    free(tmp);
    return len;
}

'1인 1프로젝트' 카테고리의 다른 글

완성  (0) 2021.06.14
코딩&디버깅 중  (0) 2021.06.08
코딩 중  (0) 2021.05.11
코딩 중  (0) 2021.05.10
코딩시작  (0) 2021.04.27