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에 표준 입출력이 적용되게 된다.

- 괜찮은 dup2에 대한 예시 설명 : http://sosal.kr/186