티스토리 뷰

리버싱을 공부하다 보면 필히 어셈블리어를 공부해야 합니다.

그런 어셈블리어 명령의 대부분이 레지스터값을 조작하는 명령어들입니다.

ollydbg 프로그램을 이용할때 레지스터 윈도우창에 EAX, EBX, ECX, ESI등이 보일텐데요.

이는 레지스터 값으로써, 오늘은 이 레지스터 값에대해 알아보는 시간을 준비했습니다.

CPU 와 레지스터 가 뭔지 알아보고 넘어갑시다.

CPU?

 

중앙처리장치(CPU)는 컴퓨터의 가장 중요한 부분으로 프로그램 명령을 해독하고 수행하는 장치입니다.

CPU가 수행하는 명령어는 매우 단순합니다 이 명령어들은 레지스터에 있는 값들을 필요로 합니다.

​Register?

레지스터는  CPU 내부에 존재하는 저장 공간으로 일반적인 데이터 저장소 보다 훨씬 빠르게 접근할 수 있으나,

레지스터의 크기가 매우 제한적이기 때문에 현재 사용되고 있는 데이터들만 저장하도록 해야 합니다.

 

​레지스터는 크게 4개의 그룹으로 나눌 수 있습니다.

그중 오늘은 범용레지스터에 대해 알아봅시다.

 

 General Purpose Register - 범용 레지스터로 보통 상수,주소등을 저장할 때 사용

 

 



​이게 범용레지스터들 입니다. 하나하나 뭐하는건지 봅시다.

EAX (Extended Accumaulator Register)

주로 산술 논리연산(ADD,SUB,XOR,OR 등)의 리턴값으로 사용됩니다.

 EBX(베이스 레지스터)

특정주소(간접주소) 저장에 이용됩니다.

 ECX(Extended Counter Register)

반복문에서 반복 카운트 값으로 사용되는 레지스터 입니다. 

 EDX(Extended Data Register)

​ 간접 번지 지정에 사용되며, EAX의 보조로 사용되기도 한다.

 ESI (Extended Source Index)

​데이터 조작이나 복사에 이용됩니다.

 EDI (Extended Destination Index)

​데이터 조작이나 복사에 이용됩니다.

 EBP (Extended Base Pointer)

스택의 맨 아래 부분을 가리키며, 보통 함수가 호출되었을때 그 순간의  ESP를 가리키고 있다가

함수가 리턴할때 값을 되돌려줘 스택이 깨지지 않게 합니다.

 ESP​ (Extended Stack Pointer)

스택의 가장 윗부분을 가리키며 ( Top pointer 라고한다)

※ ​ 참 고

범용레지스터에서 EAX, EBX, ECX, EDX는 저렇게 나누어 사용할 수 있습니다.

EAX를 보면 , EAX 는 32 bit 로 사용할 수 있으며, AH(8-15 8bit) AL(0-7 8bit)  AX (0-16 16bit) 와 같이 사용할 수 있습니다.

이렇게 사용하는 이유는 효율성이 증가합니다. 예로, 0010 값이 EAX 에 입력됬다고 생각해 봅시다.

0010은 4bit 인데 EAX 에 넣으면 나머지 28bit를 다 0으로바꿔줘야합니다. 너무 비효율 적이죠, 이럴때 AL 만을 사용하여 0000010 과 같이 표현 합니다.

​즉, 4바이트를 다 이용하고 싶을때에는 EAX를 이용하고 2바이트만 사용할때는 AX를, AX의 상위 1바이트만 사용하려면 AH, AX 하위1 바이트를 이용하고 싶다면 AL을 사용하여 상황에 맞게 적절히 사용할 수 있습니다.

참고로 EAX,EBX,ECX,EDX는 데이터를 저장하는데 사용하기때문에 나눌 수 있고 ESI,EDI,EBP,ESP는 주소를 저장하는 용도로 사용되기 때문에 나누어 사용하지 않습니다.

 

 

'Reversing > Assembly' 카테고리의 다른 글

진법에 대하여 알아보자!  (0) 2014.10.30
댓글