레지스터(Register)
레지스터라는 건 CPU 내부에 존재하는 다목적 저장 공간이라고 생각하시면 됩니다.
보통 RAM과 다르게 CPU가 RAM에 있는 데이터를 액세스 하기 위해서 물리적으로 돌아가기에 시간이 오래 걸리지만 레지스터는 고속으로 데이터를 처리할 수 있습니다.
디버거가 해석해 주는 어셈블리 명령어를 공부해야 합니다.
어셈블리 명령어는 방대하기에 공부하기 어렵지만 직접 디버깅해 가면서 문제에 마주하며 자료를 찾다 보면 금방 실력이 늘게 됩니다.
레지스터를 공부해야 하는 이유 중 하나도 어셈블리 명령어의 대부분이 레지스터를 조작하거나 검사합니다.
하지만 레지스터를 모른다면 명령어 자체도 이해하기 힘들어지죠
범용 레지스터
범용 레지스터로 넘어가 보겠습니다.
(General Purpose Registers)라고 말 그대로 범용적으로 사용하는데요.
보통 상수나 주소에 주로 사용되며, 특정 레지스터를 조작하거나 특수 용도로 사용되기도 합니다.
범용 레지스터
31 16 15 8 7 0
AH | AL | |
BH | BL | |
CH | CL | |
DH | DL | |
BP | ||
SI | ||
DI | ||
SP |
16-Bit | 32-Bit |
AX | EAX |
BX | EBX |
CX | ECX |
DX | EDX |
EBP | |
ESI | |
EDI | |
ESP |
- EAX, EBX, ECX, EDX 이 4가지의 레지스터들은 산술연산에 사용
- EBP, ESI, EDI, ESP 이 4가지는 주로 메모리 주소를 저장하는 포인터로 사용
(산술연산이란 ADD, SUB, XOR, OR과 같은 명령어)
추가로 ECX나 EAX는 다른 용도로도 사용되는데요 ECX는 반복문에서 반복카운트(EX: 루프를 돌 때마다 ECX를 1씩 감소)
EAX는 모든 Win32 API 함수들은 리턴 값을 EAX에 저장한 후 리턴 같은 경우에 사용합니다.
ESP는 스택 메모리 주소를 뜻하고
PUSH, POP, CALL, RET는 ESP를 조작하기도 합니다.
EBP는 함수가 호출될 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전 다시 ESP에 값을 되돌려줌으로써 스택이 깨지지 않도록 하는데 이것을 Stack Frame 기법이라고 함(중요하므로 이건 외우는 걸 추천합니다.)
ESI와 EDI는 보통 특정 명령어 (LODS, STOS, REP MOVS) 복사에 사용
세그먼트 레지스터
세그먼트 같은 경우는 메모리 관리 모델에서 사용되는 용어로 메모리를 조각내 조각마다 시작 주소, 범위나 접근 권한을 주어 메모리를 보호하는 기법입니다.
세그먼트 레지스터는 CS, SS, DS, ES, FS, GS로 16비트입니다.
더 나아가 디버깅을 직접 해보며 세그먼트 레지스터를 공부해야 할 상황에 다시 한번 더 알아보겠습니다.
내용이 어렵기에 이 정도구나라고 알고 계시면 다음에 좀 도움이 될 것 같습니다.
'리버스 엔지니어링[리버싱]' 카테고리의 다른 글
리버스엔지니어링(리버싱) 어떻게 공부해야 할까? (1) | 2024.02.19 |
---|