본문 바로가기
책/리버싱핵심원리

리버싱핵심원리_2

by 맑은청이 2020. 4. 18.
728x90
반응형

03 리틀 엔디언 표기법

바이트 오더링(Byte Ordering) : 데이터를 저장하는 방식

 

-빅 엔디언(Big Endian)

직관적, 대형 UNIX 서버에 사용되는 RISC 계열의 CPU에서 많이 사용. 네트워크 프로토콜에 빅 엔디언이 사용

-리틀 엔디언(Little Endian)

데이터 역순 저장, Intel x86 CPU, 산술연산고 데이터 타입의 확장/축소될때 더 효율적

 

04 IA-32 Register 기본설명 

 

-CPU 레지스터란

CPU 내부에 존재하는 다목적 저장 공간

CPU가 RAM에 있는 데이트를 액세스(Access)하기 위해서는 시간이 오래 걸림

레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터 처리 가능

 

IA-32의 레지스터

Basic program execution registers(기본 레지스터)

1) 범용 레지스터(General Purpose Registers) 

보통은 산술 연산(ADD,SUB,XOR,OR 등)에서 상수/주소 등을 저장할 때 주로 사용

EAX : Accumulator for operands and results data

EBX : Pointer to data in the DS segment

ECX : Counter for string and loop operations

EDX : I/O pointer 

 

ECX - 반복 카운트 ,EAX - 함수 리턴값

Win 32 API 는 내부에서 ECX와 EDX사용, 중요한 값은 API 호출 전에 레지스터나 스택에 백업해야함

 

주로 메모리 주소를 저장하는 포인터들

EBP :  Pointer to data on the stack(in the SS segment)

ESI : source pointer for string opeerations

EDI : destination pointer for string operations

ESP : Stack Pointer(in the SS segment)

 

ESP 는 스택 메모리 주소 가리킴, (PUSH,POP,CALL,RET)

EBP 는 함수 호출때 ESP 저장했다가 리턴때 ESP 에게 돌려주어 스택이 깨지지 않게 함(이를 Stack Frame 기법).

ESI , EDI 는 주로 메모리 복사에 사용

 

2) 세그먼트 레지스터

세그먼트란 메모리를 조각내어 시작 주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법

또한 페이징(Paging) 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할때 사용

 

세그먼트 레지스터는 SDT의 index를 가지고 있음. 세그먼트 디스크립터(Segment Descriptor)와 가상 메모리 조합 -> 선형주소(Linear Address) ->(페이징기법) 물리주소(Physical Address)

 

3) 프로그램 상태와 컨트롤 레지스터

EFLAGS : Flag Register 

각 비트는 1 또는 0 의 값 가짐.

일부 비트 시스템 직접 세팅, 일부 비트는 수행 결과에 따라 세팅

 

-Zero Flag(ZF)

연산 명령 후에 결과 값이 0이 되면 ZF 1로 세팅

 

-Overflow Flag(OF) 

부호있는 수의 오버플로 1

MSB 변경 1

 

-Carry Flag(CF)

부호 없는 수(unsigned integer)의 오버플로 1

 

4) Instruction Pointer

EIP : Instruction Pointer

EIP는 그 값을 직접 변경할 수 없도록 되어 있어서 다른 명령어를 통하여 간접적으로 변경 -> 특정 명령어(JMP,Jcc,CALL,RET) 사용하거나 인터럽트(interrupt)로 예외처리해야함.

 

05 스택

프로세스에서 스택 메모리의 역할

1. 함수 내의 로컬 변수 임시 저장

2. 함수 호출 시 파라미터 전달

3. 복귀 주소(return address) 저장

 

스택의 특징

PUSH 으로 값이 추가되면 스택포인터는 Stack Top을 향해 (위쪽으로) 움직임. 

POP 으로 값이 제거 되면 스택포인터 Stack Bottom을 향해(아래쪽으로) 움직임.

-> 이러한 특성에서 ' 스택은 거꾸로 자란다'란 표현을 쓴다.

 

07 스택프레임

프로그램에서 선언되는 로컬 변수, 함수 호출에 사용되는 스택 프레임(Stack Frame)

 

스택 프레임이란?

ESP가 아닌 EBP레지스터를 사용하여 스택 내의 로컬 변수, 파라미터, 복귀 주소에 접근하는 기법

ESP 값은 수시로 변경됨 -> ESP를 기준으로 프로그램을 만들기 힘들고 CPU가 정확한 위치를 참고할 때 어려움이 있음.

따라서 함수 시작의 ESP 값을 EBP 에 저장하고 이를 함수 내에서 유지해주면 안전하게 해당 함수의 변수, 파라미터, 복귀 주소에 접근할 수 있음

 

728x90
반응형

' > 리버싱핵심원리' 카테고리의 다른 글

리버싱 핵심 원리_1  (0) 2020.04.18