티스토리 뷰

이전 포스팅에서도 언급 하였듯이, <리버스 엔지니어링:역분석 구조와 원리>를 공부하고 포스팅한 글 입니다.

리버스 엔지니어링을 하게 되면, 어셈블리 언어를 다루게 됩니다.
어셈블리 언어의 기본이자 CPU의 기본이 되는 것은 뭘까요?
바로 레지스터입니다.

CPU(Central Processing Unit)는 메모리로부터 명령을 가져오고(Fetch),
어떤 명령어인지 해석하고(decode), 그리고 실행(Execute)합니다.
이러한 동작만을 무수히 반복하게 되고, 그렇기 때문에 이렇게 제가 글을 쓰고 인터넷을 할 수 있는 것입니다.
(자세한 동작은 Computer Architecture를 공부하면 배울 수 있습니다.)

어셈블리 언어에서는 레지스터를 이용하여 값을 저장하고 조작하게 됩니다.
이러한 레지스터들은 CPU에 존재하는 하드웨어적인 것이기 때문에, 하드웨어의 아키텍쳐에 종속됩니다.
그 중 하나가 우리가 흔히, 대부분 사용하는 Intel Architecture - 32bit 입니다.
요새는 64bit CPU도 많이 나오는데 그 경우에는 레지스터의 구조가 약간은 변하겠죠.

그럼, 어떤 레지스터가 있는지 알아보겠습니다.

◎ 범용 레지스터
말 그대로 범용 레지스터이기 때문에, 기본적으로 정해진 목적 이외에 단순히 값을 저장한다던가 하는 용도로도 이용 가능합니다. 하지만 ESP, EBP는 스택과 관계되어 있으므로 이외의 목적으로는 건드리지 않는 것이 좋습니다.

-EAX(Extended Accumulator Register) : 곱셈, 나눗셈 명령에서 자동으로 사용되고, 함수의 리턴값을 저장합니다.
-EBX(Extended Base Register) : ESI나 EDI와 결합하여 인덱스에 사용됩니다.
-ECX(Extended Counter Register) : 반복 명령어(REP) 사용시 카운터로 사용됩니다.
-EDX(Extended Data Register) : EAX와 같이 쓰이며 부호 확장 명령 등에 사용됩니다.
-ESI(Extended Source Index) : 데이터 복사 및 조작시 Source Data의 주소를 저장합니다.
-EDI(Extended Destination Index) : 데이터 복사 및 조작시 Destination Data의 주소를 저장합니다.
-ESP(Extended Stack Pointer) : 스택 프레임의 끝 주소(Bottom Address)가 저장됩니다. PUSH와 POP명령어 시                                                     ESP값이 4씩 변합니다.
-EBP(Extended Base Pointer) : 스택 프레임의 시작 주소가 저장되며 스택 프레임이 유지되면 변하지 않습니다.

◎ 명령 포인터
-EIP(Extended Instruction Pointer) : 다음에 실행할 명령의 주소를 가집니다. 점프 명령(JMP 및 J류)과 함수 호출                                                            시에는 명령 포인터의 값이 변경됩니다.

◎ 세그먼트 레지스터
(?? 공부하기)

-CS(Code Segment) : 실행 가능 명령어 세그먼트의 오프셋을 저장합니다.
-DS(Data Segment) : 데이터가 존재하는 세그먼트의 오프셋을 저장합니다.
-SS(Stack Segment) : 스택이 존재하는 세그먼트의 오프셋이 저장됩니다.

◎ 플래그 레지스터
조건 부 점프 명령에서 주로 사용되는 레지스터이며 특정 조건이 만족되면 세팅됩니다.

-CF(Carry Flag) : 부호 없는 연산 결과가 용량보다 클 때 세팅됩니다.
-ZF(Zero Flag) : 연산 결과가 0일때 세팅됩니다.
-OF(Overflow Flag) : 부호 있는 연산 결과가 용량보다 클 때 세팅됩니다.
-SF(Sign Flag) : 연산 결과가 음수일 때 세팅됩니다.
-DF(Direction Flag) : 문자열의 처리 방향을 나타냅니다. 1로 세팅되었을 경우 감소하는 방향으로 진행합니다.

◎ 부동 소수점 데이터 레지스터
왜 부동 소수점 데이터 레지스터인지. 부동 소수점 표현 때 데이터가 나누어 들어가는 것으로 추정. 공부하기

범용 레지스터를 보면 앞 글자에 Extended의 의미로 E가 붙어있습니다. 즉, 확장되었다는 의미인데 16bit방식에서 32bit방식으로 넘어오면서 E가 붙은 것으로 이해하면 됩니다.
같은 맥락으로, 16bit레지스터는 8bit레지스터의 조합으로 나뉩니다.
상위 레지스터는 'H'가 붙고 하위 레지스터는 'L'이 붙게 됩니다.

EAX의 경우, 16bit는 AX, 상위 8bit는 AH, 하위 8bit는 AL이 되는 것입니다.






댓글