1. CPU 레지스터란?
레지스터란 CPU 내부에 존재하는 다목적 저장 공간이다.
CPU가 RAM에 있는 데이터를 액세스하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래 걸린다.
하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.
1.1 레지스터에 대해 알아야 하는 이유
IA-32(Intel Architecture 32비트)에서 제공하는 어셈블리 명령어
어셈블리 명령어의 대부분은 레지스터를 조작하고 그 내용을 검사하기 떄문에 레지스터를 모르면 명령어 자체도 이해하기 힘들다.
2. IA-32의 레지스터
애플리케이션의 디버깅의 초급 단계에서는 Basic program executio register에 대해 알아두어야 한다.
2.1 Basic program execution registers
- General Purpose Registers (32비트 - 8개)
- Segment Registers (16비트 - 6개)
- Program Status and Control Register (32비트 - 1개)
- Instruction Pointer (32비트 - 1개)
📌 레지스터 이름에 E가 붙은 경우는 예전 16비트 CPU인 IA-16 시절부터 존재하던 15비트 크기의 레지스터들을 32비트 크기로 확장시켰다는 뜻이다.
1) 범용 레지스터
범용적으로 '막' 쓰는 레지스터
IA-32에서 각각의 범용 레지스터들의 크기는 32비트(4바이트)이다.
보통 상수/주소 등을 저장할 떄 주로 사용되며, 특정 어셈블리 명령어에서는 특정 레지스터를 조작하기도 하고 특수한 용도로 사용되기도 한다.
각 레지스터의 이름은 다음과 같다.
- EAX : Accumulator for operands and results data
- EBX : Pointer to data in the DS segment
- ECX : Counter for string and loop operations
- EDX : I/O pointer
위 4개의 레지스터들은 주로 산술연산(ADD, SUB, XOR, OR 등) 명령어에서 상수/변수 값의 저장 용도로 많이 사용된다.
ECX와 EAX는 특수한 용도로도 사용된다.
ECX는 반복문 명령어(LOOP)에서 반복 카운트로 사용된다.
➜ 루프를 돌 때마다 ECX를 1씩 감소시킨다.
EAX는 일반적으로 함수 리턴 값에 사용된다.
➜ 모든 Win32 API 함수들은 리턴 값을 EAX에 저장한 후 리턴한다.
나머지 범용 레지스터들의 이름은 아래와 같다.
- EBP : Pointer to data on the stack (in the SS segment)
- ESI : source pointer for string operations
- EDI : destination pointer for string operations
- ESP : Stack pointer (in ter SS segment)
위 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.
ESP는 스택 메모리 주소를 가리킨다.
➜ 어떤 명령어들은 ESP를 직접 조작하기도 한다.
EBP는 함수가 호출되었을 떄 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다.
➜ 이것을 Stack Frame 기법이라고 함.
Reference
'Security > Reversing' 카테고리의 다른 글
[Reversing] 06. abex'crackme #1 분석 (0) | 2021.12.02 |
---|---|
[Reversing] 05. 스택 (0) | 2021.11.26 |
[Reversing] 03. 리틀 엔디언 표기법 (0) | 2021.11.25 |
[Reversing] OllyDbg 기초 사용법 (0) | 2021.11.25 |
[Reversing] 02장. Hello World! 리버싱 (0) | 2021.11.22 |