728x90
반응형
레지스터 : CPU 내부에 존재하는 다목적 저장공간
vs 일반적인 메모리(RAM) : 레지스터가 속도가 훨씬 빠르다.
레지스터를 알아야 하는 이유
- 어셈블리어의 대부분이 레지스터를 조작하는 것이기에 레지스터의 용도의 내용을 이해 해야한다.
가장 기초가 되는 Register = Basic program execution registers
- General Purpose Register (32bit - 8개)
- Segment Register (16Bit - 6개)
- Program Status and Control Register (32Bit - 1개)
- Instruction Pointer(32Bit - 1개)
General Purpose Register
- EAX : Accumulator for operands and result data
- EBX : Pointer to data in the DS segment
- ECX : Counter for string and loop opertions
- EDX : I/O pointer
- 위 4개의 레지스터는 주로 산술연산(add, sub, xor, or 등) 명령어에서 상수/변수 값을 저장하는 용도록 주로 사용한다.
- 어떤 어셈블리 명령어(mul, div, lods 등)들은 특정 레지스터를 직접 조작하기도 한다.
- ECX는 Loop에서 반복 카운터로 사용(루프를 돌때마다 1씩 감소)
- EAX는 일반적으로 함수의 리턴값에 사용된다.
- EBP : Pointer to data on the stack (in the SS segment)
- 스택 메모리를 주로 가르킨다.
- ESI : source pointer for string operations
- EDI : destination pointer for string operations
- ESP : Stack pointer (in the SS segment)
- Push, pop, call, ret 명령어들은 ESP를 직접 조작한다. ( 스택 메모리 관리는 프로그램에서 매우 중요하기에 ESP를 다른 용도로 사용하는 것은 좋지 않다.)
- 위 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다.
- EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 깨지지 않도록 한다. (스택 프레임 기법)
- ESI, EDI는 특정명령어들(lods, stos, rep movs 등)과 함께 주로 메모리 복사에 사용된다.
세그먼트 레지스터
- I-32 보호 모드에서 세그먼트란 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법을 말한다.
- 세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용된다.
- 세그먼트 메모리는 Segment Descriptor Table(SDT)이라고 하는 곳에 기술되어 있으며, 세그먼트 레지스터가 이 SDT의 Index를 가지고 있다.
- 세그먼트 레지스터는 총 6개(CS, SS, DS, ES, FS, GS)이며 각각의 크기는 16bit이다.
- 세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상메모리가 조합되어 선형주소가 되며, 페이징 기법에 의해서 선형주소가 최종적으 물리주소로 변환된다.
- CS : Code Segment
- SS : Stack Segment
- DS : Data Segment
- ES : Extra Segment
- FS : Data Segment // 애플리케이션 디버깅에도 자주 등장하는데 SEH(structureed Exception Handling), TEB(Thread Environmnet Block), PED(Process Environment Block) 등의 주소를 계산할 때 자주 사용된다.
- GS : Data Segment // ES, FS, GS는 추가적인 데이터 세그먼트이다.
프로그램 상태와 컨트롤 레지스터
- EFLAGS : Flag Register // 플래그 레지스터는 32bit이다.
- 1이면 On / 0이면 Off의 의미를 가지고 있다.
- EFLAGS 레지스터의 32개의 각 비트의 의미를 전부 이해하는 것은 어려움.
- 기초단계에선 OF, ZF, CF 3개만 이해하면 된다.
- 위 3개 플래그는 조건 분기 명령어에서 값을 확인하고 그에 따른 동작을 수행함.
- ZF (Zero Flag) : 연산 명령 후 결과 값이 0이 되면 1로 셋팅
- OF
(Overflow Flag) : 부호 있는 수의 오버플로우가 발생 시 1로 셋팅
또한 MSB(Most Significant Bit/최상위비트)가 변경 되었을 때 1로 셋팅 - CF (Carry Flag) : 부호 없는 수의 오버플로우가 발생 시 1로 셋팅
Instruction Pointer
- EIP : Instruction Point
- CPU가 처리할 명령어의 주소를 나타내는 레지스터 // 크기 32bit
- EIP는 직접적으로 변경 할 수 없도록 되어 있다.
- 변경 하고 싶을 시에는 다른 명령어를 통해 간접적으로 변경해야 한다.
특정 명령어(JMP, JCC, CALL, RET)를 사용하거나 인터럽트, 예외처리를
발생 시켜야한다.
반응형
'리버스 코드 엔지니어링' 카테고리의 다른 글
[리버스 엔지니어링] 함수 호출 규약 정리 (0) | 2018.11.14 |
---|---|
[리버스 엔지니어링] 바이트 오더링 (0) | 2018.10.31 |
[리버스 엔지니어링] OllyDbg 간단한 사용법 (0) | 2018.10.30 |
[리버스 엔지니어링] 리버스 엔지니어링이란? (0) | 2018.10.30 |
댓글