2020. 2. 25. 00:15ㆍ보안/리버싱
1. 도입
CPU 레지스터란
일반적으로 메모리라고 말하는 RAM은 CPU와 물리적인 거리로 인해 데이터 엑세스에 시간이 오래걸린다.
그러나 레지스터는 CPU에 있으므로 더욱 빠르게 데이터를 처리할 수 있다.
레지스터에 대해 알아야 하는 이유
어셈블리언어의 명령 대부부니 레지스터를 조작하므로, 레지스터를 이해하지 못하면 명령어 자체를 이해하기 어렵다.
2. IA-32의 레지스터
Register
-- Basic program execution
-- General Purpose Register[범용 레지스터] | 32bit 1개
-- Segment Register | 16bit 6개
-- Program Status and Control Register | 32bit 1개
-- Instruction Pointer | 32 bit 1개
-- Control Register
-- Memory management
-- Debug register
2-1. General Purpose Register - 범용 레지스터
IA-32 에서 각각의 범용 레지스터들의 크기는 32bit이다. 이름대로 범용적으로 사용되며, 상수 / 주소 저장할 때 주로 사용된다.
EAX -- 32bit
AX -- EAX의 하위 16bit
-- AH (AX의 상위 8bit) | AL (AX의 하위 8bit)
※ EBX, ECX, EDX 모두 동일한 하위 bit를 가지고 있음
EAX : 함수 리턴값에 사용 :: Accumulator for operands and results data
EBX : 상수 | 변수 값 저장용도 :: Pointer to data in the DS segment
ECX : 반복문 반복횟수 카운트 :: Counter for string and loop operations
EDX : EBX와 동일, WinAPI에서 사용 :: I/O pointer
위 4개의 레지스터는 주로 산술연산 명령어에서 상수/변수 값의 저장용도로 사용.
※EAX와 ECX는 특수한 용도로 사용됨
EBP : 메모리 주소 저장 | 함수 호출 순간의 ESP 저장하고 리턴 직전에 반환하여 스택을 유지하게 도움
ESI : 메모리 복사에 이용 | 메모리 주소 저장
EDI : 메모리 복사에 이용 | 메모리 주소 저장
ESP : 스택 메모리 주소 가르킴 | 프로그램 내에서 중요한 부분을 다루므로 함부로 조작하여 다른 용도로 사용하면 안됨.
3.Segment Register - 새그먼트 레지스터
새그먼트(segment)는 메모리 관리모델에서 나온 용어이다.
IA-32 보호 모드에서 세그먼트는 메모리를 조각내어 각 조각마다 시작주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법이다.
sagment register
-- CS : Code Segment
-- SS : Stack Segment
-- DS : Data Segment
-- ES : Extra(Data) Segment
EXTRA DATA SEG -- FS :Data Segment ※고급 디버깅 주제임..
-- GS : Data Segment
4. 프로그램 상태와 컨트롤 레지스터
EFLAGS : Flag Register -- 플래그 레지스터 (32bit / 4 byte 크기)
-플래그 레지스터는 각각의 비트마다 의미를 갖고 있다.
-각 비트는 1 또는 0의 값을 갖는데 Bool과 비슷하다.
[True / False] 또는 [On / Off] 의 의미를 갖는다.
-일부 비트는 시스템에서 세팅하고, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.
Zero Flag (ZF)
-- 연산 명령 후에 결과 값이 0이 되면 ZF가 1로 세팅된다.
Overflow Flag (OF)
-- signed Integer의 오버플로가 발생했을 때 또는 MSB(부호비트)가 변경되었을 때 1로 세팅된다.
Zero Flag (ZF)
-- unsigned Integer의 오버플로가 발생했을때 1로 세팅된다
5. Instruction Pointer
EIP : Instruction Register -- (32bit / 4byte)
CPU가 처리할 명령어의 주소를 나타내는 레지스터이다.
CPU는 EIP에 저장된 메모리 주소의 명령어를 하나 처리 한 후에 자동으로 그 명령어 길이만큼 크기를 증가시킨다.
범용 레지스터와는 다르게 값을 직접 변경할 수 없어, 다른 명령어를 통해 간접적으로 변경해야 한다.
ex ) JMP, Jcc, CALL, RET 또는 interrupt, exception을 발생시킨다.
'보안 > 리버싱' 카테고리의 다른 글
[Reversing] 리버싱 핵심원리 [5-2].abex' crackme1.exe 풀이 2 (0) | 2020.02.25 |
---|---|
[Reversing] 리버싱 핵심원리 [5-1].abex' crackme1.exe 풀이 1 (0) | 2020.02.25 |
[Reversing] 리버싱 핵심원리 [4]. 스택 정리 (0) | 2020.02.25 |
[Reversing] 리버싱 핵심원리 [2]. Hello Reversing 패치하기 (0) | 2020.02.24 |
[Reversing] 리버싱 핵심원리 [1]. Hello Reversing (0) | 2020.02.24 |