시스템 해킹을 위한 기초 지식 모두 닫기

단일 사용자 운영체제 구성 모델

일반 PC는 단일 사용자 운영체제 구성 모델, 즉 사용자 명령 인터페이스(User Command Interface)를 기반으로 하는 메모리 관리자, 프로세서 관리자, 장치 관리자, 파일 관리자의 4가지 서브 시스템 관리자로 구성됩니다(네트워크 지원 운영체제에는 네트워크 관리자 추가)

그림 1-1-1단일 사용자 운영체제 구성 모델

윈도우 시스템의 구조

그림 1-2-1윈도우 시스템의 구조

HAL(Hardware Abstraction Layer)
드라이버 개발자와 하드웨어 개발자가 따라야 하는 윈도우에서 제시한 기본 표준이다. 하드웨어와 개발된 소프트웨어 간의 원활한 통신을 도와주는 번역자 역할을 합니다.
마이크로 커널(Micro Kernel)
하드웨어와의 통신만을 제어하는 커널이며, Winnt/system32 폴더의 ntoskrnl.exe 파일이 해당 역할을 합니다.
입출력 관리자(I/O Manager)
시스템의 입출력을 제어합니다. 즉 장치 드라이버 사이에서 메시지를 전달합니다.
객체 관리자(Object Manager)
파일, 포트, 프로세스, 스레드 등의 객체에 대한 정보를 제공합니다.
보안 참조 관리자(Security Reference Monitor)
각 데이터나 시스템 자원의 제어를 허가하거나 거부함으로써 강제적으로 시스템의 보안 설정을 책임진다.
프로세스 관리자(Process Manager)
스레드를 생성하고 요청에 따라서 처리합니다. 또한 각 프로세스가 서로의 메모리 공간을 침범하지 못하게 합니다.
로컬 프로시저 호출(Local Procedure Call) 관리자
프로세스 간 통신이 필요한 경우에 이를 처리해준다.
가상 메모리 관리자(Virtual Memory Manager)
응용 프로그램의 요청에 따라 RAM의 메모리를 할당하고, 가상 메모리의 페이징(paging)을 제어합니다.
Win32 서브 시스템
윈도우 서버 2000의 기본적인 서브 시스템으로 32비트 응용 프로그램이 동작할 수 있게 도와주며 기본적인 윈도우의 사용자 인터페이스를 제공합니다.
POSIX
보안 서브 시스템과 유닉스 운영체제에 기반을 두는 일련의 표준 운영체제 인터페이스입니다. 보안 서브 시스템은 사용자가 로그인할 때 데이터를 보호하고, 운영체제가 이를 제어할 수 있도록 만든 서브 시스템입니다.

윈도우 파일 시스템 종류

FAT
FAT 이용 시 하나의 파티션의 최대 크기는 2GB입니다. FAT는 기본적으로 16비트 크기의 테이블을 가지고 있으며, 하나의 클러스터는 32KB입니다.
FAT32
FAT32는 총 32비트(2 32) 개수만큼 클러스터를 가질 수 있으며, 호환성이 좋은 편이라 리눅스나 다른 운영체제에 정보를 옮길 때 유용하게 쓰입니다.
NTFS
NTFS는 개별적인 폴더와 파일에 대해 사용 권한을 설정할 수 있고, 각 파일과 폴더에 해당 계정만 접근하여 읽을 수 있게 암호화할 수도 있습니다. 폴더를 암호화하면 폴더 안에 있는 모든 파일은 암호화됩니다. 추가로 감사(auditing) 기능이 있습니다.

윈도우 부팅 순서

  1. POST(Power On Self Test) 실행 : 하드웨어 스스로 시스템에 문제가 없는지 기본 사항을 검사하는 과정이다. BIOS(Basic Input/Output System)가 POST를 실행합니다.

  2. 기본 부팅 관련 설정사항 로드 : CMOS(Complementary Metal-Oxide Semiconductor)에 설정된 시스템 설정사항 및 부팅과 관련된 여러 정보를 읽어 시스템에 적용합니다.

  3. MBR(Master Boot Record, 마스터 부트 레코드) 로드 : MBR에 부팅 메체에 대한 기본 파일 시스템 정보가 들어 있습니다.

    • 윈도우 XP, 서버 2000/2003

      NTLDR(NT Loader) 실행 : NTLDR은 하드 디스크의 부팅 파티션에 있는 프로그램으로 윈도우 서버 2000이 부팅될 수 있도록 간단한 파일 시스템을 실행하며, boot.ini 파일의 내용을 읽어 가능한 부팅 옵션을 보여줍니다.

    • 윈도우 비스타, 2008, 7

      윈도우 부트 서브 시스템(Window Boot Manager) 실행 : 부트 설정 데이터(BCD, boot configuration Data)를 읽어 실행 가능한 운영체제의 목록을 보여주며, bcdedit.exe를 이용해 편집이 가능합니다.

    • 윈도우 2000, XP, 2003

      NTDETECT.com 실행 : NTDETECT는 NTLDR에서 제어권을 위임받아 시스템에 설치된 하드웨어를 검사합니다.

    • 윈도우 비스타, 2008, 7

      윈도우 OS 로더(Winload.exe) 실행 : Winload는 NTDETECT와 같이 각종 장치 드라이버를 로드하고, ntoskrnl.exe를 실행합니다.

    • 윈도우 2000, XP, 2003

      ntoskrnl.exe(NT OS Kernel) 실행 : ntoskrnl은 HAL.DLL(Hardware Abstraction Layer)를 로드한다. 커널 로드, 초기화, 서비스 로드, 서브 시스템의 시작 단계를 거칩니다.

유닉스 시스템의 디렉터리별 역할

디렉터리 내용
/bin

기본적으로 실행 가능한 파일을 담고 있습니다.

echo, mv, coppy, pwd, who 등

/etc

시스템의 환경 설정 및 주요 설정 파일을 담고 있습니다.

passwd, hosts, xined.conf 등

/tmp

프로그램 실행 및 설치 시 생성되는 임시 파일을 담고 있습니다.

이 디렉터리에 파일을 저장하면 재부팅 시 임의로 삭제될 수 있습니다.

/lib

기본 프로그램의 모듈을 담고 있습니다.

/boot

커널을 위한 프로그램 파일을 담고 있으며, 부팅할 때 읽혀 수행됩니다.

/dev

프린터나 터미널 같은 물리적인 장치를 다루기 위한 특수 파일을 담고 있습니다.

/home

각 사용자의 작업 디렉터리를 담고 있습니다.

각 계정으로 로그인할 때 이 디렉터리 밑에 자신의 작업 디렉터리가 시작 디렉터리가 된다.

/usr

사용자가 직접 쓰는 파일을 담고 있다.

다른 디렉터리에 있는 파일이 똑같이 위치하고 있는 것이 많은데, 이는 링크되어 있는 것입니다.

/usr/lib

C언어나 포트란의 라이브러리를 담고 있습니다.

/usr/include

C언어에 사용되는 헤더 파일을 담고 있습니다.

리눅스/유닉스 부팅순서

  1. POST(Power On Self Test) 수행

  2. 기본 부팅 관련 설정사항 로드

  3. MBR(Master Boot Record, 마스터 부트 레코드) 로드

  4. 부트 로더(Boot Loader) 실행

  5. 실행 레벨에 따른 서비스 실행

80x86 시스템 CPU의 구조

그림 2-1-180x86 시스템 CPU의 구조

연산 장치(ALU)
CPU의 핵심으로, 산술 및 논리 연산을 수행하는 연산 회로 집합으로 구성
제어 장치(Control Unit)
입력, 출력, 기억, 연산 장치를 제어하고 감시하며, 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시

레지스트의 종류와 용도

범주 80386 레지스터 이름 비트 용도
범용 레지스터(General Register) EAX 누산기(Accmulator) 32 주로 산술 연산에 사용(함수의 결과 값 저장)
EBX 베이스 레지스터(Base Register) 32 특정 주소 저장(주소 지정을 확대하기 위한 인덱스로 사용)
ECX 카운트 레지스터(Count Register) 32 반복적으로 실행되는 특정 명령에 사용(루프의 반복 횟수나 좌우 방향 시프트 비트 수 기억)
EDX 데이터 레지스터(Data Register) 32 일반 자료 저장(입출력 동작에 사용)
세그먼트 레지스터(Segment Register) CS 코드 세그먼트 레지스터(Code Segment Register) 16 실행될 기계 명령어가 저장된 메모리 주소 지정
DS 데이터 세그먼트 레지스터(Data Segment Register) 16 프로그램에서 정의된 데이터 상수, 작업 영역의 메모리 주소 지정
SS 스택 세그먼트 레지스터(Stack Segment Register) 16 프로그램이 임시로 저장할 필요가 있거나 사용자의 피호출 서브 루틴(called subroutine)이 사용할 데이터와 주소 포함
ES, FS, GS 엑스트라 세그먼트 레지스터(Extra Segment Register) 16 문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터
포인트 레지스터(Point Register) EBP 베이스 포인터(Base Pointer) 32 SS 레지스터와 함께 사용되어 스택 내의 변수값을 읽는 데 사용
ESP 스택 포인터(Stack Pointer) 32 SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가리킴
EIP 명령 포인터(Instruction Pointer) 32 다음 명령어의 오프셋(Offset, 상대 위치 주소)을 저장하며 CS 레지스터와 합쳐져 다음에 수행될 명령의 주소 형성
인덱스 레지스터(Index Regster) EDI 목적지 인덱스(Destination Index) 32 목적지 주소에 대한 값 저장
ESI 출발지 인덱스(Source Index) 32 출발지 주소에 대한 값 저장
플래그 레지스터 EFLAGS 플래그 레지스터(Flag Regster) 32 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장

메모리의 기본 구조

그림 2-3-1메모리의 기본 구조

스택(Stack)
함수가 호출될 때 함수 내 로컬 변수 등이 저장되는 곳. 함수가 실행되는 동안만 존재하며 함수의 실행이 종료되면 해당 변수들도 사라짐
힙(Heap)
프로그램이 실행될 때까지 알 수 없는 가변적인 양의 데이터를 저장하기 위해 프로그램의 프로세스가 사용할 수 있도록 미리 예약되어 있는 메인 메모리으 ㅣ영역, 프로그램들에 의해 할당되었다가 회수되는 작용이 되풀이 되는 영역
데이터 세그먼트(Data Segment)
초기화된 데이터 세그먼트(Initalized data segment)라고도 불리며, 초기화된 외부 변수나 stctic 변수 등이 저장되는 영역
BSS 세그먼트(BSS Segment)
초기화되지 않은 데이터 세그먼트(UnInitalized data segment)라고도 불리며, 프로그램이 실행될 때, 0이나 NULL 포인터로 초기화되는 영역
텍스트 세그먼트(Text Segment)
CPU에 의해 실행되는 머신 코드가 있는 영역

메모리 접근 모드

실제 모드(Real Mode)
x86 계열로 처음 등장한 8086 CPU에서 사용되던 동작 모드, 20비트 주소 버스를 사용하여 총 1MB(2 20 = 1,048,567)의 메모리를 사용할 수 있음

그림 2-4-1메모리 접근 모드

보호 모드(Protected Mode)
세그먼테이션(Segmentation)과 페이징(Paging)을 이용해 메모리를 관리

그림 2-4-2

세그먼트 레지스터별 기본 오프셋 레지스터

세그먼트 레지스터 오프셋 레지스터
CS SIP
DS SI, DI, BX
SS SP, BP
ES SI, DI, BX

어셈블리어의 구조

어셈블리어의 데이터 타입

바이트(Byte)
1바이트(8비트) 데이터 항목
워드(Word)
2바이트(16비트) 데이터 항목
더블워드(Doubleword)
4바이트(32비트) 데이터 항목

리틀 엔디언 방식

데이터는 리틀 엔디언 방식 의해 스택에 저장되고 참조된다. 리틀 엔디언 방식은 2개의 번지로 나누어 저장해야 하는 16비트 데이터(워드)의 경우, 하위 바이트는 하위 번지에 상위 바이트는 상위 번지에 저장

어셈블리어의 주소 지정 방식

레지스터 주소 지정(Register Addressing)
레지스터의 주소 값을 직접 지정하여 복사하는 방식으로 처리 속도가 가장 빠름
직접 메모리 주소 지정(Direct Addressing)
가장 일반적인 주소 지정 방식으로 보통 피연산자 하나는 메모리 위치 참조하고 다른 하나는 레지스터를 참조
레지스터 간접 주소 지정(Register Indirect Addressing)
직접 메모리 주소 방식처럼 '세그멘트: 오프셋' 형식을 사용하는 것과 같음. 단지 세그멘트를 명시적으로 적어주지 않고, 레지스터만 표시
인덱스 주소 지정(Indexed Addressing)
레지스터 간접 지정 방식에 변위가 더해진 메모리 주소 지정 방식
베이스 인덱스 주소 지정(Base Index Addressing)
실제 주소를 생성하기 위해 베이스 레지스터(BX 또는 BP)와 인덱스 레지스터(DI 또는 SI)를 결합하여 표현
변위를 갖는 베이스 인덱스 주소 지정(Based Indexd plus Displacement Addressing)
베이스-인덱스의 변형으로 실제 주소를 생성하기 위해서 베이스 레지스터, 인덱스 레지스터, 변위를 결합하여 표현

어셈블리어 기본 명령

산술 연산 명령(Arithmetic Instruction)
메모리나 범용 레지스터에 위치한 바이트, 워드, 더블워드 정수에 대해 기본적인 정수 계산
데이터 전송 명령(Data Transfer Instruction)
메모리와 범용 레지스터, 세그먼트 레지스터로 참조되는 주소에 존재하는 데이터 전송
논리 명령(Logical Instruction)
연산 부호가 논리 연산을 지정하는 명령, 자리 옮김, 논리합(OR), 논리곱(AND), 기호 변환 등이 있음
스트링 명령(String Manipulation Instruction)
바이트로 구성된 스트링(strings of bytes)을 메모리 내에서 전송
제어 전송 명령(Control Transfer Instruction)
점프(분기, Jump), 조건 점프(조건 분기, Conditional jump), 루프(Loop), 호출(Call)과 리턴(Return) 연산 등으로 프로그램의 흐름을 제어
프로세서 제어 명령(Processor Control Instruction)
레지스터의 플래그 값을 세트하거나 클리어

리눅스/유닉스 패스워드/etc/passwd) 파일 구조

??????????????????

1. 사용자 계정

2. 패스워드가 암호화되어 shadow 파일에 저장되어 있음을 나타냄

3. 사용자 번호(UID, User ID)

4. 그룹 번호(GID, Group ID)

5. 사용자의 이름

6. 사용자의 홈 디렉터리 설정

7. 사용자의 셀 정의

리눅스/유닉스 파일 시스템에서 파일 속성

문자 파일 속성
d 디렉터리 파일(Dirctory File)
- 일반 정규 파일(Regular File)
l 링크되어 있는 파일(Symbolic Link File)
c 버퍼에 저장되지 않은 특수 파일(Character File). 예) 터미널
b 버퍼링된 특수 파일(Block File). 예) 디스크 드라이브
s 소켓 기능을 하는 파일(Socket File)
p 파이프 기능을 수행하는 파일(Pipe file)

리눅스/유닉스 파일 시스템 권한 표기법

rwx의 r,w,x는 각각 읽기(Read), 쓰기(Write), 실행하기(eXecution)를 의미

r
4(2진수 100)
w
2(2진수 10)
x
1(2진수 1)

SetUID의 동작

Test 파일이 root 계정 소유며, SetUID 비트가 설정되어 있다면 1, 설정되어 있지 않으면 2와 같이 실행

그림 3-4-1

윈도우 기본 사용자

계정 이름 설명
Administrator 관리자 권한의 계정으로, 사용자가 사용 가능한 계정 중 가장 강력한 권한을 가진다.
SYSTEM 시스템에서 최고 권한을 가진 계정으로 로컬에서 관리자보다 상위 권한을 가진다. 원격 접속이 불가능하며, 사용자가 이 계정을 사용하여 시스템이 로그인할 수 없다.
Guest 매우 제한적인 권한을 가진 계정으로, 기본 설정은 사용 불능이다.

리눅스/유닉스 패스워드/etc/passwd) 파일 구조

그룹 이름 설명
Administrators 도메인 자원이나 로컬 컴퓨터에 대한 모든 권한이 있다.
Account Operators 사용자나 그룹 계정을 관리하는 그룹이다.
Backup Operators 시스템 백업을 위해서 모든 시스템의 파일과 디렉터리에 접근할 수 있다.
Guests 도메인 사용 권한이 제한된 그룹으로 시스템의 설정 변경 권한이 없다.
Print Operators 도메인 프린터에 접근할 수 있다.
Power Users 디렉터리나 네트워크 공유, 공용 프로그램 그룹 생성, 컴퓨터의 시계 설정 권한이 있다.
Replicator 도메인에 있는 파일을 복제할 수 있는 권한을 가지고 있는 그룹이며, 디렉터리 복사 서비스에 이용된다.
Server Operators 도메인의 서버를 관리할 수 있는 권한을 가진 그룹으로 로컬 로그온과 시스템 재시작 및 종료 권한이 있다.
Users 도메인과 로컬 컴퓨터를 일반적으로 사용하는 그룹이다. 개개인에 할당된 사용자 환경을 직접 만들 ㅜ 있지만 설정할 수 있는 항목에는 한계가 있다. 시스템 서비스의 시작 및 종료 권한이 없으며, 디렉터리 공유 설정을 할 수 있다.

SetUID의 동작

??????????????????

1. 해당 시스템이 윈도우 시스템임을 표시

2. 시스템이 도메인 컨트롤러이거나 단독 시스템(Stand alone system)임을 표시

3. 시스템 고유 숫자로, 시스템을 설치할 때 시스템의 특성을 수집하여 생성됨

4. 숫자로 표현되는 각 사용자별 고유한 ID, 관리자(Administator)는 500번, Guest 계정은 501번, 일반 사용자는 1000번 이상

윈도우 권한 흭득 과정

프로세스의 정상 실행 과정

그림 3-4-3

프로세스 권한을 가로챈 경우 실행 과정

그림 3-4-4

시스템 해킹 모두 닫기

크래킹되기 쉬운 패스워드

길이가 너무 짧거나 널(Null)인 패스워드

사전에 나오는 단어나 이름의 조합 패스워드

키보드 자판을 일렬순으로 나열한 패스워드

사용자 계정 정보에서 유추 가능한 단어들로 된 패스워드

크래킹되기 어려운 패스워드

기억하기는 쉽지만 크래킹하기는 어려운 패스워드다. 숫자와 특수문자를 조합하면 아주 훌륭한 패스워드를 만들 수 있다.

해시와 암호화 알고리즘의 차이

해시
임의의 데이터로부터 일종의 짧은 '전자 지문'을 만들어 내는 방법이다. 해시 함수는 데이터를 자르고 치환하거나 위치를 바꾸는 등의 방법을 사용해 결과를 만들어내며, 이 결과를 흔히 해시 값(hash value)이라 한다. 해시 값이 다르면 그 해시 값에 대한 원래 데이터도 달라야 하며, 해시 값으로부터 원래의 데이터를 구하는 것은 불가능해야 한다. MD1~5, SHA 등이 있다.
암호화(Encryption)
특별한 지식을 소유한 사람을 제외하고는 누구나 읽어볼 수 없도록 알고리즘을 이용하여 데이터를 전달하는 것이다. 이러한 과정을 통해 암호화된 정보를 생성한다. 암호화된 정보는 다시 복호화(Decryption)되어 읽을 수 있다. DES, AES(Rijndael), SEED, RSA 등이 있다.

그림 4-3-1

사전 대입 공격(Dictionary Attack)

패스워드로 사용할 만한 것을 사전으로 만들어놓고 이를 하나씩 대입하여 패스워드 일치 여부를 확인하는 패스워드 크래킹 방법이다.

무작위 대입 공격(Brute Force Attack)

패스워드에 사용될 수 있는 문자열의 범위를 정하고, 그 범위 내에서 생성 가능한 모든 패스워드를 생성하여 패스워드로 입력하는 패스워드 크래킹 방법이다.

레인보우 테이블(Rainbow Table)을 이용한 공격

레인보우 테이블은 하나의 패스워드에서 시작해 특정한 변이 함수를 이용해 여러 변이된 형태의 패스워드를 생성한다. 그리고 각 변이된 패스워드의 해시를 고리처럼 연결하여 일정 수의 패스워드와 해시로 이루어진 체인(Chain)을 무수히 만들어 놓은 테이블이다.

윈도우 인증과 구성 요소

LSA(Local Security Authority)
모든 계정의 로그인에 대한 검증을 하고, 시스템 자원 및 파일 등에 대한 접근 권한을 검사한다.
SAM(Security Account Manager)
사용자/그룹 계정 정보에 대한 데이터베이스를 관리한다.
사용자의 로그인 입력 정보와 SAM 데이터베이스 정보를 비교해 인증 여부를 결정하도록 해준다.
SRM(Security Reference Monitor)
사용자의 계정과 패스워드가 일치하는 사용자에게 고유여부를 결정하고 이에 대한 검사 메시지를 생성한다.

윈도우 로컬 인증과 도메인 인증

그림 4-8-1 (a) 윈도우 로컬 인증

그림 4-8-2 (b) 윈도우 원격 인증

Challenge & Response 인증

1. 인증 요청

2. Challenge 값 생성과 3.Challenge 값 전송

4. Response 값 생성

5. Response 값 전송 / 6. Response 값 확인 / 7. 인증 성공

LM(Lan Manager) / NTML / NTML v2 해시

그림 4-10-1 (a) LM(Lan Manager)

그림 4-10-2 (b) 윈도우 로컬 인증 NTML

그림 4-10-3 (c) NTML v2 해시

자격 증명(Cache Credential)

그림 4-11-1 (a) 윈도우 서버 2003까지의 자격 증명

그림 4-11-2 (b)) 윈도우 비스타 이후 자격 증명

리눅스/유닉스 shadow 파일 구조

??????????????????

1. 사용자 계정이다.

2. 암호화된 사용자의 패스워드가 저장된다.

3. 1970년 1월 1일부터 마지막으로 패스워드 변경한 날까지 계산한 값이다.

4. 패스워드 변경하기 전에 패스워드를 사용한 기간이다.

5. 패스워드 바꾸지 않고 최대한 사용할 수 있는 기간이다.

6. 패스워드 최대 사용 기간에 가까워질 경우 사용자에게 미리 그 사실을 알려야 하며, 여기에 패스워드 사용기한 며칠 전에 경고를 보낼 것인지 지정한다.

7. 계정에 대한 사용 제한을 설정하고 며칠 후에 완전히 사용 정지되게 할 것인지를 설정한다.

8. 계정이 완전 사용 정지된 기간을 1970년 1월 1일부터 계산한 값이 기록된다.

9. 관리자가 임의로 사용할 수 잇는 부분이다.

리버스 엔지니어링

흔히 역공학(逆工學)이라고 번역되고, 장치나 시스템의 구조를 분석하여 원리를 발견하는 과정이다.

리버스 엔지니어링 적용 예

1. 이미 만들어진 프로그램의 동작 원리를 이해하고, 유사한 프로그램을 만든다.

2. 프로그램의 보안상 문제, 동작 문제, 오류 등을 이용하거나 제품 출시 전에 그런 문제나 오류등을 제거/검토한다.

3. 바이러스(또는 웜)을 만들거나 백신을 만든다.

PE 파일의 기본 구조

그림 5-3-1

헤더(Header)
DOS 헤더는 DOS와 호환하기 위해 사용되며 크기가 항상 64바이트다. 'MZ' 문자열로 시작하고, DOS 헤더와 e_lfanew 값은 PE 헤더의 주소 값을 가리킨다. DOS stub코드는 'This program cannot be run in DOS mode'와 같이 적절하지 못한 상황에서 PE파일이 실행될 경우 경고문 등에 대한 데이터를 담고 있다.
PE 헤더
PE 헤더는 PE 파일의 구성 정보를 가지고 있다. PE 파일에서는 데이터 특성별로 섹션으로 구분하여 저장한다. PE 파일 헤더에는 해당 PE파일이 가지는 섹션 개수나 파일 속성, 섹션 헤더의 크기를 비롯해 이미지 베이스(Image Base). 엔트리 포인트(Entry Point) 주소, 메모리 상의 각 섹션이 차지하는 크기, 디스크 상에서의 섹션 정렬, PE 파일의 총 크기, 디스크 상 에서의 헤더의 총 크기 등과 같은 정보를 모두 담고 있다.
섹션 테이블
PE파일에는 다음 섹션이 존재한다.

.text : 실행되는 코드를 담고 있는 섹션

.data : 초기화된 전역 변수를 담고 있으며, 읽고 쓰기가 가능한 섹션

.rdata : 읽기 전용의 데이터 섹션, 문자열 표현이나 C++/com 가상 함수 테이블을 담고 있음

.bss : 초기화되지 않은 전역 변수를 위한 섹션

.idata : 다른 DLL으로부터 가져다 쓰는 함수들의 정보를 담고 있는 섹션. IMAGF_IMPORT_DESCRIPTOR의 배열로 이루어져 있으며 하나당 DLL 하나의 정보를 담고 있음

.edata : 다른 모듈이 이 PE 파일에 정의되어 있는 함수를 사용할 수 있도록 함수 목록을 담고 있는 섹션

섹션(Section)
동일한 성질의 데이터가 저장되어 있는 영역이다.

올리 디버거의 기본 사용법

기능 설명
F2 Toggle 브레이크 포인트를 지정한다.
F9 Run 브레이크 포인트까지 실행한다.
Ctrl+F2 Restart 코드 처음 부분으로 돌아간다.
F7 Step into Call 함수나 반복적으로 수행하는 Rep 명령을 만났을 때 함수 내부로 ㅜ적해 들어가거나 Rep 조건을 만족할 때까지 계속 수행한다.
F8 Step over 함수 내부로 추적하지 않고 함수 실행 후 그 다음 코드로 넘어간다. Rep 같은 반복 명령도 한번에 처리하고 다음 코드로 실행이 옮겨진다.
Ctrl + F9 Execute till return API 함수나 추적해 들어갈 필요 없는 함수 내부로 추적해 들어갔을 때 해당 함수의 ret 명령 지점까지 한번에 실행하고 함수를 나온다.
Alt + K Call Stack 현재 호출된 함수 목록을 보여준다.

리버스 엔지니어링 공격

리버스 엔지니어링 공격은 로직을 파악하여 해당 로직을 이용할 수 있고 특정 로직을 우회하도록 프로그램을 변경함으로써 이뤄진다.

리버스 엔지니어링에 대한 대응책

패킹(Packing)
패킹은 원본 프로그램을 새로운 PE 파일에 패킹된 형태로 압축하고 암호화하여 저장하는 기술이다. 패킹된 프로그램을 프로그램이 정상적으로 실행될 수 있도록 복호화하고 압축을 풀어내는 로직도 포함한다.
안티 디버깅
리버스 엔지니어링 시 사용되는 디버거의 활용을 여러 가지 방법으로 탐지하여 프로그램을 강제 종료한다.
타이밍 체크
프로세스가 디버킹 중일 때 CPU 연산 시간은 정상적으로 실행되었을 때보다 많이 걸린다는 점에서 착안했다. RDTSC(Read Time-Stamp Counter) 명령을 써서 두 구간 사
쓰레기 코드(Garbage Code) 넣기와 코드 치환(Permutation)
코드 사이에 의미가 없는 쓰레기 코드를 넣고 다단계의 점프 문을 섞어 코드를 치환하여 배치하는 방법이다. 리버서로 하여금 해당 코드를 따라가다가 지치게 만든다.

하드 링크(Hard Link)

하드 링크에서는 두 파일이 각각 동일한 수준의 데이터를 가지며, 서로 데이터를 동기화한다.

그림 6-1-1

심볼릭 링크(Symbloic Link)

심볼릭 링크는 하드 링크와는 달리 실제 두 파일을 생성하여 링크하지 않는다. 데이터가 있는 파일은 처음부터 하나뿐이고 심볼릭 링크는 단지 원본 파일 데이터를 가리키는 링크 정보만 가지고 있다. 심볼릭 링크에서 원본 파일과 심볼릭 링크는 원본 파일이 삭제되어도, 원본 파일의 이름과 위치를 기억하고 계속 그 파일을 바라보는 상태로 남는다.

그림 6-2-1

심볼릭 링크와 레이스 컨디션 공격

정상적인 경우 임시 파일에 대한 처리 프로세스

그림 6-2-1

레이스 컨디션 공격이 성공한 뒤 임시파일에 대한 처리 프로세스

그림 6-2-2

임시 파일의 정보에 대한 레이스 컨디션 공격

정상적인 프로그램 실행 과정

그림 6-4-1

레이스 컨디션 공격이 성공한 경우 프로세스

그림 6-4-2

임시 파일을 이용할 때 안전한 파일 열기 과정

if(lstat (filename, &st) != 0)
파일의 링크 상태를 확인한다.
if(!S_ISREG(st.st_mode))
열고자 하는 파일의 사용자 계정을 검사한다.
if(st.st_uid != 0)
열고자 하는 파일의 사용자 계정을 검사한다.
if(st.st_ino != st2.st_ino) || st.st._dev != st2.st_dev)
최초 파일에 대한 정보를 저장하고 있는 st와 파일을 연 후의 st2에 저장된 I-노드 값, 그리고 자치(device)값이 변경되었는지 확인한다.

버퍼 오버플로우 공격

버퍼(Buffer)에 일정 크기 이상의 데이터를 입력하여 프로그램을 공격

스택 버퍼 오버플로우 공격

입력 값을 확인하지 않은 입력 함수에 정상적인 크기보다 큰 입력 값을 입력하여 ret 값을 덮어씌움으로써 임의의 코드를 실행하는 공격

gob의 주요 명령

명령 기능
l(ist) 디버깅하고자 하는 프로그램의 소스 출력
b(reak) 브레이크 포인트 설정
disass 프로그램의 특정 함수에 대한 어셈블리어 코드 출력
r(un) 디버깅하고자 하는 프로그램 실행
p(rint) [변수] 변수 값 출력
info reg 레지스터에 저장된 값 출력
x/16xw [주소값] 해당 주소 값으로부터 16워드(word) 만큼에 해당하는 메모리 값 출력
s(tep) 한 병씩 실행하는데, 함수를 포함하고 있으며 함수 내부로 이동해 실행
n(ext) 한 병씩 실행하는데, 함수를 포함하고 있으면 함수를 완전히 실행하고 다음 행으로 이동
c(ontinue) 현재 위치에서 프로그램의 끝 (또는 브레이크 포인트)까지 실행

Segmentation fault

프로그램의 ret 주소가 변조되면, segmentation fault 오류가 발생함. 이 오류를 통해 ret 주소의 위치를 역으로 확인 가능

힙 버퍼 오버플로우 공격

힙에 저장되는 데이터를 변조하거나, 함수에 대한 포인터 값을 변조함으로써 ret 값을 변조하여 임의의 코드를 실행하기 위한 공격

버퍼 오버플로우 공격에 취약한 함수

strcpy(char *dest, const char*src)

strcat(char *dest, const char *src)

getwd(char *buf)

gets(char *s)

fsacnf(FILE *stream, const char *format, ...)

sacnf(const char *format, ...)

realpath(char *path, char resolved_path[])

sprintf(char *str, const char *format)

Non-Executable 스텍

스텍에서 x(execution) 권한을 제거해 스택에 로드된 공격자의 공격 코드가 실행될 수 없도록 함

rtl(return to libc) 공격

스택에 있는 ret 주소를 실행 가능한 임의의 주소(libc 영역의 주소)로 돌려 원하는 함수를 수행하게 만드는 기법

스택 가드(stack Guard)

컴파일러가 프로그램의 함수 호출(프롤로그) 시 ret 앞의 canary(밀고자) 값을 주입하고, 종료(return, 에필로그) 시 canary 값이 변조되었는지의 여부를 확인하여 버퍼 오버플로우 공격 탐지.

다음 기술을 사용함.

Random canary
프로그램을 실행할 때마다 canary 값을 바꿔 이전에 실행하여 얻은 canary 값을 다시 사용하지 못하게 함
Null canary
공격자가 버퍼 오버플로우 공격 시 Null 문자열은 해당 값의 종료를 의미. Null은 절대로 넣을 수 없음을 이용해 canary에 문자열(0x00000000)을 포함시킴
Terminator canary
대부분의 문자열 함수의 동작이 Null에서 끝나지만 Null에서 끝나지 않는 몇몇 함수의 종료 값을 canary 값으로 사용. 즉 Null, CR, LF, -1등을 조합해서 canary 값을 만듦

스택 쉴드(Stack Shield)

함수 호출(프롤로그) 시 ret를 RET Stack이라는 특수 스택에 저장하고, 함수 종료(에필로그) 시 Global RET Stack에 저장된 ret 값과 스택의 ret값을 비교해 다르면 프로그램을 종료시킴

ASLR(Address Space Layout Randomization)

메모리 공격을 방어하기 위해 주소 공간 배치를 난수화하는 기법. 스택, 힙, 라이브러리 등의 데이터 영역 주소 등을 난수화하여 프로세스의 주소 공간에 배치

주요 포맷 스트링 문자

매개변수 형식
%d 정수형 10진수 상수 (integer)
%f 실수형 상수 (float)
%lf 실수형 상수 (double)
%c 문자 값 (char)
%s 문자 스트링(문자열) ((const)(unsigned) char *)
%u 10진수 양의 정수
%o 8진수 양의 정수
%x 16진수 양의 정수
%n * int (총 바이트 수)
%hn %n의 절반인 2바이트 단위

포맷 스트링의 올바른 사용 예와 잘못된 사용 예

올바른 사용 예 잘못된 사용 예
formatstring.c

#include <stdio.h>

main() {
	char * buffer = "wishfree";
	printf("%s\n", buffer);
}
test1.c

#include <stdio.h>

main() {
	char * buffer = "wishfree\n";
	printf(buffer);
}

포맷 스트링 공격이란?

포맷 스트링 문자를 사용하지 않고 출력 함수를 사용하는 공격으로,
버퍼 오버플로우 공격과 마찬가지로 RET 값을 변조하여 임의의 코드를 실행할 수 있음

포맷 스트링에 취약한 함수

  • fprintf(fp, 서식 문자열, 인자1, ..., 인자N) 함수
  • sprintf(char *str, const char *fmt, ...) 함수
  • snprintf(char *str, size_t count, const char *fmt, ...) 함수

백도어의 종류

  • 로컬 백도어
  • 원격 백도어
  • 패스워크 크래킹 백도어
  • 시스템 설정 변경 백도어
  • 트로이목마 형태의 프로그램
  • 거짓 업그레이드

백도어의 기능

  • 임의의 프로그램을 실행할 수 있다.
  • CD-ROM을 원격에서 열었다 닫을 수 있다.
  • 사용자에게 윈도우 창을 이용해 문자 등을 전달할 수 있다.
  • 마우스의 이동을 통제할 수 있다.
  • 키보드 입력을 통제하거나 가로챌 수 있다.
  • 임의의 프로그램을 종료하거나 시스템을 종료할 수 있다.
  • 사용자가 현재 사용하는 프로그램의 목록을 확인할 수 있다.

특정 데몬에 대한 로그인 시 권한 부여 방식

(430페이지 참고)

그림 9-3-1특정 데몬에 대한 로그인 시 권한 부여 방식

cron 데몬이란?

cron 데몬은 일정 시간이 되면 자체적으로 프로그램을 실행/중지하는 스케줄러(Scheduler)다.

백도어 탐지 방법

  1. 현재 동작 중인 프로세스 확인
  2. 열린 포트 확인
  3. SetUID 파일 검사
  4. 바이러스와 백도어 탐지 툴 이용
  5. 무결성 검사
  6. 로그 분석

운영체제 보안 모두 닫기

계정 관리

패스워드 관리
주기적으로 관리하는 시스템의 패스워드를 크래킹하여 취약한 패스워드를 가진 계정을 체크함
불필요한 계정의 존재 여부 확인
계정의 생성은 문서화하여 기록하고 주기적으로 불필요한 계정을 삭제함
administrator 계정명 변경
윈도우 시스템의 경우 administrator를 쉽게 추측할 수 있으므로 다른 이름의 계정으로 변경

암호 정책

'암호의 복잡성을 만족해야 함', '최소 암호 길이', '최근 암호 기억' 등의 설정사항을 통해

시스템에 설정된 패스워드를 충분히 강한 상태로 유지해야 함.

계정 잠금 정책

잘못된 로그온 시도를 통한 패스워드 노출 등의 위험을 줄이기 위해 '계정 잠금 임계값'은 보통 5회로 설정.

로컬 정책의 '사용자 권한 할당'의 주요 설정 항목

  • 네트워크에서 이 컴퓨터 액세스/거부
  • 로컬 로그온 허용/거부
  • 시스템 종료/원격 시스템에서 강제로 시스템 종료

로컬 정책의 '보안 옵션'의 주요 설정 항목

감사
보안 감사를 로그할 수 없는 경우 시스템 종료
대화형 로그온
마지막 사용자 이름 표시 안 함
로그인 시도하는 사용자에 대한 메시지 제목/텍스트
시스템 종료
로그인하지 않고 시스템 종료 허용
네트워크 보안
LAN Manager 인증 수준
다음 암호 변경 시 LAN Manager 해시 값 저장 안 함
로그온 시간이 만료되면 강제로 로그오프

FTP(File Transfer Protocol) 보안 설정

    세션 설정
    세션은 실제 사용하는 수만큼으로 제한
    로그 정책 설정
    적절한 로그 수준이 유지될 수 있도록 설정
    익명 연결 허용 여부 설정
    서비스의 종류에 따라 다를 수 있으나 가급적 사용하지 않음
    FTP 배너 출력
    경고 문구 등을 출력
    FTP 홈 디렉터리 권한 설정
    불필요한 쓰기 권한 부여 금지
    FTP 서비스 접근 제어 설정
    필요한 경우 접근 제어 설정

SMTP(Simple Mail Transfer Protocol) 보안 설정

  • 배너 그래빙을 통한 운영체제 정보 획득 가능
  • 로그 정책 및 접근 제어 적용 필요

HTTP(HyperText Transfer Protocol) 보안 설정

기본 문서 설정
불필요한 기본 문서 설정사항 삭제
SSL 설정(HTTPS)
필요한 경우 SSL 적용
디렉터리 목록화 금지 설정
로깅 설정
필요에 따라 로그 및 인증 여부 설정
인증 설정

NetBIOS 보안 설정

  • NULL 세션 금지
  • 불필요한 경우 관리자 공유 금지
  • 불필요한 경우 NetBIOS 서비스 금지

MS Terminal Service 보안 설정

  • 환경에 따라 '네트워크 수준 인증' 사용
  • 환경에 따라 암호화 수준 적용
  • 터미널 서비스를 이용한 원격 제어 권한 관리
  • 터미널 서비스로 접속 가능한 네트워크 인터페이스 관리
  • 터미널 서비스 사용자 제한
  • 터미널 서비스 포트 변경

SNMP(Simple Network Management Protocol) 보안 설정

시스템의 많은 정보를 누출할 수 있으므로 불필요한 경우 제거

파일과 디렉터리 권한 설정 규칙

  1. NTFS 접근 권한은 누적된다.
  2. 파일에 대한 접근 권한이 디렉터리에 대한 접근 권한에 우선한다.
  3. '허용'보다 '거부'가 우선한다.

inetd 수퍼 데몬의 동작

(536페이지 참고)

그림 11-1-1inetd 수퍼 데몬의 동작

FTP 보안 설정

사용 계정 제한
ftpuser 파일을 이용해 FTP 사용자 계정 제한
익명 연결 허용 여부
서비스의 종류에 따라 다를 수 있으나 가급적 허용하지 않음

SSH & 텔넷 보안 설정

  • 텔넷의 경우 암호화되지 않은 통신을 제공하며 인증 수준이 낮으므로, SSH를 사용하여 서버의 터미널에 접속
  • root 계정의 직접 접속은 차단

불필요한 경우 차단해야 하는 서비스

    finger(79)
    서버에 현재 로그인 중인 사용자 계정에 대한 정보를 확인 가능
    SUNRPC(Sun Remote Procedure Call protocol, 111)
    여러 가지 버퍼 오버플로우 공격과 포맷 스트링 공격 가능
    Exec(512), Login(513), Shell(514)
    r-command라는 명령어 계열을 위한 포트
    시스템에 대한 많은 제어 가능
    X11 : XDMCP(X Display Manager Control Protocol, 6000)
    원격에서 GUI 환경으로 시스템을 관리하기 위한 프로토콜
    DTSPC(DeskTop SubProcess Control service, 6112)
    원격에서 서버를 관리할 때 프로세서 제어를 위한 데몬
    FONT-Service(7100)
    XDMCP와 같은 서비스에 해당 문자 폰트 제공
    echo(7)
    ping과 비슷한 역할 수행
    discard(9)
    어떤 데이터를 받더라도 그 데이터를 소거하는 역할
    Daytime(13)
    현재의 날짜와 시간을 알려줌
    Chargen(Character generator, 19)
    입력 값과 관계없이 임의로 생성한 문자열을 보냄
    SMTP(Simple Message Transfer Protocol, 25)
    EXPN(Expansion)과 VRFY(Verify) 명령을 통한 계정 정보 습득
    /etc/mail/sendmail.cf 파일의 PrivacyOptions에서 noexpn과 novrfy 추가
    TIME(37)
    Daytime처럼 시간을 알려주는 프로토콜
    TFTP(Trivial File Transfer Protocol, 69)
    인증 과정이 없는 간략화된 FTP
    inetd.conf 파일에서 데몬 실행 시 '-s' 옵션을 주어야 함
    SNMP(Simple Network Management Protocol, 161)
    시스템 정보 유출

TCP Wrapper 설치 시 데몬의 구동 구조

(537페이지 참고)

그림 11-5-1TCP Wrapper 설치 시 데몬의 구동 구조

주요 파일과 디렉터리의 적정 권한

파일/디렉터리 권한
/etc 751 (d rwx r-x --x)
/bin 771 (d rwx rwx --x)
/usr/bin 751 (d rwx r-x --x)
/etc/crontab 600 (- rw- --- ---)
/etc/ftpusers 600 (- rw- --- ---)
/etc/passwd 440 (- r-- r-- ---)
/etc/shadow 600 (- rw- --- ---)
/etc/hosts.equiv 600 (- rw- --- ---)
/etc/hosts.allow 600 (- rw- --- ---)
/etc/hosts.deny 600 (- rw- --- ---)
/etc/securetty 600 (- rw- --- ---)
/etc/cron.allow 400 (- r-- --- ---)
/etc/cron.deny 400 (- r-- --- ---)
/etc/hosts 644 (- rw- r-- r--)

로그와 침입 탐지 모두 닫기

인증(Authentication), 인가(Authorization), Accounting

인증(Authentication)
자신의 신원(identity)을 시스템에 증명하는 과정
인가(Authorization)
요청한 권한에 대해 적절성을 검토하고 그에 부합하는 권한을 사용자에게 부여하는 과정
Accounting
시스템에 로그인한 후 시스템이 이에 대한 기록을 남기는 과정

개체 액세스 감사

파일이나 디렉토리, 레지스트리 키, 프린터 같은 객체에 접근을 시도하거나 속성을 변경하려는 것 등을 탐지

이벤트 ID 내용
4656 개체에 대한 접근 요청
4657 레지스트리 값 변경
4658 개체에 대한 접근 종료
4660 개체 삭제
4663 개체에 대한 접근
4670 개체의 접근 권한 변경
4698 스케줄된 작업 생성
4699 스케줄된 작업 삭제
4700 스케줄된 작업 활성화
4701 스케줄된 작업 비활성화
5031 외부의 접근을 허용하는 응용 프로그램을 윈도우 방화벽이 차단
5140 네트워크 공유 객체 접근

주요 계정 관리 감사

신규 사용자/그룹 추가, 기존 사용자 그룹 변경, 사용자의 활성화/비활성화, 계정 패스워드 변경 등을 감사

이벤트 ID 내용
4739 도메인 정책 변경
4720 사용자 계정 생성
4722 사용자 계정 활성화
4723 사용자 계정 패스워드 변경 시도
4724 사용자 계정 패스워드 초기화 시도
4725 사용자 계정 비활성화
4726 사용자 계정 삭제
4738 사용자 계정 변경
4740 사용자 계정 잠금
4767 사용자 계정 잠금 해제
4781 사용자 계정 이름 변경

계정 로그온 이벤트 감사

도메인 계정 사용에 대한 로그온 감사

이벤트 ID 내용
4776 도메인 컨트롤러에 대한 로그인 시도
4777 도메인 컨트롤러에 대한 로그인 시도 실패

권한 사용 감사

권한 설정 변경이나 관리자 권한을 사용한 작업 감사

이벤트 ID 내용
4672 권한 할당
4673 권한이 있는 서비스 호출
4674 권한이 있는 개체 작동

로그온 이벤트 감사

로컬 계정 사용에 대한 로그온 감사

이벤트 ID 내용
4624 성공적인 로그인
4625 계정 로그인 시도 실패
4634 로그오프
4649 리플레이 공격 탐지
4778 윈도우 시스템에 세션 재생성
4779 윈도우 시스템에 세션 해제
4800 시스템 잠김
4801 시스템 잠김 해제
4802 화면 보호기 실행
4803 화면 보호기 해제
5632 무선 네트워크를 통한 인증 요청
5633 유선 네트워크를 통한 인증 요청

주요 정책 변경 감사 로그

사용자 권한 할당 정책, 감사 정책 또는 신뢰 정책 변경 관련된 사항 감사

이벤트 ID 내용
4719 시스템 감사 정책 변경
4907 개체에 대한 감사 설정 변경
4706 다른 도메인과의 신뢰 관계 형성
4707 다른 도메인과의 신뢰 관계 제거
4713 커버로스(Kerberos) 정책 변경
4704 사용자 권한 할당
4705 사용자 권한 제거
4714 암호화 데이터 복구 정책 변경
4946 방화벽에 대한 예외 사항 목록 변경(규칙 추가)
4947 방화벽에 대한 예외 사항 목록 변경(규칙 변경)
4948 방화벽에 대한 예외 사항 목록 변경(규칙 제거)
4950 방화벽 설정 변경
4670 개체에 대한 권한 변경

프로세스 추적 감사

사용자나 프로그램이 프로세스를 시작하거나 중지할 때 이를 감사

이벤트 ID 내용
4688 새 프로세스 생성
4689 프로세스 종료
5712 RPC(Remote Procedure Call)이 시도됨

시스템 이벤트 감사

시스템의 시동과 종료, 보안 로그 삭제 등 시스템의 주요 사항에 대한 감사

이벤트 ID 내용
5024 방화벽 서비스 시작
5025 방화벽 동작 멈춤
5030 방화벽 시작 실패
4608 윈도우 시작
4609 윈도우 종료
4616 시스템 시간 변경
4697 시스템에 서비스 등록
4618 모니터링하고 있던 보안 이벤트에서 패턴 발생

주요 유닉스 시스템 로그

로그 내용
utmp

유닉스 시스템의 가장 기본적 로그 정보 제공

현재 시스템에 로그인한 사용자 상태 출력

wtmp

/usr/include/utmp.h 파일의 구조체를 그대로 사용

utmp 데몬과 비슷한 역할을 함

su 로그 su 명령을 이용한 권한 변경에 대한 로그
pacct 시스템에 로그인한 모든 사용자가 수행한 프로그램에 대한 정보 저장
.sh_history 또는 .bash_history 각 사용자의 홈 디렉토리에 저장되는 실행한 명령에 대한 기록
lastlog wtmp와 마찬가지로 last 명령을 통해 해당 사항 출력
syslog 시스템의 로그에 대한 대부분의 정보를 수집해 로깅
loginlog 실패한 로그인 시도에 대한 로깅 수행
FTP 파일 전송 로그 (xferlog) 파일을 전송할 날짜와 시간, 접근 시스템의 IP, 전송한 파일에 대한 로깅 수행
HTTPD 로그 (Access_log, Error_log) /usr/local/apache/logs 아래에 Access_log, Error_log 등과 같은 로그 파일로 남김

침입 사고 발생 시 대응 절차

  1. 메모리 덤프

    해커가 침투한 흔적이 있는 경우 메모리를 덤프한 후 이를 CD-ROM과 같이 다시 쓰기가 불가능한 백업 장비에 저장한다.

  2. 해커의 접속 차단

    메모리 덤프를 수행한 후에는 현재 접속해 있는 해커의 접속을 끊는다.

  3. 시스템 이미지 확보

    디스크의 이미지는 CD-ROM과 같이 수정이 불가능한 미디어에 저장한다.

  4. 운영자에게 통보

    시스템의 이미지가 뜨는 동안 관리자는 자신의 상위 직급에 있는 관리자 또는 운영자에게 이 사실을 알려야 한다.

    이때 전화를 통해 알리는 것이 좋다.

  5. 침입자 추적

    공격 대상이 되었던 시스템의 이미지를 이용해 똑같은 다른 시스템을 CD-ROM으로 만든 후, 이를 이용해 침입자를 추적한다.

  6. 침입 후 대응 및 시스템 복구

    마지막으로 백업 장치를 이용해 해킹으로 손상된 부분을 복구하고, 법적 절차에 따라 해커를 처벌한다.

시스템 복구 과정에서 확인할 사항

  • 시스템에 설치된 응용 프로그램의 변조 여부
  • 시스템 설정 파일의 변조 여부
  • 데이터의 삭제 및 변조 여부
  • 운영 중인 다른 시스템에 침투했는지 여부

NTFS 파일 시스템의 구조

(633페이지 참고)

그림 13-3-1NTFS 파일 시스템의 구조

  1. PBS(Partition Boot Sector)

    부팅에 필요한 최소한의 정보를 담고 있으며, 이 부분에 부팅 시 구동되는 NTLDR(NT Loader Program)에 대한 정보가 있음

  2. MFT(Master File Table)

    모든 파일과 디렉터리에 대한 파일 이름, 크기, 생성 시간 등 파일에 대한 데이터 이외의 모든 정보를 담고 있음

  3. 시스템 파일

    MFT를 포함하여 파일 복사/삭제 과정 중에 시스템이 에러를 일으키는 경우,

    이를 복구하는 데 사용할 디스크 사용에 대한 로그 파일, 디스크 볼륨 이름 등 디스크 자체에 대한 정보들을 담는 파일이 저장됨

  4. 파일 영역

    각 파일에 대한 실제 데이터가 저장되는 곳

NTFS에서 작은 파일과 디렉터리의 MFT 구조

(634페이지 참고)

그림 13-4-1NTFS에서 작은 파일과 디렉터리의 MFT 구조

솔라리스 파일 시스템의 구조

(634페이지 참고)

그림 13-5-1솔라리스 파일 시스템의 구조

  1. VTOC 디스크 라벨(Disk Label)

    VTOC는 디스크의 첫 번째 섹터(512바이트)를 차지하며, 각 파티션에 대한 정보를 담고 있음

  2. 부트 블록(Boot Block)

    부트 블록은 다음 15섹터를 차지하며, 부팅 시 최초 실행되는 Bootstrap 프로그램이 위치함

  3. 프라이머리 수퍼 블록(Primary Super Block)

    프라이머리 수퍼 블록은 크기가 6섹터이며, 다음과 같은 정보를 담고 있음

    • 데이터 블록의 개수
    • 실린더 그룹의 개수
    • 데이터 블록의 크기 및 조각(Fragment)
    • 하드웨어 정보
    • 마운트 포인트 정보
    • 파일 시스템 상태 정보

  4. 백업 수퍼 블록(Backup Super Block)

    백업 수퍼 블록은 수퍼 블록의 중요성 때문에 각 실린더 그룹마다 하나씩 복사하여 존재함

  5. 실린더 그룹 블록(Cylinder Group Block)

    실린더 그룹에는 다음과 같은 정보가 저장됨

    • I-노드 개수
    • 실린더 그룹에 속한 데이터 블록 개수
    • 디렉터리 개수
    • 실린더 그룹에서 사용하지 않는 블록, I-노드 개수

  6. I-노드 테이블(I-Node Table)

    I-노드 테이블은 실린더 그룹에 대한 I-노드의 정보를 저장하며, 각 I-노드에는 다음의 정보가 담겨있음

    • 파일의 종류와 접근 모드
    • 파일의 소유자와 그룹에 대한 UID, GID
    • 파일 크기
    • 파일의 마지막 접근/변조 시간, I-노드가 변경된 시간
    • 데이터 저장에 사용된 총 데이터 블록 수

  7. 데이터 블록(Data Block)

    실린더 그룹별 데이터 블록의 기본 크기는 8192바이트

    I-노드는 이러한 데이터 블록에 대한 참조(Index) 정보를 가지고 있음

I-노드 구조

(635페이지 참고)

그림 13-6-1I-노드 구조