1. 컴퓨터 구조 개요
컴퓨터 구조
하드웨어
- 특정한 외형을 가진 물리적 자원
- 입력장치, 출력장치, 기억장치, 연산장치. 제어장치
소프트웨어
- 특정한 외형 없이 컴퓨터의 작동과 기능
- 프로그래밍 언어를 사용하여 하드웨어에 ㅍ효과적으로 명령을 수행하는 프로그램
- 시스템 소프트웨어
- 하드웨어와 소프트웨어의 기능을 효율적으로 관리 및 제어하는 프로그램
- ex) OS, 펌웨어 등
- 응용 소프트웨어
- 사용자가 원하는 기능을 실행하는 프로그램
- ex) Microsoft Office 프로그램, 게임 등
2. CPU 구조 및 기능
컴퓨터 하드웨어의 구성 요소
컴퓨터 하드웨어의 구성
메인 메모리 (Main Memory)
- 램 (RAM)
- 프로그램 코드가 올라가서 실행되는 영역
입출력 버스 (IMput / Output Bus)
- 데이터가 이동하는 전송 경로
- 주고 받는 데이터의 종류에 따라 3가지 요소로 구성
- 데이터 버스
- 어드레스 버스
- 컨트롤 버스
폰 노이만 구조 (Von Neumann architecture)
- 내장 메모리 순차 처리 방식으로 데이터 메모리와 프로그램 메모리가 구분되어 있지 않고 하나의 버스를 가지고 있는 구조
폰 노이만 구조
명령어와 데이터는 같은 시스템 버스와 메모리를 사용
- 장점
- 프로그램 내장 방식을 적용했기 때문에 하드웨어를 재설정할 필요가 없이 소프트웨어만 교체하면 되므로 범용성이 크게 향상 된다
- 단점시스템 버스가 하나이므로 순차적으로 정보를 처리하기 때문에 고속 병렬처리에 부적합
- 한번에 하나의 명령어 처리로 CPU를 효율적으로 사용할 수 없다
폰 노이만 병목 현상
어떠한 특정 요소의 한계 때문에 전체가 제한 받는 상황을 비유한 말, 일부분에 의한 전체의 하향 평준화
CPU 구조 및 기능
CPU : 중앙 처리 장치 (Central Processing Unit)
- ALU (Arithmetic Logic Unit)CPU로 입력 되었을 때, 명령어의 내용대로 연산하는 주 요소
- CPU 내부에서 실제 연산을 담당하는 부분으로 산술 연산과 논리 연산을 수해
- 컨트롤 유닛 (Control Unit)명령어를 분석해서 해야할 일을 결정하는 요소
- CPU 내부로 들어온 명령어를 해석해서 ALU 에게 전달
- 레지스터 (Register Set)
- CPU 내부에서 임시적으로 데이터를 저장하기 위한 메모리 공간
- 버스 인터페이스 (Bus Interface)
- 버스의 통신 방식에 맞게 데이터 입/출 력을 돕는 인터페이스 장치는 컨트롤러 또는 어댑터
- CPU 내에 I /O 버스의 통신 프로토콜(Protocol)을 이해하고 있는 장치
프로그램 실행
- 인출 (Fetch)
- 메모리 상에 존재하는 명령어를 CPU로 가져오는 작업
- 레지스터에 저장
- 해독 (Decode)
- 가져온 명령어를 CPU가 해석
- 무슨일을 하라는 명령어인지 분석
- 컨트롤 유닛에서 수행
- 실행 (Execute)
- 해석된 명령어 대로 CPU가 실행
- ALU 에서 실행
3. 레지스터 구조와 기능
레지스터의 이해
- IA-32 레지스터CPU 내부에 있는 8, 16, 32 bit 고속 저장소
- 인텔386에서 시작하여 32비트 프로세스인 펜티엄4에 이르는 프로세스 '군' 을 의미
- 레지스터는 CPU 안에 위치한 고속의 저장 장치로 메모리 보다 훨씬 빨리 read/write 수행
- 보통은 CPU가 연산을 수행할 때 피 연산자를 레지스터에 저장세그먼트 레지스터 : 6개명령 포인터 : EIP
- 프로세서의 상태를 나타내는 플래그 : EFLAGS
- 범용 레지스터 : 8개
범용 레지스터
Register의 종류를 Size로 정리
- eax의 하위 16 비트 ax
ax 의 상위 8 비트 ah
ax 의 하위 8 비트 al
eax, ax, ah, al 이 각각 다른 공간을 의미하지는 않음
eax 에 0000 0000 ..... 0000 0001 을 넣어도 ax 도 1 , al 도 1 이됨
EAX, EBX, ECX, EDX, ESI, EDI 레지스터는 우리 마음대로 쓸 수 있는 레지스터
- EAX :
계산을 위해 사용되며, 함수 호출의 리턴 값을 저장하고 더하기, 빼기, 비교 등과 같은 기본적인 연산 - EBX :
범용성은 없으며, 데이터를 저장하는데 사용 - ECX :
- 반복을 위해 사용되며, 아래쪽으로 카운트 (루프 카운터로 쓰임)
- EDX :
EAX 레지스터의 확장이며, 더 복잡한 계산 (곱하기, 나누기) 을 가능하게 함 - ESI와 EDI :
고속의 메모리 복사에 쓰이고 다량의 메모리를 옮기거나 비교 할 때의 주소 값을 가짐- S 는 source, D는 destination의 약자
- ESI (source index) : 입력 데이터의 위치를 가지고 있음
- EDI (destination index) : 데이터 연산 결과가 저장되는 위치를 가르킴
- EBP :고급 언어에서 사용하는 함수 파라미터와 지역변수를 가리키는 데 쓰임
- 파라미터는 EBP에 오프셋을 더한 값에 있고 지역변수는 EBP에 오프셋을 뺀 값에 있음
- 일반적인 산술이나 데이터 전송에 쓰여서는 안됨
- Stack Base 포인터로 쓰임
- ESP :push , pop , ret , call 등에 사용
- 스택의 탑을 가리키고 있음
- Stack Pointer
메모리 구조
세그먼트 레지스터
→ 기본 프로그램 실행 레지스터
CPU가 사용하는 논리 주소를 4GB인 선형 주소로 변환하는데 사용
- 선형 주소에서 물리 주소 사이의 매핑은 페이징이 담당
- CPU 비트가 물리 메모리 크기보다 작아서 8086 시스템에 도입
- 하지만 가상 메모리와 물리 메모리의 현재 모델은 80286부터 시작
- 세그먼트 레지스터는 16비트로 설계되었다가 32비트 CPU의 시작과 함께 FS와 GS가 추가되어 32비트로 운영
64비트 CPU 부터 세그먼트 레지스터를 사용하지 않음
- CPU의 아키텍처는 64비트로 증가했지만 메모리 주소 배정은 64비트로 증가하지 않음
세그먼트 레지스터 종류
- 코드 세그먼트 (CS, Code Segment)인출 (fetch) 하는 모든 명령
- 메모리 코드 영역의 시작 주소를 가지며, 실행할 명령을 가리키는 레지스터인 EIP가 이세그먼트를 참조
- 데이터 세그먼트 (DS, Data segment)DS를 확장하기 위해 ES > FS > GS 순으로 세그먼트가 추가되어 사용
- 데이터 집합의 시작 주소를 가지며, 데이터와 관련 있는 A, C, D, SI, DI가 이 세그먼트 참조
- 스택 세그먼트 (SS, Stack Segment)
- push 와 pop 하는 모든 스택
- 스택의 시작 주소를 가지며, 스택과 관련 있는 SP와 BP가 이 세그먼트 참조
플래그 레지스터
Flag Register
- 플래그 레지스터는 프로세서의 현재 상태를 표현
- 다른 말로 상태 레지스터라고 부름
- 플래그 레지스터는 16비트이며, E를 접두어로 사용하는 EFLAGS는 32비트, R을 접두어로 사용하는 RFLAGS는 64비트
- 32비트로 충분히 사용 가능하며, 확장될 경우 사용하지 않는 비트는 0으로 설정
- 1 , 3 , 5 비트는 고정 값을 사용
- CF (Carry Flag) : 상태 플러그
- 연산 결과가 저장 공간의 범위를 벗어날 때 1로 설정되는 플래그
- PE (Parity Flag) : 상태 플러그$$26_(10) = 00011010_(2) > PF = 0\10_(10) = 00001010_(2) > PF = 1$$
- 연산 결과의 최하위 바이트 (8비트) 에서 1로 설정된 비트 개수가 홀수면 0 짝수면 1로 설정, 검사를 위해 사용
- AF ( Adjust Auxiliary) : 상태 플러그
- 이진화 십진법은 니블로 10진수를 표현하는 방법 $1001_(2)$ 이상 넘어가지 않음
- 특수 플래그로 최하위 4비트를 의미하는 니블(Nibble)에서 자리 올림이나 자리 내림이 발생할 때 1로 설정, 주로 이진화 십진법 (BCD, Binary-Coded Decimal) 산술을 지원하는데 사용
- ZF (Zero Flag) : 상태 플러그
- 분기와 같은 조건에서 많이 사용
- 산술 결과가 0이면 1로 설정 그렇지 않으면 0으로 설정
- SF (Sign Flag) : 상태 플러그
- 부호 플래그로 값이 양수일 경우 0, 음수일 경우 1로 설정, 최상위 비트가 부호 비트로 사용될 경우 동일한 값을 가짐
- OF (OverFlow) : 상태 플러그$$word\quad에서\quad127_(10)+127_(10) \quad연산 \ 0111 \ 1111_(2) = 1111 \ 1110_(2) = -2_(10)\0000 \ 0010_(2)의 1의 보수 = 1111 \ 1101_(2)\1111 \ 1101 의 2의 보수 = 1111 \ 1101_(2) + 1 = 1111 \ 1110_(2) = -2$$
- 연산에 사용되는 비트 수 (ALU 에서 받아서 처리하는 폭) 를 넘어섰을 때 1로 설정
다시 말해서 254가 아닌 -2가 생성되므로 오버플로우 플래그를 설정함으로써 254와 -2 를 구분 (word 기준)
- TF (Trap Flag) : 제어 플러그
- 디버깅에서 사용되는 플래그로 1로 설정되면 실행 명령 하나하나 살펴볼 수 있음
- IF (Interrupt Falg) : 제어 플러그
- 마스크 가능한 이터럽트의 처리 여부를 결정하는 플래그
- DF (Direction Flag) : 제어 플러그
- 저장된 문자열을 왼쪽에서 처리할지 오른쪽에 처리하는지 결정하는 플래그로 0으로 설정되면 낮은 주소부터 높은 주소 바향으로, 1로 설정되면 높은 주소에서 낮은 주소로 처리
명령 포인터 레지스터
- IP 앞에 32 비트로 확장한 E가 붙어 EIP로 불림
- CPU는 EIP 레지스터에 정의된 메모리 섹션의 명령을 처리
- EIP는 JMP 나 CALL 명령으로 수정할 수 있음
- 공격자가 원하는 메모리 위치를 가리키도록 EIP를 제어할 수 있으며, 메모리에 공격자의 명령을 작성할 수 있다면 시스템을 장악할 수 있음
- 덮어쓴 EIP 부분을 찾아 원하는 위치로 이동
- 해당 위치에 공격자의 공격 코드를 삽입
- 버퍼 오버플로우 공격으로 EIP를 덮어쓸 수 있음
- EIP 레지스터는 특별한 구조 없이 다음에 실행시킬 명령의 주소를 가짐
4. 인텔 아키텍처의 이해
IA - 32 구조
- 대부분은 인텔 CPU 기반으로 시스템을 운영
- x86 , x64 CPU 가 존재
- IA -64는 IA -32와 호환성을 가지지 않음
- 호환성을 가지는 모델 개념은 AMD64로 시작
- 각각 IA -32, IA -64로 표현
IA -32에서 중요한 두가지 요소
- 주소 공간 (Address Space)최대 64GB 물리 주소 공간 (Physical Address Space) 을 쓸 수 있음
- 프로그램당 최대 4GB 선형 주소 공간 (Linear Address Space)
- 기본 프로그램 실행 레지스터 (Basic Program Execution Registers)Byte, Word, Double Word 크기의 기본 산술 연산을 지원
- 프로그램 흐름 처리, 비트와 바이트 문자열 처리, 메모리 주소 지정 등 수행
- 8개 범용 레지스터, 6개 세그먼트 레지스터, EFLAGS 레지스터, 명령 레지스터로 구성
5. 메모리 구조
메모리 구조 개요
메모리 정의
- 프로그램 실행을 위한 데이터 및 코드가 들어 있는 영역
- 메모리 구조 개요같은 프로그램일지라도 메모리 관리에 따라 성능 차이 발생
- 메모리 관리가 되지 않은 경우 성능 저하 발생
- 가장 효율성 있게 정보를 저장하고 검색할 수 있도록 데이터 저장소를 구현하는 방법
선형 주소 공간 (Linear Address Space) - 분할된 메모리 모델의 핵심
- 주로 가상 메모리로 불리며, 디버깅 할 때 볼 수 있는 주소
- 최대 4GB로 구성
- 32비트 CPU 에서만 선형 주소 공간을 쓰기 때문
- 낮은 주소부터 높은 주소로 표현
- 하나의 프로그램의 커널, 힙, 스택, 텍스트 등 영역들로 분할
- 커널과 사용자 영역의 크기는 일정한 규칙을 가짐(4GT 모드) 커널 : 사용자 = 1GB : 3GB
- 4GT 는 4-Gigabyte-Turning 의 약자로 응용프로그램 메모리 터닝 또는 /3GB 스위치로 불림
- 무조건 좋다고 할 수 없음 - 운영체제 운영에 메모리가 부족할 수 있음
- 운영체제에 따라 CPU 아키텍처에 따라 설정 (PAE)에 따라 커널과 유저의 크기는 달라질 수 있음
- (일반 모드) 커널 : 사용자 = 2GB : 2GB
Linux , Windows 98/Me 메모리 구조
Windows 2000 계열 메모리 구조
텍스트 (Text) == 코드 (Code) 영역 :
실핼할 프로그램의 코드가 저장되는 영역
데이터 (Data) 영역 :
전역변수, 정적(Static) 변수 등이 저장되는 영역
초기화 된 데이터 영역 과
초기화 되지 않은 데이터 영역 (BSS) 구분
힙 (Heap) 영역 :
메모리 동적 할당 시 데이터가 저장되는 영역
높은 주소 방향으로 데이터 증가
스택 (Stack) 영역 :
지역변수, 매개변수 등의 임시 데이터가 저장되는 영역
후입선출 (LIFO)
낮은 주소 방향으로 데이터 증가
메모리 상에서 힙 영역, 스택 영역
- 힙과 스택 영역이 서로 반대로 데이터를 채워 나가기 때문에 서로의 영역을 침범할 수 있음
1) Stack Overflow : 스택이 힙 영역을 침범함
2) Hip Overflow : 힙이 스택 영역을 침범함 왜 스택은 높은 주소에서 낮은 주소로 채워질까?
- 함수가 호출될 때 필요한 스택 메모리를 할당받는데, 이것은 함수 반환 후에 사용했던 해당 스택 메모리를 반환하여 전체적인 스택 메모리 상의 변경이 없어야 하기 때문이다.
-> 결과적으로 제일 중요한 커널 영역을 침범하지 않으면서 전체적인 영역을 일정하게 차지하기 위해.
'System > basics' 카테고리의 다른 글
운영체제 해킹 (0) | 2021.08.12 |
---|---|
가상화 기술의 이해 (0) | 2021.07.16 |
시스템의 기초 (0) | 2021.07.08 |