2016. 10. 27. 05:10ㆍ2018년 이전글/역공학
OllyDbg를 이용해서나 다른 툴을 사용하여 디버깅을 하다보면 각각의 레지스터들의 용도에 관하여 알아야 할 경우가 있다. 자,그럼 이번엔 레지스터에 관하여 알아보도록하겠다.
CPU Register?
!레지스터?
CPU내부에 존재하는 다목적 저장 공간이다.
IA-32의 레지스터
IA-32레지스터의 Basic program execution registers는 크게 또 4가지로 나뉜다.
1.General purpose Registers(32bit) --> 8개
2.Segment Registers(16bit) --> 6개
3.Program Status and Control Registers(32bit) --> 1개
4.Instruction Pointer(32bit) --> 1개
[그림 1]Basic program execution registers
General purpose Register
범용적으로 사용되어지는 레지스터이다.
각각의 크기는 32비트 즉 4바이트이다.
보통 상수나 주소등을 저장할때 사용되어진다.
특정 명령어에서는 특정 레지스터를 조작하거나 어떤 레지스터들은 특수한 용도로 사용되기도 한다.
주로 산술연산 명령어에서 상수/변수 값의 저장용도로 사용되는 레지스터
EAX -> Accumulator for operands ans results data
EBX -> Pointer to data in the DS segment
ECX -> Counter for string and loop operations
EDX -> I/O pointer
**어떤 특정 명령어들은 레지스터를 직접 조작하기도 한다.
**ECX와 EAX는 특수한 용도로 사용된다.
ECX -> 반복문에서 카운트
EAX -> 일반적으로 함수 리턴값에 사용
주로 메모리 주소를 저장하는 포인터로 사용
EBP -> Pointer to data on the stack (in the SS segment)::함수가 호출되었을 때 그 순간의 ESP를 저장하다가 리턴하기 직전에 다시 ESP에 돌려준다.=>스택이 깨지지 않도록: Stack Frame기법
ESI -> Source pointer for string operation::메모리복사에 사용됨
EDI -> Destination pointer for string operations::메모리 복사에 사용됨
ESP -> Stack pointer (in the SS segment)::스택메모리 주소를 가리킨다.
[그림 2]General Purpose Register
Segment Register
*Segment? IA-32의 메모리 관리 모덴에서 나오는 용어
IA-32보호 모드에서 세그먼트란 메모리를 조작내어 각 조각마다 시작주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법이다.
페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할 때 사용
세그먼트 메모리는 SDT에 기술되어 있는데 세그먼트레지스터는 SDT의 인덱스를 가지고 있다.
각각의 크기는 16bit이다.
CS -> Code Segment
SS -> Stack Segment
DS -> Data Segment
ES -> Extra Segment
FS -> Data Segment::애플리케이션 디버깅에서 SEH, TEB,PEB등의 주소를 계산할 때사용된다.
GS -> Data Segment
[그림 3]Segment Memory Model
Program Status and Control Register
EFLAGS => Flag Register
32bit 이다.
각 bit는 1또는 0의 값을 가진다.
일부는 시스템에서 직접 세팅하고 일부는 프로그램에서 수행된 명령의 결과에 따라 세팅된다.
ZF -> zero flag::명령 후에 결과 값이 0이 되면 ZF가 1(True)로 세팅
OF ->overflow flag::부호 있는 수의 오버플로가 발생했을 때 1로 세팅 & MSB가 변경되었을 때 1로 세팅
Instruction Pointer
EIP -> Instruction pointer
CPU가 처리할 명령어의 주소를 나타내는 레지스터이다.
32bit의 크기를 가진다.
CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리한 후 자동으로 그 명령어의 길이만큼 EIP를 증가시킨다.
'2018년 이전글 > 역공학' 카테고리의 다른 글
[리버싱 핵심원리]1부 5장_스택 (0) | 2016.11.02 |
---|---|
[리버싱 핵심원리]1부 3장_리틀 엔디언 표기법 (0) | 2016.10.27 |
[리버싱 핵심원리]1부 2장_Hello Reversing! (0) | 2016.10.25 |