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를 상세 분석하려면 난이도 상승.
※프로그램이 메모리에 로딩될 때 최소 기본단위( 보통 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)
-함수 내의 로컬 변수 임시저장
-함수 호출 시 파라미터 전달
-복귀 주소 저장
→리버싱에서 기존의 코드(혹은 데이터)를 의도적으로 다른 코드로 덮어 쓰는 행위를 "패치시킨다"라고 말한다.
'과거의 컴퓨터 공부 > basic' 카테고리의 다른 글
메모리 세그먼트-(1)이론 (0) | 2014.03.16 |
---|---|
바이너리 파일 열어보기, gdb 이용해 보기-(3) 본격적인 gdb 분석(추가적인 C) (0) | 2014.03.15 |
바이너리 파일 열어보기, gdb 이용해 보기-(2) gdb 심화 (0) | 2014.03.15 |
바이너리 파일 열어보기, gdb 이용해 보기 -(1) (0) | 2014.03.14 |
기초(1) (0) | 2014.03.14 |