브래의 슬기로운 코딩 생활
네트워크 보안 7주차 정리 (UNIX 기본 함수) 본문
UNIX 기본 프로그래밍
- 시간처리 함수 -
초 단위 시간 정보 추출
초단위 현재 시간 추출
함수 : time()
• 현재 시각을 1970/01/01 00:00:00 +0000(UTC)을 기준으로 초 단위 값 추출
• UNIX 타임으로 통용
• time_t는 4바이트(현재)의 정수형 타입(int, int32_t)의 매크로
• 2038/01/19 03:14:07에 오버플로(Overflow) 발생
인자:
• *tloc : 시각정보가 저장될 변수(NULL이면 저장 안함)
결과 값:
• 성공 : 현재 시간(초단위)
• 실패 : -1
시간 표시 형식 변경
표시 형식 변경
함수 : localtime()
• 주어진 초 단위 시각정보를 구조체 tm 타입 정보로 변환
• 정적 영역(static memory)을 사용하여 해당 공간의 주소를 반환
– re-entrance 문제 주의
• 매뉴얼에서는 localtime_r() 함수 사용을 권고
인자:
• *timep : 초단위 시각정보
결과 값:
• 성공 : struct tm 타입의 주소 포인터
• 실패 : NULL
함수 : localtime_r()
• localtime()함수와 동일한 동작
• 단, 두번째 인자에 변환 결과를 기록
인자:
• *timep : 초단위 시각정보
• *result : 변환 결과가 반영될 포인터 변수
결과 값:
• 성공 : struct tm 타입의 주소 포인터
• 실패 : NULL
밀리초 단위 시간 정보 추출
밀리초 단위 현재 시간 추출
함수 : ftime()
• 현재 시각을 밀리초 단위의 값(2bytes)으로 추출
• 초단위의 값은 UNIX 타임기준
인자:
• *tp : 현재 시간이 저장될 변수
결과 값:
• 성공 : 현재 시간(초단위)
• 실패 : -1
마이크로초 단위 시간 정보 추출
마이크로초 단위 현재 시간 추출
함수 : gettimeofday()
• 현재 시각을 마이크로초 단위의 값으로 추출
• 초 단위의 값은 UNIX 타임기준
인자:
• *tv : 현재 시간이 저장될 변수
• *tz : 저장될 타임존
결과 값:
• 성공 : 0
• 실패 : -1
초 단위 시간 변환
초 단위 시간 변환
함수 : mktime()
• struct tm 형태의 시각정보를 변환
• 초 단위의 UNIX 시간 정보로 변환
인자:
• *tm : 입력할 struct tm 형태의 시각
결과 값:
• 성공 : 초 단위 시각
• 실패 : -1
시스템 시간 설정
시스템 시간 설정
함수 : stime()
• 시스템의 시간을 설정
• 시스템 관리자 계정으로 실행해야 함
인자:
• *t : 설정한 시간(UNIX 타임, 초단위)
결과 값:
• 성공 : 0
• 실패 : -1
네트워크용 기본 API
- 소켓과 바이트 배열 처리 -
파일 기술자
파일 기술자
File Descriptor라고 하고 POSIX(Potable Operating System Interface)에서 정의
파일 접근을 위해 운영체제가 프로세스에게 주어지는 ID
• 0, 1, 2는 표준입출력을 위해 미리 정해짐
파일, 소켓(socket), IPC(Inter-Process Communication) 외 기타 자원의 접근 때마다 운영체제는 파일기술자를 할당해 줌
POSIX에서는 소켓 또한 파일 기술자로 제공
소켓은 종류에 따라 IPv4 및 IPv6 기반의 네트워크 형태의 소켓 외, 데이터 링크 및 로컬에서 사용하는 여타 다양한
소켓들이 있음
소켓의 생성은 파일기술자로 할당되며, 이 파일 기술자를 통해 데이터의 읽기/쓰기 또는 송신/수신이 처리됨
네트워크 프로그래밍과 소켓
네트워크 프로그래밍
서로 다른 호스트에 있는 프로세스 간 상호 연동된 작업이나 자원 공유를 위한 기법
네트워크로 연결되어 있는 두 프로세스간의 데이터 송수신
네트워크를 활용한 IPC
네트워크를 위해 소켓(Socket)을 이용
• 소켓: OS가 제공하는 원격 통신을 위한 매개체
소켓(Socket)
운영체제가 제공하는 응용 프로토콜 인터페이스
네트워크를 통해 프로세스간 통신이 가능토록 수단을 제공
네트워크 기반 프로그래밍을 위한 필수 요소*
• 프로토콜(Protocol)
• 소스 IP주소(Source IP Address)
• 소스 포트 번호(Source Port Address)
• 목적지 IP주소(Destination IP Address)
• 목적지 포트 번호(Destination Port Address)
포트 번호
포트
전송 계층의 기능을 수행하는 TCP와 UDP 기반의 각 종단 점(EP: End-Point)을 구분 짓기 위한 식별자(ID)
운영체제는 실행되고 있는 프로세스(process)를 구분 짓기 위한 값으로 할당
데이터 타입
POSIX 데이터 타입*
유닉스 계열의 운영체제를 위한 약속
표준화한 데이터 타입(확장성을 고려)
바이트 배열 처리 함수
바이트 배열 처리
바이트 기반의 자료형에 대한 일괄 초기화, 복사, 비교 등을 하는 API들
BSD 타입
• strings.h에 정의됨
• bzero*, bcopy*, bcmp* 등이 대표적
ANSI 타입
• string.h에 정의됨
• memset, memcpy, memcmp 등이 대표적
네트워크 주소 구조체
주소 구조체: 범용
소켓 주소를 위한 구조체(sockaddr)를 정의
• 헤더: sys/socket.h
범용소켓기반의 API에서 사용
Inet용인 sockaddr_in 구조체와 크기가 같음
• 16바이트로 동일
• 주소 복사방식으로 사용
• memcpy, bcopy를 통해 이들 간 쉽게 형 변환이 가능
주소 구조체: IPv4
- 인터넷(inet)용 소켓을 위한 구조체(sockaddr_in)를 정의(헤더: netinet/in.h)
- IPv4의 주소체계를 나타내는 구조체
- 총 16바이트로 구성
- 모든 멤버 변수의 내용물은 네트워크 바이트 순서(Byte Order)로 저장되어야 함
속성
멤버 : sin_family
• 주소 체계에 대한 정보(16비트)
• 값:
– AF_INET : IPv4 기반 인터넷(값: 2)
– AF_INET6 : IP6 기반 인터넷(값: 10)
– AF_LOCAL : 로컬 호스트내 IPC를 위한 UNIX 프로토콜
멤버 : sin_port
• TCP & UDP의 포트번호(16비트) 영역에 해당
멤버 : sin_addr
• IP 주소(32비트)를 위한 구조체 멤버
멤버 : sin_zero[8]
• 다른 주소 구조체의 크기를 맞추기 위한 패딩(padding)의 목적으로 두는 공간
주소 구조체 비교
sockaddr vs. sockaddr_in
네트워크용 기본 API
- 바이트 순서 및 주소체계 변환 -
표준 바이트 순서
엔디언(Endian)
다수의 바이트를 구성하는 2진수의 표시 체계에 대한 바이트들의 순서를 나타내는 방식
종류:
• 리틀 엔디언(Little-Endian)*
– 낮은 주소 위치에 LSB부터 저장
– Intel CPU 계열 데이터 처리 방식
• 빅 엔디언(Big-Endian)*
– 낮은 주소 위치에 MSB부터 저장
– Motorola/Sun Sparc CPU 계열 데이터 처리 방식
– 네트워크용 표준 저장 방식
주요 용어:
• MSB(Most Significant Bit, 최대/최상위 유효 비트)* :
– 2진법으로 표시된 수에 대하여 최상위의 숫자를 의미(가장 큰 단위)
– 예: 1101b -> 1101b
• LSB(Least Significant Bit, 최소/최하위 유효 비트)* :
– 2진법으로 표시된 수에 대하여 최하위의 숫자를 의미(가장 작은 단위)
– 예: 1101b -> 1101b
엔디언 값 예
값: 0x12345678 (4바이트 정수)
데이터 표현 방식에 따른 문제점
문제 해결안
Big-Endian 방식을 적용하기로 약속
네트워크 방식 -> Big-Endian
'2-2 > 네트워크 보안' 카테고리의 다른 글
네트워크 보안 9주차 정리 (네트워크용 기본 API) (0) | 2023.10.31 |
---|---|
네트워크 보안 중간고사 힌트 정리 (2) | 2023.10.21 |
네트워크 보안 6주차 정리 (리눅스 명령어) (2) | 2023.10.10 |
네트워크 보안 5주차 정리 (TCP/IP, DNS, ICMP) (0) | 2023.09.30 |
네트워크 보안 4주차 정리 (OSI 계층 모델) (0) | 2023.09.27 |