이번 강의는 리버싱을 배우기전 필수로 외우고 있어야 하는 레지스터에 대해
알아보겠습니다.
1. CPU Register ( CPU 레지스터 )
먼저 레지스터란 : CPU 내부에 존재하는 다목적 저장 공간입니다.
몇몇분들이 가끔 우리가 흔히 메모리라 말하는 RAM ( Random Acess Memory )과 헷갈리시는 분이 계시는데 (없으면 말고요)
속도면에서 보면 CPU 는 RAM에 있는 데이터를 사용하기 위해서는 물리적으로 먼 거릴 돌아 가야되기 때문에 시간이 오래 걸립니다.
하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 테이터 처리가 가능하죠
2. Register 는 필수?
위에 언급했듯이 리버싱을 배우기 전 필수로 외우고 있어야 하는 것 중 하나가 Register 입니다.
이유는 일단 우리가 하려는게 어플리케이션(프로그램) 리버싱이죠, 리버싱을 잘 하려면,
디버거가 디스어셈( asm 으로 해석 )해주는 어셈블리 명령어를 알아야죠.
그런데 프로그램을 직접 디버깅 해보면 그 많은 어셈 명령어들이 레지스터를 조작하고 관리하는 것 뿐 입니다.
즉 레지스턴 필수라는거죠
3. IA-32의 레지스터
IA-32 레지스터 에서 지원하는 레지스터의 수가 엄청나게 많습니다.
예를 들면
Basic Program execution registers ( 기본적으로 우리가 알아야 할 것 )
MMX registers
XMM registers ( 병렬 프로그래밍 해보신 분들을 알 겝니다 , 미치죠 완전 ㅋㅋ )
Debug registers
Memory management registers
....
등이 많습니다.
이 중 맨 위에 있는게 제일 많이 사용되는거고 필숩니다.
그럼 이제 Basic Program execution registers 에 대해 공부해 보겠습니다.
4. Basic Program execution registers
이 레지스터에서도 크게 4부분으로 나눠지는데
범용 레지스터 - General Purpose Registry ( 크기 : 32비트 , 갯수 : 8개 )
: 산술/논리 연산, 피연산자(오퍼랜드) 를 저장하거나 포인터의 역할로 사용함
세그먼트 레지스터 - Segment Registers ( 크기 : 16비트 , 갯수 :6개 )
: 윈도우 운영체제에서는 프로세서가 메모리에 접근할 때 이 레지스터와 조합해서 사용합니다.
EFLAGS 레지스터 - Program status and Control Register ( 크기 : 32비트 , 갯수 : 1개 )
: 프로그램이 실행되고 있는 상황의 연산 결과를 저장하거나 , 시스템 상태의 결과를 저장.
EIP 레지스터 - Instruction Pointer ( 크기 : 32비트 , 갯수 : 1개 )
: 다음에 실행 할 명령어의 주소를 저장합니다.
가 있습니다.
세부적으로 다시 나열하면
EAX (AX, AH, AL) - 누적연산기, 곱셈과 나눗셈 연산에서 자동으로 사용
EBX (BX, BH, BL) - 베이스 레지스터, 특정 주소를 지정
ECX (CX, CH, CL) - 수를 세아림, 자동으로 루프 카운터됨(반복적인 명령을 수행시)
EDX (DX, DHT, DL) - 데이터 레지스터, 입출력 연산에서 반드시 간접 주소 지정에 사용
EBP (BP) - 베이스 포인터, 스택의 데이터에 접근하기 위해 사용
ESP (SP) - 스택 포인터, 현재까지 사용된 스택의 위치를 저장, 스택 최상부의 오프셋을 가리킴
EDI (DI) - 쓰기 인덱스
ESI (SI) - 읽기 인덱스, 문자열 전송이나 비교에서 사용되는데 주로 소스 문자열의 오프셋을 가리킴
EIP - 명령어 포인터 레지스터, 실행할 다음 명령어의 주소를 포함
EFLAGS - CPU의 동작을 제어하거나 CPU 연산의 결과를 반영
그다음으로 세그먼트 레지스터들로는
CS : Code Segment ( 코드 세그먼트 )
SS : Stack Segment ( 스택 세그먼트 )
DS : Data Segment ( 데이터 세그먼트 )
ES : Extra(Data) Segment ( 추가 데이터 세그먼트 )
FS : Data Segment ( 추가 데이터 세그먼트 )
GS : Data Segment ( 추가 데이터 세그먼트 )
이정도만 숙지 해 두시고
EFLAGS : Flag Register ( EFLAGS (32비트) 레지스터는 FLAGS (16비트) 의 확장형태 입니다 )
EFLAGS 의 값은 0 또는 1 인데요, 이 값들로 Enable , Disable 즉 On/Off 상태를 저장하는 겁니다
다른말로는 각 비트 , 32개의 비트가 각각 다른 의미와 기능을 가지고 있단 뜻이죠
그 구조는 복잡하고 아직 외우기엔 쓰잘때기(?) 없는 짓이므로 패스하도록 하겠습니다.
이번 강의는 여기서 마치겠습니다.
사진 및 일부 내용 출처 : http://hannamlog.tistory.com/entry/Assembly-레지스터의-종류와-특징
'Security > Reverse Engineering' 카테고리의 다른 글
[Reversing] Cross-Compiler & Remote Debugging with gdb on Linux (0) | 2016.12.31 |
---|---|
[Reversing] ASLR 기능 제거하기 (0) | 2014.04.26 |
[Reversing] About Reversing?? (0) | 2014.04.26 |