'프로세스'에 해당되는 글 13건

  1. 2009.05.31 [Linux C++] 프로세스 & 좀비 프로세스
  2. 2009.05.31 lsof 이용한 시스템 조사 및 분석
  3. 2009.05.31 UDP 패킷을 생성하는 프로세스 찾기
2009.05.31 16:27

[Linux C++] 프로세스 & 좀비 프로세스

1. 좀비 프로세스란?
- 프로세스 종료 후, 메모리에서 사라지지않는 프로세스를 말합니다.

2. 좀비 프로세스가 생성되는 이유?
- 자식 프로세스는 수행종료 후 부모 프로세스에게 실행 결과에 대한 리턴값을 넘겨줘야 합니다.
그리고 부모 프로세스 역시 이 리턴값을 받아야 자식 프로세스가 좀비가 되는 문제를 막을 수 있습니다.


첫번째 그림은 자식 프로세스가 실행을 마치고, 실행 결과에 대한 리턴값(0)을 커널에 넘겼지만,
부모 프로세스가 이를 받지 않았습니다. 그래서 자식 프로세스는 좀비상태가 됩니다.

두번째 그림은 커널이 부모 프로세스에게 리턴값(0)을 전달하고,
그제서야 자식 프로세스가 소멸되는 것을 나타낸 것입니다.

사용자 삽입 이미지

리눅스 콘솔에서 ps -u 라고 입력하면 실행중인 프로세스 목록을 볼 수 있습니다.
위 스샷을 보면 STAT 에 Z 라고 적힌 프로세스가 있습니다.
이것이 Zombie, 좀비 프로세스입니다.
자식 프로세스가 실행을 마쳤지만, 부모 프로세스가 리턴값을 받지않은 결과져.

- 좀비 프로세스의 소멸 1
1. 소멸 방법
- 부모 프로세스에서 자식 프로세스의 리턴값을 요구합니다.
2. wait 함수의 사용
- 장점 : 사용하기 간단합니다.
- 단점 : 무한루프에 빠질 수 있습니다.

  1. #include <sys/types.h>   
  2. #include <sys/wait.h>   
  3.   
  4. pid_t wait(int * status)   

  1. /*  
  2.  * wait.c  
  3.  * Written by SW. YOON  
  4.  */  
  5. #include <stdio.h>   
  6. #include <sys/wait.h>   
  7. #include <sys/types.h>   
  8.   
  9. int main(int argc, char **argv)   
  10. {   
  11.   pid_t pid, child;   
  12.   int data=10;   
  13.   int state;   
  14.   
  15.   pid=fork();   
  16.   if(pid<0)   
  17.     printf("fork 실패 프로세스 id : %d \n", pid);   
  18.   
  19.   printf("fork 성공 프로세스 id : %d \n", pid);   
  20.   
  21.   if(pid==0) /* 자식 프로세스라면 */  
  22.     data+=10;   
  23.   else       /* 부모 프로세스라면 */  
  24.   {   
  25.     data-=10;   
  26.     child=wait(&state); /* 자식 프로세스의 종료 대기 */  
  27.     printf("자식 프로세스 ID = %d \n", child);   
  28.     printf("리턴 값 = %d \n", WEXITSTATUS(state));   
  29.     sleep(20); /* 프로세스 상태 확인을 위해서 */    
  30.   }   
  31.   
  32.   printf("data : %d \n", data);   
  33.   return 0;   
  34. }  
./wait & 명령으로 프로그램을 수행합니다.
& 를 붙이게 되면, 프로그램 수행 후에도 사용자 입력을 받을 수 있는 상태가 됩니다.

우선, pid=fork() 로 자식 프로세스를 생성합니다.
pid == 0 판단하여, 자식 프로세스라면 data+=10
부모 프로세스라면 data-=10 을 수행합니다.

여기서 자식 프로세스는 data 값(20)을 출력하고 0을 리턴합니다.

부모 프로세스는 child = wait(&state) 로 자식 프로세스의 리턴값을 받습니다.
* 만약, 여기서 자식 프로세스가 리턴하지 못하면, 부모 프로세스는 무한대기상태에 빠집니다.

중간에 [1] 15299 라고 출력되는 것은 /wait & 수행시 나타나는 것으로
어떤 프로세스의 수행이 끝났을 때 프로세스 id 값이 출력되는 것 같습니다 ;;

사용자 삽입 이미지

- 좀비 프로세스의 소멸 2
1. 소멸 방법
- 부모 프로세스에서 자식 프로세스의 리턴값을 요구합니다.
2. waitpid 함수의 사용
- wait 함수가 가지고 있는 무한대기상태의 문제점을 해결합니다.
  1. #include <sys/types.h>   
  2. #include <sys/wait.h>   
  3.   
  4. pid_t waitpid(pid_t pid, int * status, int options)   

  1. /*  
  2.  * waitpid.c  
  3.  * Written by SW. YOON  
  4.  */  
  5.   
  6. #include <stdio.h>   
  7. #include <sys/wait.h>   
  8. #include <sys/types.h>   
  9.   
  10. int main(int argc, char **argv)   
  11. {   
  12.   pid_t pid, child;   
  13.   int data=10;   
  14.   int state;   
  15.   
  16.   pid=fork();   
  17.   if(pid<0)   
  18.     printf("fork 실패, 프로세스 id : %d \n", pid);   
  19.   
  20.   printf("fork 성공, 프로세스 id : %d \n", pid);   
  21.   
  22.   if(pid==0) /* 자식 프로세스라면 */  
  23.   {   
  24.     data+=10;   
  25.     sleep(10); /* 종료를 10초 지연 */  
  26.   }   
  27.   else       /* 부모 프로세스라면 */  
  28.   {   
  29.     data-=10;   
  30.     do{   
  31.       sleep(3);   
  32.       puts("3초 대기");   
  33.       child=waitpid(-1, &state, WNOHANG);   
  34.     }while(child == 0);   
  35.   
  36.     /* 종료한 자식 프로세스 상태정보 출력 */  
  37.     printf("Child process id = %d, return value = %d \n\n", child, WEXITSTATUS(state));   
  38.   }   
  39.   
  40.   printf("data : %d \n", data);   
  41.   return 0;   
  42. }  
코드에 큰 차이는 없습니다.
child=waitpid(-1, &state, WNOHANG); 에 대해서만 설명하겠습니다.

waitpid 에 첫번째 인자로
-1 을 주게되면, 특정 프로세스를 기다리는게 아니라 모든 프로세스로부터 리턴값을 받는다는 의미입니다.
두번째 인자의 state 는 wait 과 같은 의미로써, 리턴값을 저장합니다.
세번째 인자의 WNOHANG 은 프로세스로부터 리턴값을 받지 못하면 0 을 리턴한다는 의미입니다.

결국 while(child==0) 루프를 돌리고 있으므로,
이 코드 역시 위의 wait 예제와 같은 것이라고 봐도 무방하겠습니다.

사용자 삽입 이미지


출처 : http://thx4alice.tistory.com/

Trackback 0 Comment 0
2009.05.31 16:13

lsof 이용한 시스템 조사 및 분석

1. lsof 란?
2. lsof 활용법
3. 해킹 추적
4. 결론

____

 

1. lsof 란?


# whatis lsof
lsof (8) - list open files ( 열려진 파일들을 보는 명령어 )

일반적으로 시스템에서 동작하고 있는 모든 프로세스에 의해서 열리어진 파일들에
관한 정보를 보여주는 시스템 관리 명령어


2. lsof 활용법

lsof sample usage
-----------------

 

파일
# lsof /etc/passwd

특정 파일을 억세스하고 있는 프로세스 확인
# lsof /tmp
list all files open in /tmp
# lsof L
list the link counts of open files
# lsof L1
select only files that have a link count less than the upper bound
# lsof -a L1 /home
-a (AND 옵션) /home 디렉토리 밑에서 검색

 

인터넷 소켓

# lsof -i
lists all open Internet socket files
# lsof -iTCP@bae.nuri.net
# lsof -iTCP@bae.nuri.net:ftp-data
# lsof -iTCP:32771-32776
# lsof -i@192.168.0.1

특정 호스트(또는 ip)에 대한 접속 확인

# lsof -i @test.sun.com:80

특정 포트로 접속한 리스트 확인

# lsof -u $UID

특정 유저가 사용하는 프로세스 확인

# lsof -u ^root,yskim,admin

특정사용자를 제외한 정보를 출력하고자 할때는 "^" 심볼을 사용하여 사용자명을 기술하면 되고, 여러명을 동시에 지정하려면 ","를  이용하여 사용자명을 나열하면 된다.


프로세스
# lsof -p $PID
지정한 프로세스가 오픈한 파일 리스트 확인
# lsof -c $CMD
지정한 실행 프로그램이 엑세스하고 있는 파일 리스트 확인

 

2.1. lsof 파일명

지정한 파일을 엑세스 하고 있는 프로세스의 정보를 보여준다.

 

# lsof /usr/sbin/proftpd
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
proftpd 647 nobody txt REG 8,2 433516 209221 /usr/sbin/proftpd


fuser 또한 파일을 사용중인 프로세스를 찾는 명령이다.

# fuser -v -n tcp 21

solaris 에도 fuser가 있고 역시 파일을 사용중인 프로세스를 찾는 명령인데
linux처럼 포트를 조사하는 옵션이 없는 것 같다.

 

2.2. lsof /tmp

지정한 디렉토리를 엑세스 하고 있는 프로세스의 정보를 보여준다.

 

# lsof /tmp
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
libhttpd. 27187 root 3u REG 7,0 0 13 /tmp/ZCUD5mDv1l (deleted)
libhttpd. 27318 nobody 3u REG 7,0 0 13 /tmp/ZCUD5mDv1l (deleted)
libhttpd. 27319 nobody 3u REG 7,0 0 13 /tmp/ZCUD5mDv1l (deleted)
libhttpd. 27320 nobody 3u REG 7,0 0 13 /tmp/ZCUD5mDv1l (deleted)
libhttpd. 27321 nobody 3u REG 7,0 0 13 /tmp/ZCUD5mDv1l (deleted)

 

2.3. lsof -i

모든 네트워크 연결되어 있는 프로세스와 파일을 정보를 보여준다.

 

# lsof -i
sshd 586 root 3u IPv4 1877 TCP *:ssh (LISTEN)
xinetd 600 root 5u IPv4 1943 TCP *:pop3 (LISTEN)
sendmail 619 root 4u IPv4 1962 TCP *:smtp (LISTEN)
proftpd 647 nobody 0u IPv4 315947 TCP *:ftp (LISTEN)
mysqld 708 mysql 3u IPv4 2652 TCP *:mysql (LISTEN)


ex)lsof -iTCP ; lsof -iUDP
tcp 나 혹은 UDP를 걸러서 볼때 사용한다.

 

2.4. lsof -c 데몬명

지정한 데몬과 연결되어 있는 프로세스와 파일을 정보를 보여준다.

 

# lsof -c proftpd
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
proftpd 647 nobody cwd DIR 8,3 4096 2 /
proftpd 647 nobody rtd DIR 8,3 4096 2 /
proftpd 647 nobody txt REG 8,2 433516 209221 /usr/sbin/proftpd
proftpd 647 nobody mem REG 8,3 106424 15973 /lib/ld-2.3.2.so
proftpd 647 nobody mem REG 8,3 23404 15994 /lib/libcrypt-2.3.2.so
proftpd 647 nobody mem REG 8,3 30488 17917 /lib/libpam.so.0.75
proftpd 647 nobody mem REG 8,3 1571340 95813 /lib/tls/libc-2.3.2.so
proftpd 647 nobody mem REG 8,3 14888 15996 /lib/libdl-2.3.2.so
proftpd 647 nobody mem REG 8,3 8612 17914 /lib/liblaus.so.1.0.0
proftpd 647 nobody mem REG 8,3 51908 16016 /lib/libnss_files-2.3.2.so
proftpd 647 nobody 0u IPv4 315947 TCP *:ftp (LISTEN)
proftpd 647 nobody 4r REG 8,3 3509 82811 /etc/passwd
proftpd 647 nobody 5r REG 8,3 1241 83170 /etc/group


2.5. lsof -p 프로세스ID

지정한 프로세스와 관련된 프로세스와 파일의 정보를 보여준다.

 

# lsof -p 1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 8,3 4096 2 /
init 1 root rtd DIR 8,3 4096 2 /
init 1 root txt REG 8,3 27036 16204 /sbin/init
init 1 root mem REG 8,3 1571340 95813 /lib/tls/libc-2.3.2.so
init 1 root mem REG 8,3 106424 15973 /lib/ld-2.3.2.so
init 1 root 10u FIFO 8,3 71415 /dev/initctl

 

2.6 lsof -n : 레퍼런스 카운트점검


3. 해킹 추적

 

3.1. 시나리오

 

#lsof -i -> 기본 포트연것을 확인한다.
#lsof -p -> 프로세스를 분석한다.
#lsof /home/홈페이지 디렉토리 -> 특정디렉토리에 있는 프로세스 검사
#lsof /tmp -> 임시파일 관련 프로세스 분석
#lsof /dev -> 정규 해킹 디렉토리 분석


각종 정보를 수집하고 정리 및 대응을 한다.

 

4. 결론

보안 관련된 일을 하는 사람은 반드시 마스터해야한다. 


Trackback 1 Comment 0
2009.05.31 14:44

UDP 패킷을 생성하는 프로세스 찾기

아래의 링크에서 Prcoess Monitor v2.02 버전을 다운

http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx

다운 받은 압축파일을 풀어서 Procmon.exe을 실행

Monitor Filter 를 아래와 같이 적용




Monitor Filter 를 추가하고 실행을 하면 network 에 관련된 이벤트만 표시됨

그럼 실제 UDP 패킷을 발생하는 프로세스를 찾아보도록 하자
여기에서는 Network 이벤트를 모니터링 하도록 Monitor Filter를 적용한 후 nslookup 으로 UDP 패킷을 생성하였음

procmon에서 잡힌 이벤트는 아래와 같음


Trackback 0 Comment 0