BLOG
Tracefield · 02
Tracefield · 01
블로그 · 14
Vibe Audit · 04
Vibe Audit · 03
Vibe Audit · 02
Vibe Audit · 01
출판편집자 · 01
StudyTree · 01
SecurityOps · 02
SecurityOps · 01
AI챗봇 · 04
AI챗봇 · 03
AI챗봇 · 02
AI챗봇 · 01
퍼플심 · 04
퍼플심 · 03
퍼플심 · 02
퍼플심 · 01
블로그 · 13
rootscan · 07
rootscan · 06
블로그 · 12
블로그 · 11
블로그 · 10
블로그 · 09
블로그 · 08
블로그 · 07
블로그 · 06
블로그 · 05
블로그 · 04
블로그 · 03
블로그 · 02
블로그 · 01
rootscan · 05
rootscan · 04
rootscan · 03
asmspeak · 03
asmspeak · 02
rootscan · 02
asmspeak · 01
rootscan · 01
웹보안도구 · 02
웹보안도구 · 01
루트캠프 · 02
루트캠프 · 01
All notes 167
x86-64 아키텍처와 레지스터
CPU는 RAM보다 훨씬 빠르다. 그래서 연산할 때마다 메모리에서 값을 다시 읽어오는 방식은 비효율적이다. 이 간극을 줄이기 위해 CPU 안에는 레지스터라는 초고속 저장 공간이 있다. 어셈블리에서는 결국 이 레지스터를 어떻게 읽고 쓰느냐가 핵심이다.
1. 범용 레지스터 (General Purpose Registers)
x86-64에는 레지스터가 여러 종류 있지만, 처음에는 자주 쓰는 핵심 레지스터부터 잡는 편이 낫다.
| 레지스터 | 역할 및 설명 |
|---|---|
| RAX | Accumulator. 산술 연산 결과 및 함수 리턴값(Return Value) 저장. |
| RDI | Destination Index. 함수 호출 시 첫 번째 인자(1st Argument) 전달. |
| RSI | Source Index. 함수 호출 시 두 번째 인자(2nd Argument) 전달. |
| RDX | Data. 함수 호출 시 세 번째 인자(3rd Argument) 전달. |
| RCX | Counter. 반복문의 카운터로 사용되며, 네 번째 인자 전달에도 사용됨. |
| RIP | Instruction Pointer. 다음에 실행될 명령어의 주소를 가리킴. 임의 조작 시 프로그램 흐름이 바뀜.(현재 실행 중인 명령어가 아님에 주의) |
| RSP | Stack Pointer. 스택 메모리의 최상단 주소를 가리킴.(물이 가득 찬 컵의 수면 높이라고 이해하면 된다. 물을 더 부으면 수면이 올라가듯, 데이터가 쌓이면 RSP가 이동한다.) |
처음에는 이 정도 역할만 정확히 기억해도 분석이 훨씬 쉬워진다.
2. 레지스터의 분할 사용과 Zero Extension
64비트 레지스터는 필요에 따라 더 작은 단위로 쪼개서 쓸 수 있다. 예를 들어 RAX는 EAX, AX, AL처럼 하위 비트 단위로 접근할 수 있다. 이 구조는 과거 x86 계열과의 호환성을 유지하기 위한 것이다.
여기서 중요한 건 32비트 연산 동작이다. mov eax, 0처럼 하위 32비트를 쓰면, CPU는 상위 32비트를 자동으로 0으로 채운다. 이걸 Zero Extension이라고 한다.
반대로 8비트나 16비트만 건드리면 상위 비트는 그대로 남는다. 이런 차이는 디버깅이나 취약점 분석에서 꽤 중요한 단서가 된다.

