Programming/C
fork와 pipe와 dup2 함수를 통한 표준 입력
Tribal
2016. 6. 23. 15:17
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> int main(void) { char* arg[2] = {'A', }; //string array char* env[2] = {'A', }; //environment int pid, pipefd[2]; if(pipe(pipefd) < 0) { perror("pipe error"); exit(-1); } pid = fork(); if(pid == -1) //Error { perror("Failed to Create Process"); exit(-1); } else if(pid == 0) //자식 프로세스(0인 경우) { printf("Thank you!\n"); //Running Check2! dup2(pipefd[0], 0); close(pipefd[1]); execve("/home/tribal/test/attackme", arg, env); } else //부모 프로세스 { printf("I will find you. I will look for you. I will send for you.\n"); //Running Check1! write(pipefd[1], "payload", 4); sleep(10); } return 0; } | cs |
fork() : 자신의 프로세스를 그대로 복사, 붙여넣기해서 자식 프로세스 생성
- 성공 시, 자식 프로세스는 0이며, 부모 프로세스는 -1과 0 이외의 값을 가짐
- 실패 시, -1이 반환 됨
pipe : 사용할 경우, int형의 크기 2인 배열 필요(하나는 입력, 하나는 출력)
- 사용하고자 하는 경우, pipe(배열 이름) 하면 됨
- int형 배열[0]은 출력, [1]은 입력임(반이중 전송)
dup2 : 파일 디스크립터를 그대로 복사함, Linux Remote Shellcode 에서 주로 사용되는 것을 볼 수 있었고 원하는 디스크립터의 역할을 지정한 녀석에 복사해버린다.
- dup2(oldfd, newfd)가 있다면, newfd에 oldfd가 복사되기 때문에 newfd가 사용될 경우 oldfd가 불러와진다.
표준 입출력인 0, 1을 newfd로 지정하는 경우 oldfd에 표준 입출력이 적용되게 된다.
표준 입출력인 0, 1을 newfd로 지정하는 경우 oldfd에 표준 입출력이 적용되게 된다.
- 괜찮은 dup2에 대한 예시 설명 : http://sosal.kr/186