[01 윈도우 기본 학습]
(1) 윈도우 인증 과정
윈도우 인증 구성 요소
- LSA : 모든 계정의 로그인에 대한 검증 및 시스템 자원(파일 등)에 대한 저근 권한을 검사(로컬 및 원격 로그인 포함)
- SAM : 사용자/그룹 계정 정보에 대한 데이터베이스를 관리, 사용자 로그인 정보와 SAM 파일에 저장된 사용자 패스워드 정보를 비교해 인증 여부를 결정
- SRM : 인증된 사용자에게 SID를 부여하고 이를 기반으로 파일이나 디렉터리에 대한 접근을 허용할지 여부를 결정, 감사 메시지 생성
로컬 인증
- 윈도우 부팅 후 로그인창에서 아이디와 패스워드를 입력하면 LSA 서브 시스템이 인증 정보를 받아 NTLM 모듈에 넘기고 이를 다시 SAM이 받아 로그인 처리
원격(도메인) 인증
- 윈도우 부팅 후 로그인 창에서 아이디와 패스워드를 입력하면 LSA 서브시스템이 인증 정보를 받아 로컬 인증용인지 도메인 인증용인지 확인하고 커버로스 프로토콜을 이용해 "도메인 컨트롤러"에 인증을 요청
- 도메인 컨트롤러는 인증 정보를 확인하여 접속하고자 하는 사용자에게 접근 토큰을 부여하고 해당 권한으로 프로세스를 실행한다.
SAM 파일 접근 통제 설정
- SAM 파일은 사용자와 그룹 계정의 패스워드를 관리하고 LSA를 통한 인증을 제공하는 중요한 파일이므로 적절한 접근 통제가 필요
- 공격자로부터 SAM 파일에 대한 패스워드 공격 시도에 따른 정보 노출의 위험이 있음
- system32-config 보안설정에서 Administrators 및 system 그룹 외에는 SAM 팡리에 대한 접근을 제한해야 함
(2) 윈도우 보안 식별자(SID)
개요
- 윈도우의 각 사용자나 그룹에 부여되는 고유한 식별번호
- 사용자가 로그인을 수행하면 접근 토큰(엑세스 토큰)이 생성되며, 해당 토큰에는 로그인한 사용자와 그 사용자가 속한 모든 작업 그룹들에 관한 보안 식별자(SID) 정보가 담겨있다.
- SAM 파일에 정보가 담겨있다.
SID 구조
- 500: 관리자 식별자
- 501: 게스트 식별자
- 1000 이상: 일반 사용자 식별자
- 윈도우 관리명령 콘솔을 통해 확인 가능
(3) 윈도우 인증 구조
개요
- 윈도우는 "Challenge & Response" 방식의 인증 구조를 사용한다.
- 각 단계별 동작방식은 다음과 같다.
1. 인증 요청
2. Challenge값 생성 및 전송 : 인증 요청을 받은 서버는 특정 규칙 또는 랜덤한 Challenge 값을 생성하여 사용자에게 전달
3. Response값 생성 및 전송 : 사용자는 전달받은 Challenge 값과 사용자 패스워드 정보를 이용해 Response값을 생성하여 서버에 전달
4. Response값 확인 및 인증 성공
인증 암호 알고리즘
- 현재는 NTLMv2 해시 : 윈도우 비스타 이후 윈도우 시스템의 기본 인증 프로토콜, 복잡도가 충분해 크래킹이 어려움
Lan Manager 인증 수준
- Lan Manager은 네트워크를 통한 파일 및 프린터 공유 등과 같은 작업시 인증을 담당하는 서비스이다.
- 이 설정을 통해 네트워크 로그온에 사용할 Challenge/Response 인증 프로토콜을 결정하면 이 설정은 클라이언트가 사용하는 인증 프로토콜 수준, 협상된 세션 보안 수준 및 서버가 사용하는 인증 수준에 영향을 주기 때문에 보안 안전한 인증으르 위해 NTLMv2 사용을 권장한다.
(4) 패스워드 크래킹
사전 공격/사전 대입 공격
- 패스워드로 자주 사용되는 단어, 키보드 일련순, 주민번호, 이름 등을 미리 사전 파일로 만든 후 이를 하나씩 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법
무차별 공격/무작위 대입 공격
- 패스워드에 사용될 수 있는 문자열의 범위를 정하고 그 범위 내에서 생성 가능한 모든 패스워드를 생성하여 이를 하나씩 대입, 패스워드 일치 여부를 확인
- 일반적으로 사전 대입 공격 실패 후 무차별 공격을 진행
혼합 공격
- 사전 대입 공격 + 무작위 대입 공격
레인보우 테이블 공격
- 하나의 패스워드에서 시작해 특정한 변이 함수를 이용해 여러 변이된 형태의 패스워드를 생성한다.
- 각 변이된 패스워드의 해시를 고리처럼 연결하여 일정 수의 패스워드와 해시로 이루어진 체인을 무수히 만들어 놓은 테이블
- 해시 테이블과 R 함수의 반복 수행을 통해 일치하는 해시값을 통해서 패스워드를 찾아내는 방식
[02 UNIX/Linux 기본 학습]
(1) 시스템 기본
시스템 접근
- 로그인 과정
1. 사용자 계정과 패스워드를 입력하면 로그인을 담당하는 프로그램은 입력한 패스워드와 /etc/passwd 파일의 해당 필드를 비교한다.
2. 패스워드 확인 후 로그인 프로그램은 쉘이 사용할 변수들을 근거로 초기 환경을 설정한다.
- HOME 변수 : 사용자의 홈 디렉터리 지정
- SHELL 변수 : 로그인 쉘 지정
- USER 또는 LOGNAME 변수 : 사용자의 사용자 계정(로그인 이름)을 지정
3. 모든 절차가 끝나면 로그인 쉘 실행
4. 로그인 쉘은 일반적으로 /etc/passwd 파일의 마지막 필드에 정의되어 있다. - 로그아웃
- logout이나 exit
사용자 정보
- /etc/passwd 파일
- passwd 파일은 UNIX 시스템을 이용하는데 필요한 기본 정보들이 담겨 있다. 구분자 : 를 이용하여 7개의 필드로 구분된다.
- 형식
[user_account]:[user_password]:[user_ID]:[group_ID]:[comment]:[home_directory]:[login_shell]
- 해킹 시 주로 3, 4번 필드를 0으로 변경한다. 윈도우의 보안식별자 500번이 관리자 계정인 것과 같은 개념이다.
- 7번 로그인 쉘을 변경하여 사용자가 로그인시 악성 쉘이 실행되게 하는 경우도 있으므로 주기적으로 변경 여부를 확인해야 한다.
- 사용자 확인 : 접속중인 사용자 확인하려면 id 명령어 사용
- 패스워드 변경
- 사용하던 패스워드 변경하거나 부여하려면 passwd 명령어 사용
- 슈퍼 유저는 자신을 포함한 시스템의 모든 사용자들의 패스워드를 변경할 수 있음
그룹 정보
- 그룹명과 그룹 ID
- 기본 그룹과 보조 그룹
- 유닉스 시스템은 자원의 소유주가 소속된 그룹에 별도의 접근권할ㄴ을 지정할 수 있다. 같은 그룹에 소속된 사용자는 자원에 대하여 같은 접근권한을 갖는다.
- 사용자 계정은 하나의 기본 그룹과 복수의 보조 그룹에 소속될 수 있다.
- 기본 그룹은 사용자가 자원(파일 등) 생성 시 해당 자원의 소유그룹을 지정하는데 사용되며 /etc/passwd 파일의 4번째 필드에 명시한다. - /etc/group 파일
- /etc/group 파일은 현재 시스템에 정의되어 있는 모든 그룹의 정보를 저장하고 있다. 즉 /etc/passwd 파일에 담긴 GID의 정보는 /etc/group 파일에 정의된다.
- 형식
[group_name]:[unvarible]:[group_ID]:[user_account_entry_in_group]
입출력 재지정
- 입출력 대상으로 표준 입력, 표준 출력, 표준 에러를 사용하지 않고 다른 경로인 파일로 재지정하는 것을 말한다.
- 표준 입력을 파일에서 받도록 대체하는 것을 입력 재지정이라고 하고
- 명령의 실행 결과나 에러 상황을 화면에 출력하지 않고 파일로 대체하는 것을 출력 재지정이라 한다.
- 1 : 표준 출력, 2 : 표준 에러, 미지정시 표준 출력
- > : 출력 파일 존재 시 새롭게 출력한다, >> : 출력 파일 존재 시 추가하여 출력한다.
파이프
- 둘 이상의 명령을 함께 묶어 출력의 결과를 다른 프로그램의 입력으로 전환하는 기능
- | 기호 사용, 선행 명령의 출력 데이터가 후행 명령의 입력 데이터로 전달됨
특수 문자
- 쉘 명령에서 일부 문자들은 사전에 정의된 특별한 기능이 있다.
- $ : 쉘 변수
& : 백그라운드 작업
* : 문자열 와일드카드
? : 한 문자 와일드카드
; : 쉘 명령 구분자
(2) 파일시스템 응용
파일시스템 개요
- 개요
- 물리적인 저장장치에 파일을 생성, 저장, 관리하기 위한 논리적인 자료구조를 파일시스템이라고 함
- 물리적인 디스크는 논리적인 파티션으로 나눠지며, 각 파티션별로 고유한 파일시스템을 생성함
- ex) NTFS, EXT2, EXT3, EXT4 - 파일시스템 구성
- 부트 블럭 : 운영체제를 부팅하거나 초기화하기 위한 부트스트랩 코드를 담고 있는 블럭
- 슈퍼 블럭 : 해당 파일시스템을 관리하기 위한 정보를 담고 있는 블럭
- 아이노드(inode) 리스트
1. inode number, 파일타입, 접근권한, link count, 소유자, 소유그룹, 파일크기, MAC Time, Block index로 구성됨
2. 주의할 점은 inode에는 파일명이 없으며 파일명은 디렉터리를 통해 관리
3. 침해사고가 발생하게 되면 피해 시스템 파일에 대한 무결성 확인을 위한 타임라인 분석을 수행한다. 이 때 파일시스템 inode 구조체의 MAC Time을 점검한다.
4. 특정 파일의 inode에 대한 속성정보는 stat 명령어를 통해 확인할 수 있다.
- Data blocks : 실제 파일의 내용이 저장되는 블럭, 고정 크기의 block들로 이루어져 있다.
파일시스템과 링크파일
- 개요
- 링크는 윈도우의 바로가기 아이콘처럼 기존 파일에 대한 또 다른 접근 포인트를 만들어주는 기능이다.
- 링크는 하드 링크와 심볼릭 링크로 구분할 수 있다.
- 입력 문법 : ln (-s) source_file / source_directory target_file
- -s 옵션이 있으면 심볼릭 링크를, 없으면 하드 링크를 만든다.
- 하드 링크는 파일에만 링크하고, 심볼릭 링크는 파일 또는 디렉터리에 링크할 수 있다. - 하드 링크
- 하드 링크는 유닉스 초기시절부터 지원해주던 방식으로 기존파일과 동일한 inode number를 가지는 파일을 생성하여 접근하는 방식을 말한다.
- inode number는 파일시스템별로 고유한 값이기 때문에 동일 파일시스템 내에서만 하드 링크가 가능하고 디렉터리는 하드링크가 불가능하다.
- 하드링크 파일을 생성하면 해당 inode의 링크 카운트가 1 증가한다. 파일 삭제 시에는 링크 카운트를 1 감소시킨 후 그 값이 0이 되었을 때 해당 파일의 inode 정보 및 데이터가 삭제된다. 즉 inode를 참조하는 파일이 있으면 삭제하지 않는다.
- 명령어 : ln 하드링크당하는파일명 하드링크해서만들파일명 - 심볼릭 링크
- 동일 파일시스템 내에서만 링크가 가능한 하드링크의 단점을 보완
- 원본 파일에 대한 파일 경로를 파일 내용으로 하는 새로운 파일을 생성해서 접근하는 방식으로 하드 링크와 달리 inode number가 아린 파일 경로를 기반으로 하므로 파일시스템에 제한이 없고 디렉터리도 가능하다.
- 원본 파일이 삭제되거나 이동하게 되면 해당 경로가 바뀌게 되므로 심볼릭 링크 파일은 끊어지게 된다.
- 명령어 : ln -s 심볼릭링크당하는파일명 심볼릭링크해서만들파일명
디렉터리 관리
- 파일의 종류
- 일반 파일 : 일반적으로 데이터 또는 프로그램 코드에 해당하는 일련의 바이트 스트림으로 되어 있다. 이러한 정규 파일은 표준 파일 입출력 시스템 호출을 통해 참조된다.
- 디렉터리 : 디렉터리에 포함된 파일명, 해당 파일에 대한 정보를 담고 있는 inode number 목록을 내용으로 가지고 있는 특수한 파일로 디렉터리 파일은 디렉터리의 명시적인 시스템 호출(ls 명령어)을 통해서 참조된다.
- 특수 파일 : 특수파일은 기능에 따라 다양한 형태로 존재하며 표준 입출력 시스템 호출을 통해 참조된다.
- 프로세스 간 통신을 위해 파이프, 소켓 등의 파일을 사용한다.
- 디스크, 프린터, 터미널, 키보드 등의 주변장치를 사용하기 위한 장치파일로 블럭 단위로 입출력하는 블럭 장치파일(버퍼링)과 문자 단위로 입출력하는 문자 장치 파일(비 버퍼링)으로 구분한다. - 디렉터리 내용 출력(ls)
- 특정 디렉터리에 있는 디렉터리와 파일 목록을 보여주고 추가 옵션으로 이들에 관한 여러가지 정보도 알 수 있다.
- 디렉터리에는 파일명과 해당 파일의 inode number에 대한 매핑 정보만을 가지고 있으며 ls 명령의 추가 옵션을 통해 해당 파일에 대한 상세 내역을 볼 수 있는 것은 해당 inode number를 통해 indoe 구조체 정보를 참조하기 때문이다.
- 접근 권한 : 권한 부여의 대상을 다음 세 종류로 구분한다.
- user : 소유자의 권한
- group : 소유그룹의 권한
- others : 기타 사용자의 권한
- 접근권한의 종류
- r(4) : 파일에 대한 읽기 권한과 디렉터리 내에 있는 파일명을 읽을 수 있는 권한
- w(2) : 파일에 대한 쓰기 권한과 디렉터리 내에 파일을 생성하거나 삭제할 수 있는 권한
- x(1) : 파일에 대한 실행 권한과 디렉터리 내에서 탐색을 위해 이동할 수 있는 권한
- - : r, w, x에 대한 권한이 없는 경우 해당 자리를 대체
- 파일과 디렉터리를 생성할 때, 일반 파일의 경우 기본 접근권한으로 666(rw_rw_rw_)을, 디렉터리의 경우 기본 접근권한으로 777(rwxrwxrwx)을 설정한다.
- 다만 umask로 지정한 권한만큼 기본 접근권한에서 제거한 권한이 최종 접근권한이 된다. umask 값은 파일 생성 시 제거해야 할 접근권한을 명시하는 기능이다. - 디렉터리 간의 이동(cd)
- 절대 경로명 : 루트 디렉터리를 기준으로 기술, /home/algisa/work
- 상대 경로명 : 현재 디렉터리를 기준으로 기술, ./work - 파일 권한 관리
- 접근권한 변경(chmod)
1. -R 옵션 : 하위 디렉터리와 파일의 권한까지 변경한다.
2. 접근 권한을 기호로 기술하는 방법
- 대상 : u(user), g(group), o(others), a(all)
- 연산자 : +, -, =
- 접근권한 : r, w, x
- 예시 : chmod go-w daemon.c : daemon.c의 group, others에 w 권한 제거
3. 접근 권한을 숫자로 기술하는 방법
- 세 개의 8진수로 기술
- r : 4, w : 2, x : 1
- 예시 : chmod 664 daemon.c : user, group에 rw 권한, others에 r 권한 - 접근권한 마스크(umask)
- umask는 앞으로 만들어질 파일에 영향을 미치는 명령으로, 명령 시 지정한 8진수는 새로 만들어질 파일에서 제거될 권한을 명시함
- 일반 파일을 생성할 때 접근권한은 666에서 umask로 지정한 값을 빼고 디렉터리의 경우 777에서 umask로 지정한 권한을 빼게 된다.
- 시스템 관리자는 /etc/profilel 파일에 umask를 지정하여 시스템 전체 사용자에게 획일적인 umask 값을 적용시킬 수 있다. 보통 022를 많이 사용한다. - 파일 검색(find)
- find 명령은 시스템 내에 있는 파일 중에서 사용자가 원하는 파일을 찾을 때 사용한다. 단순히 찾아줄 뿐만 아니라 찾은 파일에 특정 명령을 실행하도록 명령할 수 있어 편리하다.
- 이 명령을 사용할 대 지정하는 검색경로는 파일의 최상위 디렉터리인 루트 디렉터리부터 시작하는 절대 경로나 현재 디렉터리로 표시하는 상대 경로를 많이 이용한다.
- 주요 옵션 실습
1. 접근 권한 관련 실습
- -perm 4000이면 setuid만 설정되어 있는 파일을 검색하고, -4000 이면 setuid를 포함하는 파일을 검색한다.
- -exec 옵션을 통해 검색 결과 파일에 대한 추가적인 명령을 실행할 수 있다. {}의 의미는 검색 결과 파일들을 다음 명령의 인자로 전달하기 위한 기호이고 \;는 명령어의 끝을 의미한다.
- 검색조건이 둘 이상일 경우 -o -a 의 논리 연산 및 ()를 추가하여 우선순위를 지정할 수 있다.
(3) 프로세스 응용
프로세스 개요
- 개요
- 프로세스가 생성되면 커널/운영체제는 개별 프로세스별로 관리정보를 담고 있는 프로세스 제어블럭을 생성한다.
- 프로세스 상태 : 프로세스의 현재 상태정보를 저장
- 프로세스 번호 : 프로세스를 식별하기 위한 번호
- 프로그램 카운터 : 문맥교환이 발생할 경우 다음에 실행할 명령어의 위치값을 저장
- 레지스터 : 문맥교환이 발생할 경우 현재 프로세스의 실행 상태정보를 저장
- 메모리 정보 : 프로세스가 사용하는 메모리 page 또는 segment 테이블 정보
- 프로세스가 생성되면 개별 프로세스별로 오픈한 파일을 관리하기 위한 파일 디스크립터 테이블이 생성된다.
1. 기본적으로 3개의 파일이 자동 오픈된다. 표준입력은 표준입력장치로부터의 입력을 의미하고, 표준출력은 표준출력장치로의 출력을 의미하고, 표준에러는 오류 발생시 출력을 의미한다.
2. 프로세스 내에서 오픈한 각각의 파일을 식별하기 위한 양의 정수값을 파일 디스크립터라고 한다.
3. 커널/운영체제가 시스템 내에서 여러 프로세스들에 의해 오픈된 파일들을 관리하기 위한 자료구조가 system open-file tables이다.
- open_mode : 파일의 읽기/쓰기 모드
- offset : 현재 파일 I/O를 수행하기 위한 위치값
- reference_count : 해당 파일의 참조 개수를 의미한다. 파일 복제가 발생하게 되면 증가한다.
4. Active vnode table은 해당 파일의 inode 정보를 가지고 있는 일종의 캐시역할을 수행한다. 다양한 파일시스템의 inode 정보를 관리하기 위한 중계자 역할을 수행한다. - 프로세스 기본 조건
1. 프로세스 테스트 코드
- fork() 함수는 자식 프로세스를 생성하는 시스템 함수로 반환 값을 통해 부모 프로세스의 수행코드와 자식 프로세스의 수행 코드를 식별할 수 있다.
- 부모 프로세스와 자식 프로세스는 pid, ppid를 각각 출력하고 1000초동안 대기한다.
2. 모든 프로세스는 부모 프로세스를 가진다.
- 시스템 부팅을 담당하는 boot 프로세스(0번 프로세스)를 제외한 모든 프로세스는 부모 프로세스를 가진다.
- 자식 프로세스가 살아있는 상태에서 부모 프로세스가 종료하게 되면 자식 프로세스는 고아 프로세스가 되며, 이 경우 대리모 프로세스(pid가 1인 init process)가 부모 역할을 수행한다.
3. 프로세스 종료 시에는 자신의 종료상태정보를 부모 프로세스에 반환해야 정상적으로 소멸할 수 있다.
- 프로세스 수행을 종료했지만 부모 프로세스가 종료상태정보를 확인하지 않아서 소멸하지 않고 남아있는 상태의 프로세스를 좀비 프로세스라 한다. 시스템/커널 입장에서 프로세스는 한정된 자원이므로 좀비 프로세스가 과도하게 많아지면 더이상 프로세스를 생성하지 못하는 문제가 발생할 수 있다.
- ps -l 명령어를 사용했을 때 상태정보가 Z로 표시되면 좀비 프로세스라는 뜻, S는 sleep(대기)상태이고 R은 run(실행중)인 상태이다.
- WCHAN 필드는 Sleeping 상태의 프로세스가 대기하는 커널 함수명이다. 예를 들어 좀비 프로세스가 된 프로세스의 마지막 수행 함수는 exit인 걸 보면 종료가 정상적으로 되지 못하고 좀비 프로세스가 된 것을 알 수 있다.
- 지속적으로 좀비 상태가 나타난다면 이는 대부분 부모 프로세스의 프로그램 오류, 즉 적절한 시그널 처리를 해주지 않았거나 커널 오류에 의한 비정상적인 상태일 확률이 매우 높다.
- 좀비 프로세스는 kill 명령어를 통해서도 소멸되지 않는다. 프로세스의 실행은 종료했기 때문에 프로세스의 실행 이미지 정보는 없으며 커널에 관리 정보만 남아있기 때문이다. 다수의 좀비 프로세스가 생성되어 있다면 시스템 리부팅을 통해 커널 정보를 초기화하는 방법으로 제거할 수 있다. 물론 근본적인 해결책은 문제의 원인(부모 프로세스 또는 커널)을 해결하는 것이다. - 프로그램 실행 과정
1. 프로세스 생성과 동시에 프로세스 그룹도 생성된다.
- 프로세스 그룹은 커널이 터미널 제어권을 관리하기 위한 목적으로 사용하는 프로세스들의 집합으로 쉘에서 실행된 프로세스와 그 자식 프로세스들이 하나의 프로세스 그룹으로 관리된다.
- 터미널 제어권이란 터미널로부터 입력되는 데이터와 터미널로부터 발생하는 시그널에 대한 제어권으로 프로세스 그룹 단위로 제어권이 부여된다.
- 커널이 프로세스 그룹을 식별하기 위한 식별자로 PGID를 부여하며, PGID는 별도로 부여하는 식별자가 아니고 해당 그룹의 리더 프로세스(쉘로부터 실행된 프로세스)의 PID를 PGID로 설정한다.
2. Foreground Mode와 Background Mode
- 터미널에 대한 제어권을 가지고 동작하는 모드를 포그라운드 모드라고 하며, 제어권을 가지고 있는 프로세스 그룹을 포그라운드 프로세스 그룹이라 한다.
- 터미널에 대한 제어권 없이 동작하는 모드를 백그라운드 모드라고 하며, 제어권이 없는 프로세스 그룹을 백그라운드 프로세스 그룹이라 한다.
- 터미널과 연결되어 세션이 생성되면, 해당 세션 내에서는 하나의 포그라운드 프로세스 그룹과 하나 이상의 백그라운드 프로세스 그룹이 생성된다. - 프로세스 정보 확인
- ps 명령은 시스템에 상주하는 프로세스 정보를 알려준다.
- ps -ef 이 가장 많이 사용된다, 모든 프로세스를 보여줌 - 프로세스 간 통신(시그널)
1. 유닉스 시스템은 다양한 종류의 프로세스 간 통신방법을 지원한다.
2. 그중에서 시그널은 유닉스 시스템에서 지원하는 소프트웨어 인터럽트이다. 이를 이용하여 프로세스는 다른 프로세스에게 이벤트를 전달할 수 있으며, 전달된 이벤트를 프로세스 간 통신수단으로 사용할 수 있다.
3. 시그널이 발생하는 경우는 외부에 의해서, 에러에 의해서, 이벤트에 의해서, 인위적으로 이렇게 네 가지이다.
4. 문법은 kill을 사용하고 뒤에 나오는 옵션 번호에 따라 발생하는 시그널이 달라진다.
'공부 > 정보보안기사 실기' 카테고리의 다른 글
[Section 02] UNIX/Linux 서버 취약점 (116 ~ 125pg) (0) | 2022.04.14 |
---|---|
[Section 01] 시스템 기본 학습 (104 ~ 115pg) (0) | 2022.04.13 |
[Section 01] 시스템 기본 학습 (86 ~ 103pg) (0) | 2022.04.12 |
[Section 01] 시스템 기본 학습 (62 ~ 85pg) (0) | 2022.04.11 |
[Section 01] 시스템 기본 학습 (53 ~ 61pg) (0) | 2022.04.10 |