[*] 2017 2월 19일 추가: fork - exec 대신 posix_spawn을 써보자 http://koyo.kr/66


    c언어에서 기존 프로세스를 종료시키지 않고 외부 명령어를 실행하고 싶을 때가 있다.

    system 함수는 보안상 문제가 많아서 안쓰는 게 좋다고 하고... 그러면 exec 계열 함수를 써야되는데 이 함수는 현재 프로세스를 실행한 외부 프로그램으로 교체해버린다.


    예전에 이 문제 때문에 고민을 많이 했는데 책을 보니까 fork 함수로 자식 프로세스를 생성해서 exec 계열 함수를 쓰면 된다고 한다. 난 왜 두개 같이 쓸 생각을 못햇대


    아래는 내가 사용하고 싶었던 예시ㅋㅋ 그런데 외부프로그램을 아예 실행하지 않는 게 보안에 좋을 것 같다...

    #include <unistd.h>
    #include <sys/wait.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    void _execv(const char *path, char *const argv[]) {
        int ret;
        pid_t pid;
    
        pid = fork();
        if (pid == -1) { perror("fork"); exit(EXIT_FAILURE); }
        if (pid == 0) {
            ret = execv(path, argv);
            if (ret == -1) { perror("execv"); exit(EXIT_FAILURE); }
        }
        waitpid(-1, NULL, 0);
    }
    
    int main() {
        char path[] = "/sbin/iptables";
        char *argv_A[] = { "iptables", "-A", "OUTPUT", "-j", "NFQUEUE", "--queue-num", "0", NULL };
        char *argv_D[] = { "iptables", "-D", "OUTPUT", "-j", "NFQUEUE", "--queue-num", "0", NULL };
        char *argv_L[] = { "iptables", "-L", NULL };
    
        printf("\n[*] iptables -A OUTPUT -j NFQUEUE --queue-num 0\n");
        _execv(path, argv_A);
        _execv(path, argv_L);
    
        printf("\n[*] iptables -D OUTPUT -j NFQUEUE --queue-num 0\n");
        _execv(path, argv_D);
        _execv(path, argv_L);
    
        return 0;
    }
    



    Posted by 코요

티스토리 툴바