레지스터 (Register)

Knowledge 2015. 10. 12. 10:34

레지스터(Register)

 

레지스터란 CPU에서 사용하는 일시적인 소형 저장메모리이다. CPU에서 사용하는 메모리 중 가장 작고 빠른 메모리라고 볼 수 있다. 사실 레지스터의 종류는 수백가지가 있지만 시스템 해킹이나 간단한 어셈블리 코딩을 하기 위해서는 그 중에서 가장 중요하고 대표적인 9가지의 레지스터만을 알아도 상관없다.

 

우선 레지스터는 32비트 기준으로 EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP, EIP가 존재한다.

원래 이들은 16비트 기준으로 AX, BX, CX, DX… 등이었으나 사용하는 메모리의 크기가 커지면서 레지스터의 크기도 커져 앞에 Extended 라는 접두어가 붙으면서 크기가 16비트에서 32비트로 확장되었다. 이름이 마치 A, B, C ,D 순서대로 붙여진 것 같지만 사실 그렇지 않고, 모두 그 의미를 가지고 있다. 다음이 그 내용이다.


범용 레지스터

- EAX (Extended Accumulator Register) : 함수의 리턴 값이나 연산 결과가 담긴다.

- EBX (Extended Base Register) : 배열의 주소가 저장되고 이를 참조하는 데 사용한다.

- ECX (Extended Count Register) : 루프문에서 카운트를 세는 데 사용한다.

- EDX (Extended Data Register) : EAX의 보조 레지스터로 특수한 경우에 EDX-EAX 순서로 붙여서 임시 8바이트 레지스터로 사용한다.


인덱스 레지스터

- ESI (Extended Source Index) : 데이터 이동 시 원본 데이터의 주소를 담당한다.

- EDI (Extended Destination Index) : 데이터 이동 시 저장될 주소를 담당한다.


포인터 레지스터

- ESP (Extended Stack Pointer) : 현재 스택 프레임의 끝 주소를 담는다.

- EBP (Extended Base Pointer) : 현재 스택 프레임의 기준이 되는 주소를 담는다.

- EIP (Extended Instruction Pointer) : 수행할 명령어의 주소를 담는다.

 

이렇게 역할을 구분해놓긴 했지만 사실 EIP를 제외한(가급적 ESP, EBP 또한) 레지스터들은 범용적으로 사용해도 상관이 없다. 함수 리턴 값을 EAX가 아니라 EBX에 담아도 상관은 없다는 뜻이다. 하지만 나중에 이미 만들어진 코드를 읽고 이해하기 편하게 하기 위해서는 만들어진 목적 그대로 사용하는 편이 좋다. 

또한, 레지스터는 32비트 CPU를 기준으로 32비트 크기를 갖고 있다. 그런데 이는 16비트나 8비트 단위로 데이터를 다루기 힘들기 때문에 또 레지스터를 나눠 둔 단위들이 있다. 이는 다음 그림을 보면 이해할 수 있다.



보다시피 EAX의 크기는 0~31까지 총 32비트이다.

16비트 CPU 환경에서 사용하던 AX는 전과 마찬가지로 EAX의 절반인 하위 16비트이며, 여기서 또 절반을 나누어 상위 8비트를 AH, 하위 8바이트를 AL로 설정해 두었다. EAX의 상위 16바이트는 딱히 이름을 지정해두지 않았으므로 이 부분만을 바로 참조하는 것은 불가능하다.

이는 다른 레지스터에도 똑같이 적용된다.

EBXBX, BH, BL이며 ECXCX, CH, CL인 것 처럼.

하지만 ESIEDI는 조금 다른데, 이 둘은 8비트짜리 레지스터로 참조할 때 SIH, SIL, DIH, DIL로 사용한다.

이와 같은 하위 비트들을 어셈블리어에서 사용할 때에는, 특히 하위 비트가 Source일 때 주의해야 하는데,

MOV %EAX, %AL 의 형식으로 사용할 경우 4바이트의 데이터를 1바이트짜리에 집어넣는 상황이 되어버리기 때문에 컴파일이 되지 않는다. AT&T 기준으로 MOVB 명령을 사용하거나 intel 기준으로 BYTE PTR 등으로 크기를 정확히 명시해주어야 한다.

'Knowledge' 카테고리의 다른 글

libcapstone-dev 설치 방법  (0) 2016.03.12
PE 파일과 Memory-Mapped File  (0) 2015.12.24
Wireshark로 인증서 추출하기  (0) 2015.11.02
제한적 ASLR 해제 방법  (0) 2015.10.22
RTL Chaining의 원리  (0) 2015.10.18
레지스터 (Register)  (0) 2015.10.12
블로그 이미지

__미니__

E-mail : skyclad0x7b7@gmail.com 나와 계약해서 슈퍼 하-카가 되어 주지 않을래?

댓글을 달아 주세요