반응형

EP(Entry Point)

Windows 실행 파일(EXE, DLL, SYS등)의 코드 시작점, 프로그램이 실행될 때 'CPU에 의해 가장 먼저 실행되는 코드 시작위치'

 

 명령어

단축키

설명 

 Restart

ctrl + F2 

다시 처음부터 디버깅 시작(디버깅을 당하는 프로세스를 종료하고 재실행) 

Step Into 

F7 

하나의 OP code 실행(CALL 명령을 만나면, 그 함수 코드 내부로 따라들어감) 

Step Over 

F8 

하나의 OP Code 실행( CALL 명령을 만나면, 따라 들어가지 않고 그냥 함수 자체를 실행)

 Execute till Return

 ctrl + F9

 함수 코드 내에서 RETN 명령어 까지 실행( 함수 탈출 목적)

 

Packer(Run Time Packer)

실행 압축 유틸리티. 실행 파일의 코드, 데이터, 리소스 등을 압축시킴. 일반 압축 파일과 다른 점은 실행 압축된 파일 그 자체도 실행 파일 이라는 것

Protector

실행 압축 기능 외에 파일과 그 프로세스를 보호하려는 목적으로 anti-debugging, anti-emulating, anti-dump 등의 기능을 추가한 유틸리티.Protector를 상세 분석하려면 난이도 상승.


~> API라는 것은 OS에서 제공한 함수이고, 실제로 API는 C:\Windows\system32\ 폴더에 *.dll 파일 내부에 구현되어 있다. 우리가 만드는 프로그램이 어떤 의미 있는 일(각종I/O)을 하려면 반드시 OS에서 제공된 API를 사용해서 OS에게 요청해야 하고, 그 API가 실제 구현된 시스템 DLL 파일들은 우리 프로그램의 프로세스 메모리에 로딩되어야 한다.

 

※프로그램이 메모리에 로딩될 때 최소 기본단위( 보통 1000)가 있다. 비록 프로그램 내에서 메모리를 100 크기 만큼만 사용한다 해도 실제로 메모리에 로딩될 때에는 최소 기본단위인 1000만큼의 크기가 잡히는 것이다(나머지 F00크기의 사용되지 않는 영역은 NULL로 채워진다)

 

레지스터(Register)

CPU 내부에 존재하는 다목적 저장 곤간. CPU가 RAM에 있는 데이터를 엑세스 하기 위해서는 물리적으로 먼 길을 돌아가야 하기 때문에 시간이 오래걸린다. 하지만 레지스터는 CPU와 한 몸이기 때문에 고속으로 데이터를 처리할 수 있다.

 

Basic Program Execution Register

-General Purpose Register(32bit -8개 )

-Segment Register (16bit - 6개)

-Program Status and Control Register(32bit -1개)

-Instruction Pointer(32bit -1개)

 

General Purpose Register(32bit -8개 ) →범용 레지스터

보통 상수/주소 등을 저장할 때 주로 사용되며, 특정 어셈블리 명령어 에서는 특정 레지스터를 조작하기도 한다. 또한 어떤 레지스터 들은 특수한 용도로 사용되기도 한다.

31                              16 15                               8  7                                  0               16-bit                            32-bit

 

 AH

AL 

AX 

EAX 

 

BH 

BL 

BX 

EBX 

 

CH 

CL 

CX 

ECX 

 

DH 

DL 

DX 

EDX 

 

 BPㄱ

 

EBP 

 

 SI

 

ESI 

 

 DI

 

EDI 

 

 SP

 

ESP 

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

위 4개의 레지스터 들은 주로 산술연산 명령어에서 상수/ 변수 값의 저장용도로 많이 사용된다. 어떤 어셈블리 명령어 (MUL, DIV, LODS 등)들은 특정 레지스터를 직접 조작하기도 한다(이런 명령어가 실행된 이후에 특정 레지스터들의 값이 변경된다)

그리고 추가적으로 ECX와 EAX는 특수한 용도로도 사용된다. ECX는 반복문 명령어(LOOP)에서 반복 카운트로 사용된다(루프를 돌 때마다 ECX를 1씩 감소). EAX는 일반적으로 함수 리턴값에 사용된다. 모든 Win32 API 함수들은 리턴 값을 EAX에 저장한후 리턴한다.

 

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

ESI : source pointer for string operation

EDI : destination pointer for string operations

ESP: Stack Pointer(in the SS segment)

위 4개의 레지스터들은 주로 메모리 주소를 저장하는 포인터로 사용된다. ESP는 주로 스택 메모리 주소를 가리킨다. 어떤 명령어들(PUSH, POP, CALL , RET)은 ESP를 직접 조작하기도 한다( 스택 메모리 관리는 프로그램에서 매우 중요하기 때문에 ESP를 다른용도로 사용 안할것을 권장)

EBP는 함수가 호출되었을 때 그 순간의 ESP를 저장하고 있다가, 함수가 리턴하기 직전에 다시 ESP에 값을 되돌려줘서 스택이 꺠지지 않도록 한다(Stack Frame)

 

세그먼트 레지스터

세그먼트(segment) : 메모리를 조각내어 각 조각마다 시작 주소, 범위, 접근 권한 든을 부여해서 메모리를 보호하는 기법, 또한 세그먼트는 페이징 기법과 함께 가상 메모리를 실제 물리 메모리로 변경할때 사용한다. 세그먼트 메모리는 'Segment Descriptor Table(SDT)'라는 곳에 기술되어 있는데 세그먼트 레지스터는 바로 이 SDT의 index를 가지고 있다.

※세그먼트 레지스터가 가리키는 세그먼트 디스크립터와 가상메모리가 조합되어 선형주소가 되며, 페이징 기법에 의해 선형주소가 최종적으로 물리주소로 변환된다.

 

CS : Code Segment   SS: Stack Segment    DS: Data Segment    ES: Extra Segment   FS: Data Segment    GS:Data Segment

ES,FS,GS -> 추가적인 데이터 세그먼트

 

EFLAGS: Flag Register

-ZF(Zero Flag)

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

-OF(Overflow Flag)

부호있는 수의 오버플로가 발생했을때 1로 세팅. 그리고 MSB가 변경되었을 때 1로세팅

-CF

부호없는 수의 오버플로가 발생했을 때 1로 세팅

 

스택 -> FILO(First In Last Out)

-함수 내의 로컬 변수 임시저장

-함수 호출 시 파라미터 전달

-복귀 주소 저장

 

→리버싱에서 기존의 코드(혹은 데이터)를 의도적으로 다른 코드로 덮어 쓰는 행위를 "패치시킨다"라고 말한다.

 

 

반응형
,