본문 바로가기

Reverse Engineering/Reversing 이론 설명

[CPU] 세그먼트 레지스터의 이용

  프로그램이 수행되기 위해서는 여러 가지 메모리 주소가 필요하다. 우선 현재 수행되고 있는 명령어의 위치를 나타내는 값, 프로그램이 사용하는 데이터가 있는 메모리 값, 그리고 함수 호출 등을 위한 스택의 위치를 나타내는 값 등이다.

  8086은 어드레스 버스가 20비트로 구성되어 있어서 1MByte까지 메모리 번지를 나타낼 수 있으나 8086에 있는 레지스터는 16비트밖에 되지 않아서 어떤 명령이 수행되어 메모리를 참조할 때에는 항상 다음의 표와 같이 암시적 또는 명시적으로 세그먼트 레지스터가 개입되게 된다.

 세그먼트  오프셋  목적
 코드 세그먼트(CS)  IP  수행되어질 명령어의 위치
 스택 세그먼트(SS)  SP, BP  스택 주소 참조
 데이터 세그먼트(DS)  범용 레지스터, DI, SI  데이터 주소 참조
 보조 세그먼트(ES)  스트링 명령을 위한 DI  스트링의 목적지 주소

예를 들어 [mov ax, word ptr 1032h]라는 명령은 현재 데이터 세그먼트의 오프셋 1032H번지, 즉 DS:1032번지의 값을 AX 레지스터에 집어넣는다. 만일 데이터 세그먼트가 아니라 보조 세그먼트를 액세스하고 싶으면 [mov ax, word ptr es:1032h]와 같이 명시적으로 세그먼트를 지정해 주면 된다.

  그리고 위의 표에서 알 수 있듯이 각종 레지스터들은 오프셋 값으로 사용할 때에도 암시적으로 레지스터와 연결된다. 즉 AX, BX, CX, DX, SI, DI는 DS와 조합되고 BP, SP는 SS와 조합된다. 이 역시 ES:BX와 같이 써서 강제로 다른 레지스터와 조합시킬 수도 있다.

 또한 현재 수행되고 있는 명령의 위치는 명령 포인터(IP) 레지스터가, 스택의 위치는 스택 포인터(SP) 레지스터가 가지고 있으나 이 역시 암시적으로 현재 수행되는 명령은 CS(Code Segment)와 결합되어 CS:IP가 되며, 스택 위치는 SS(Stack Segment)와 결합되어 SS:SP라는 주소로 이루어지게 된다.