일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- write up
- px4
- pwn.college
- 시스템해킹
- 시그널
- C++
- 시스템
- 시스템 프로그래밍
- 리눅스커널
- C언어
- 취약점
- 워게임
- wargame
- 커널
- 리눅스 커널
- 알고리즘
- 리버싱
- radare2
- 컴퓨터구조
- Leviathan
- 시스템프로그래밍
- 어셈블리어
- Pwnable.kr
- Bandit
- 드론
- 프로그래밍
- 리눅스
- css
- pwncollege
- kernel
Archives
- Today
- Total
Computer Security
#40 고급 시그널 처리 본문
반응형
고급 시그널 관리
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
파라미터
- signum : 대상 시그널 번호
- act : 시그널 처리 액션
- oldact : 기존 시그널 처리 액션
반환 값
- 성공 시 0
- 실패 시 -1
struct sigaction
struct sigaction {
void (*sa_handler) (int);
void (*sa_sigaction) (int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer) (void); /* 사용되지 않음 */
};
- sa_flags 에 SA_SIGINFO 포함 시 sa_sigaction이 호출된다.
- sa_mask 는 시그널 핸들러 실행하는 동안 블록해야 할 시그널 모음 정의
sa_flags
flags | meaning |
SA_SIGINFO | sa_sigaction()이 사용된다. |
SA_NODEFER | 설정시 시그널 핸들러가 실행 중인 시그널에 대해 블록하지 않는다. |
SA_NOCLDSTOP | signo가 SIGCHLD인 경우 자식이 정지해도 SIGCHLD를 보내지 않도록 한다. |
SA_NOCLDWAIT | signo가 SIGCHLD인 경우 자식에 대한 자동처리 활성화(wait() 필요 없음) |
SA_RESETHAND | 시그널 핸들러가 1회면 동작한 후 default로 초기화 된다. |
SA_RESTART | read() 등의 시스템콜이 자동으로 재시작된다. |
siginfo_t 주요 필드
field | meaning |
si_signo | 시그널 번호 |
si_errno | 0이 아닌 경우 시그널과 관련된 에러 코드 |
si_code | 시그널을 일으킨 원인 |
si_int, si_ptr | sigqueue()를 통해 보낸 시그널 페이로드 |
si_addr | SIGBUS, SIGFPE, SIGILL, SIGSEGV, SIGTRAP의 경우 장애를 일으킨 주소 |
si_fd | SIGPOLL의 경우 작업을 완료한 파일 디스크립터 |
모든 시그널 번호에 대해 유효한 si_code
si_code | meaning |
SI_ASYNCIO | 비동기식 입출력의 완료 표시 |
SI_KERNEL | 커널이 보낸 시그널 |
SI_MESGQ | POSIX 메시지 큐의 상태 변화 표시 |
SI_QUEUE | sigqueue()로 보낸 시그널 |
SI_TIMER | POSIX 타이머 만료를 표시 |
SI_USER | kill() 또는 raise()로 보낸 시그널 |
SIGCHLD인 경우에만 유효한 si_code
si_code | meaning |
CLD_CONTINUED | 자식이 정지되었다가 재시작됨 |
CLD_DUMPED | 자식이 비정상적으로 종료됨 |
CLD_EXITED | 자식이 exit()로 정상 종료됨 |
CLD_KILLED | 자식이 종료됨 |
CLD_STOPPED | 자식이 정지됨 |
CLD_TRAPPED | 자식이 트랩에 걸림 |
페이로드와 함께 시그널 전송
union sigval {
int sival_int;
void *sival_ptr;
};
int sigqueue(pid_t pid, int signo, const union sigval value);
파라미터
- pid : 대상 프로세스
- signo : 시그널 번호
- value : 페이로드
반환 값
- 성공 시 0
- 실패 시 -1
해당 시그널을 sigaction()으로 받으면
- siginfo_t.si_code : SI_QUEUE로 설정된다.
- siginfo_t.si_int : 페이로드가 설정된다.
반응형
'리눅스 시스템 프로그래밍' 카테고리의 다른 글
#39 기본 시그널 처리 (실습) (0) | 2022.10.14 |
---|---|
#38 기본 시그널 처리 2 (0) | 2022.10.13 |
#37 기본 시그널 처리 1 (0) | 2022.10.12 |
#36 쓰레드 개념, 쓰레드 생성/종료/조인/동기화 (실습2) (2) | 2022.10.11 |
#35 쓰레드 개념, 쓰레드 생성/종료/조인/동기화 (실습1) (0) | 2022.10.10 |
Comments