Study Record

[리버싱 기초개념] 레이스 컨디션/signal 본문

리버싱/기초 개념

[리버싱 기초개념] 레이스 컨디션/signal

초코초코초코 2021. 11. 15. 11:52
728x90

1. 레이스 컨디션

☞ 레이스 컨디션(Race Condition)

다수의 프로세스가 서로 동일한 자원을 할당받기 위해 경쟁하는 상태이다.

 

 레이스 컨디션(Race Condition)의 전제조건

  • 다른 계정의 권한에 접근해야 하므로 SetUID가 걸려 있어야 한다.
  • 임시 파일을 생성해야 한다.
  • 공격자가 임시로 생성되는 파일명을 정확하게 알아야 한다.

 

 레이스 컨디션 원리

victim.c (SetUID, root) attack.c
임시파일 생성 (/tmp/tmp1)

임시파일 사용

임시파일 삭제(/tmp/tmp1)
while(true){
    if( /tmp/tmp1 파일이 존재?){
        # /tmp/tmp1 에 대한 공격 동작
        break;
    }
}

victim.c 프로그램이 실행될 때 attack.c 가 동시에 실행하면서 같은 자원(임시파일(/tmp/tmp1))을 경쟁하다보면 의도치 않은 동작을 할 수 있다.

 

 레이스 컨디션 공격 방어 방법

되도록이면 임시파일을 생성하지 않고 생성하게 되더라도 이름을 랜덤하게 준다.

 

2. signal

☞ 시그널(signal)?

하나의 프로세스가 다른프로세에게 보내는 비동기적 알림 이벤트 메세지이다.

kill 명령어를 통해 시그널을 보낼 수 있다.

# man 7 signal

 

☞ kill CMD

사용 형식 : kill -[signal] <프로세스>

# kill -l : 시그널 번호/이름 목록 확인

번호 시그널 이름 설명
1 SIGHUP 터미널에서 접속이 끊겼을 떄 보내지는 시그널 (종료)
2 SIGINT 키보드로부터 오는 인터럽트 시그널 (종료) - CTRL + C
3 SIGOUT 키보드로부터 오는 실행 중지 시그널 - CTRL + \
프로세스를 종료시킨 뒤 코어를 덤프한다.
9 SIGKLL 무조건 종료, 프로세스 강제 종료
15 SIGTERM 정상 종료 - default
18 SIGONT STOP 시그널에 의해 정지된 프로세스 다시 실행
19 SIGTOP 터미널에서 입력된 정지 시그널 
SIGONT(18) 으로 다시 실행 가능
20 SIGSTP 실행 정지 후 다시 실행을 계속하기 위해 대기시킨다. - CTRL + z
SIGONT(18) 으로 다시 실행 가능

# kill -9 1134

# kill -15 1234

 

☞ 시그널 핸들러

프로세스가 특정 시그널을 포착했을 때 수행해야 할 별도의 함수

시그널 종류 : /usr/include/asm/signal.h

 

→ signal() 함수

- https://laustudy.tistory.com/46

- https://www.ibm.com/docs/ko/i/7.3?topic=functions-signal-handle-interrupt-signals

#include <signal.h>

sighandler_t signal(int signum, sighandler_t handler);
/*
인터럽트 신호를 처리할 수 있는 함수이다.
리턴값 : 성공시 handler 함수 주소, 실패시 EINVAL
signum  : 시그널 번호/이름
handler : SIG_DFL 또는 SIG_IGN 중 하나여야 하며, <signal.h> 포함 파일이나 함수 주소에 정의된다.
*/
signal(SIGINT, SIG_DFL);    # SIG_DFL : 시그널 실행
signal(SIGQUIT, SIG_IGN);   # SIG_IGN : 시그널 무시
signal(SIGINT, handler);    # handler 라는 별도의 정의된 함수 실행

 

728x90