티스토리 뷰
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
'Programming > C' 카테고리의 다른 글
난수 자릿수별 빈도 계산기 (0) | 2016.09.14 |
---|---|
dumpcode.h (0) | 2016.07.05 |
GNU gcc의 특수한 C언어 문법 - Designated Initializers (0) | 2016.06.23 |
WinAPI 콤보박스(ComboBox)와 에디트컨트롤(Edit Control) 예제 (0) | 2015.12.07 |
Win API를 통한 사칙연산기 (2) | 2015.12.07 |
댓글