Computer Architecture
<Background:Computer Architecture>
컴퓨터 구조
컴퓨터에 대한 기본 설계에 맞춰 여러 하드웨어가 개발되고, 이들을 조립하여 컴퓨터가 완성된다. 컴퓨터 과학에서는 이러한 설계를 컴퓨터 구조라고 한다.
명령어 집합구조(Instruction Set Architecture, ISA)
CPU가 사용하는 명령어와 관련된 설계를 명령어 집합구조라고 한다. 가장 널리 사용되는 ISA가 인텔의 x86-64 아키텍쳐 이다.
컴퓨터 구조와 명령어 집합 구조
컴퓨터 구조는 '컴퓨터의 기능 구조에 대한 설계', '명령어 집합구조', '마이크로 아키텍처', '기타 하드웨어 및 컴퓨팅 방법에 대한 설계' 등이 포함된다.
->'컴퓨터의 기능 구조에 대한 설계'란 컴퓨터가 연산을 효율적으로 하기 위해 어떤 기능들이 컴퓨터에 필요한지 고민하고 설계하는 분야이다. 대표적으로 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조가 있다. 폰 노이만 구조는 명령어 메모리 영역과 데이터 메모리 영역의 물리적 구분이 없다. 반면 하버드 구조는 명령어 메모리 영역과 데이터 메모리 영역을 물리적으로 분리시킨 구조이다. '
->명렁어 집합구조'란 CPU의 명령어에 대한 설계이다. 대표적으로 x86, x86-64, ARM, MIPS 등이 있다. 이렇게 다양한 ISA가 개발되고 사용되는 이유는 모든 컴퓨터가 동일한 수준의 연산 능력을 요구하지 않고, 컴퓨터 환경도 다양하기 때문이다.
->'마이크로 아키텍처'란 CPU의 하드웨어적 설계이며 정의된 명령어 집합을 효율적으로 처리할 수 있도록 CPU의 회로를 설계하는 분야이다.
x86-64아키텍처
64비트 아키텍처, 32비트 아키텍처에서 64와 32의 의미는 CPU가 한번에 처리할 수 있는 데이터의 크기이다. 컴퓨터 과학에서는 이를 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 'WORD'라고 부른다. WORD의 크기는 CPU가 어떻게 설계되었느냐에 따라 달라진다. WORD가 크다면 CPU가 제공할 수 있는 가상메모리의 크기가 커진다. 64비트 아키텍처에서는 16엑사 바이트의 가상메모리를 제공할 수 있어서 소프트웨어의 실행이 불가능한 상황은 거의 발생하지 않는다.
x64 아키텍처에는 범용 레지스터, 세그먼트 레지스터, 명령어 포인터 레지스터(IP), 플래그 레지스터가 존재한다.
->범용 레지스터는 주 용도가 있지만, 그 외의 용도로도 사용할 수 있는 레지스터를 의미한다. 범용 레지스터에는 AX, BX, CX, DX, SI, DI, BP, SP가 있다. BP는 베이스 포인터 레지스터로 스택 주소를 보존하는데 사용되며 현재 시랭되는 함수의 대표주소를 가리킨다. SP는 스택 포인터 레지스터로 사용중인 스택의 위치를 가리키는 포인터이다.
->세그먼트 레지스터에는 CS,DS,SS,ES,FS,GS 총 6가지가 있으며 x64로 아키텍처가 확장되면서 용도에 큰 변화가 생긴 레지스터이다. CS,DS,SS 레지스터는 각각 코드, 데이터, 스택 메모리 영역을 가리킬 때 사용되고 나머지 레지스터는 운영체제 별로 용도를 결정할 수 있도록 범용적인 용도로 제작된 세그먼트이다.
->명령어 포인터 레지스터(IP)는 CPU가 실행해야할 코드를 가리키는 레지스터이다.
->플래그 레지스터는 프로세서의 현재 상태를 저장하고 있는 레지스터이다. 깃발을 올리고 내리는 행위로 신호를 전달하듯, 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현한다.
x86-64 아키텍처는 IA-32의 64 확장 아키텍처이며 호환이 가능하다. IA-32에서 CPU 레지스터들은 32비트 크기를 가지고 명칭이 EAX,EBX,ECX,EDX.....등 이었다. x86-64에서는 RAX,RBX,RCX,RDX....으로 확장하여 사용하고 있다. EAX, EBX 등은 확장된 레지스터의 하위 32비트를 가리킨다. 예를 들어 EAX는 RAX의 하위 32비트를 의미한다.
<Background:Computer Architecture : 퀴즈>
레지스터 호환관련 문제가 많았다. 이 개념을 제대로 이해하고 있어야겠다.
<Background:Linux Memory Layout>
메모리 오염(Memory Corruption)취약점
공격자가 메모리를 악의적으로 조작하고, 조작된 메모리 값에 의해 CPU도 잘못된 동작을 할 수 있다. 이를 메모리가 오염됐다고 표현한다. 시스템 해킹에서는 많은 공격기법이 메모리 오염을 기반으로 하고 있다.
리눅스 프로세스의 메모리 구조
크게 5가지의 세그먼트로 구분한다. 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분한다. 운영체제가 메모리를 용도별로 나누면, 용도에 맞게 권한을 부여할 수 있다는 장점이 있다. 권한은 읽기, 쓰기, 실행이 존재한다.
->코드 세그먼트 : 실행 가능한 코드가 저장된 영역이다. 읽기, 실행 권한이 부여된다.
->데이터 세그먼트 : 초기화된 전역 변수 또는 상수가 위치하는 영역이다. 읽기, 쓰기 또는 읽기 권한이 부여된다.
- data 세그먼트 : 쓰기가 가능한 세그먼트이다.
전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.
- rodata(read-only data) 세그먼트 : 값이 변하는 안되는 데이터들이 위치한다. 전역으로 선언된 상수가 그 예이다.
->BSS 세그먼트 : 초기화되지 않은 데이터가 위치하는 영역이다. 읽기, 쓰기 권한이 부여된다. 프로그램이 시작될 때 모두 0으로 초기화된다.
->스택 세그먼트 : 임시 변수가 저장되는 영역이다. 읽기, 쓰기 권한이 부여된다. 스택 프레임이라는 단위로 사용된다. sw시간에 배운 것처럼 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제된다.
어떤 프로세스가 실행될 때, 얼만큼의 스택 프레임을 사용하게 될지 모르기 때문에, 운영체제는 작은 크기의 스택 세그먼트를 먼저 할당해주고 부족해지면 이를 확장해준다. 스택은 확장될 때 기존 주소보다 '낮은 주소'로 확장된다. 함수의 arguments(인자)와 지역변수가 위치한다.
->힙 세그먼트 : 실행중에 동적으로 사용되는 영역이다. 읽기, 쓰기 권한이 부여된다. 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다. c언어에서 malloc, calloc 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 된다.
<Quiz:Linux Memory Layout>
-e는 어느 세그먼트 데이터 가리킴? : 힙 세그먼트
-d가 위치하는 세그먼트는? : 스택 세그먼트(함수의 지역변수)
-b가 위치하는 세그먼트는? : 데이터 세그먼트
-c가 위치하는 세그먼트는? : BSS 세그먼트(초기화되지X)
-a가 위치하는 세그먼트는? : 데이터 세그먼트
-"d_str"이 위치하는 세그먼트는? : rodata
-foo가 위치하는 세그먼트는? : 코드 세그먼트
'해킹 > 시스템해킹' 카테고리의 다른 글
[드림핵 시스템해킹]x86 Assembly:Essential Part (0) | 2022.01.10 |
---|