중앙처리장치(cpu)의 구성요소
제어기능, 연산기능, 기억기능 3가지를 가지고 있다.
- 제어기능(intel core i7): 컴퓨터의 모든 장치들의 동작을 지시하고 제어한다. 주기억장치에서 읽어들인 명령어를 해독 해당 장치에게 제어 신호 보냄 (제어 창시의 구성 요소는 명령 해독기, 부호기, 제어 주소 레지스터, 제어버퍼레지스터, 제어기억장치 등이 있다.)
- 연산기능(alu): 제어 장치의 명령을 받아 실제 연산을 수행하는 장치 (가산기, 누산기, 보수기, 데이터 레지스터 등이 있다.)
- 기억기능: 제어, 연산 기능을 사용할 때 연산의 중간 결과값 등을 일시적으로 저장할 공간이 필요하다.
1. 레지스터
: CPU(Central Processing Unit)가 요청을 처리하는데 필요한 데이터를 일시적으로 저장하는 기억장치이다. 프로세스 내부에 있는 작은 공간이고 연산 제어, 디버깅 등의 목적으로 사용한다.
보통 컴퓨터에서 데이연산을 위한 데이터를 레지스터에 저장하고, 그 결과값도 레지스터에 저장된다. 속도가 매우 빠르다. 레지스터 역시 RAM의 일종이긴 하지만 RAM과 구분되는 점은 물리적인 구성이 아닌 사용 용도에 따라 달라진다는 점이다. CPU가 하드디스크에 접근하기 위해서는 하드디스크의 데이터를 메모리로 이동시켜 접근해야 한다. 따라서 물리적으로 먼 길을 돌아가는 RAM을 생각하면, 자주 쓰이는 데이터들은 캐시로부터 데이터를 읽어들여 레지스터를 이용해 고속으로 데이터를 처리한다.
[레지스터의 데이터 단위]
자료형 | 크기 | C 자료형과 비교 |
BYTE | 1byte | char과 동일 |
WORD | 2byte | short |
DWORD | 4byte | int |
QWORD | 8byte | double |
BIT
: 데이터를 표현할 수 있는 가장 작은 단위이다. 0과 1로 구분된다.
BYTE
: 8개의 bit가 모이면 byte가 된다. 0xFF(255)까지 표현 가능하다. 8bit와 대응하는 레지스터는 AL, AH, BL, CL, CH, DL, DH 등이 있다.
WORD
: 2개의 byte가 모이면 word라고 한다. 0xFFFF(65535)까지 표현이 가능하다. 16bit와 대응하는 레지스터는 AX, BX, CX, DX, SI, DI, BP, SP, IP가 있다.
DOUBLE WORD(=DWORD)
: 이름 그대로 word가 2개 모이면 double word가 된다. 0xFFFFFFFF(4294967295)까지 표현 가능하다. 32비트와 대응하는 레지스터는 EAX, EBX, ECX, EDX, ESI, EDI, EBP, ESP, EIP가 있다.
KILOBYPE
: 32 비트의 제곱으로 값을 표현한다.
레지스터 종류
- 범용 레지스터(32비트)
: 8개의 레지스터로 구성되며, 산술/논리 연산, 오퍼랜드(피연산자)를 저장하거나 포인터 역할함(메모리 주소 저장)
** 64비트의 경우 범용레지스터 EOO->ROO으로 변경됨(ex.RAX), R8~R15 레지스터도 추가됨.
- EAX(Accumulator) : 곱셈과 나눗셈 명령에서 자동으로 사용, 함수의 리턴 값이 저장(누적 연산기).
- EBX(Base) : 특정 주소를 지정, ESI나 EDI와 결합하여 인덱스에 사용됨.
- ECX(Counter) : 반복 명령에서 반복 카운터로 사용, 반복할 횟수를 지정 후 수행됨.
- EDX(Data) : EAX와 같이 쓰이며, 입출력 연산에서 간접주소 지정에 쓰임.
**하위호환을 위해 X로 나뉘고, X는 다시 H/L 구역으로 나눠짐.
**32bit를 사용하고 싶으면 EAX를 사용, 2바이트(16bit)만 쓰고 싶으면 AX를, 1바이트만 사용하고 싶으면 AH/AL 사용
- EBP(Base) : 베이스 포인터, 스택 프레임의 시작 지점 주소가 저장, 사용되고 있는 스택이 소멸되지 않는 동안에는 EBP의 값이 변하지 않는다. 현재 스택 프레임이 소멸되면 이전에 사용되던 스택 프레임을 가리키게 됨.
- ESP(Stack) : 스택 포인터, 스택 프레임의 끝 지점 주소가 저장, PUSH/POP 명령어에 따라서 값이 4byte씩 변함
- 세그먼트 레지스터(16비트)
: 윈도우 OS는 프로세서가 메모리에 접근할 때, 세그먼트 레지스터를 사용해 가상 메모리를 물리 메모리로 변환함.
//32bit, 64bit 환경이 되어서도 세그먼트 레지스터는 확장되지 X
- CS(Code) : 코드 영역을 가리키는 레지스터, 코드의 시작주소를 포함함. (=명령어 주소 지정)
- DS(Data) : 데이터 영역을 가리키는 레지스터 (=데이터, 상수)
- SS(Stack) : 스택 영역을 가리키는 레지스터 (=지역변수)
//위쪽 세개의 레지스터가 주로 쓰임. ES, FS, GS는 추가적인 데이터 세그먼트이다.
- ES, FS, GS
- 인덱스 레지스터(32비트)
: 데이터와 명령어들의 오프셋 주소를 갖는다.
- EDI(Desination) : 복사/비교할 때 데이터의 주소를 저장됨(읽기)
- ESI(Source) : 복사/비교할 때 목적지의 주소가 저장됨(쓰기)
- FLAG 레지스터(32비트)
: CPU의 현재 상태나 동작을 제어하는 비트들로 구성되어있다.. 제어 플레그, 상태 플레그 두 가지로 구분할 수 있다.
[제어 플레그]
- DF(Direction) : 문자열을 처리할 때, 플래그가 0이면 데이터 이동 주소 증가, 1이면 자동 감소
- IF(Interrupt) : 플래그가 0일 때 외부 인터럽트(일시정지) 요구 무시, 1일 때는 외부 인터럽트 요구 수용
- TF(Trap) : 플래그가 0일 때 기존의 명령 실행, 1일 때는 내부 인터럽트 발생
[상태 플레그]
- CF(Carry) : 산술 연산에서 빌림수 발생시 1로 설정
- AF(Adjust) : 16(8)bit 연산에서 빌림수 발생 시 1로 설정
- PF(Parity) : 연산의 결과가 짝수면 1, 홀수면 0으로 설정/ 패리티를 체크
- OF(Overflow) : 부호 "있는" 산술 연산의 결과가 오버플로가 발생했을 때 플래그를 1로 설정
- SF(Sign) : 산술 논리 연산의 결과가 음수일 때 플래그를 1로 설정
- ZF(Zero) : 산수 논리 연산의 결과가 0일 때 플래그를 1로 설정
- EIP 레지스터(32비트)
: Instruction 레지스터라고도 불리며, 다음에 실행할 명령어의 주소를 가리킴. 분기문을 사용해 변경(분기 명령어 : jmp, call, ret)
2. 어셈블리어
어셈블리(Assembly)란 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 기계어와 명령어가 1대1로 대응되는 단어들로 구성되어 있다. 고급언어는 컴파일하는 시간이 오래 걸리는 단점이 있는 반면 저급 언어는 컴퓨터와 가까운 언어이기 때문에 컴파일을 해도 간단한 명령으로 실행돼서 실행 속도가 괸장히 빠르다. 하지만 저급 언어는 배우기가 어렵고 유지 보수가 힘들다는 이유로 특수한 경우를 제외하고 사용되지 않고 있다.
cpu 에는 해당 프로세서에 명령을 내리기 위한, 고유의 명령어가 마련되어 있는데, 이 명령어들을 기계어 라고 한다. 기계어는 각 기계마다 규약된 숫자들의 규칙 조합으로, 기계어로 프로그래밍을 하기엔 매우 난해함. 가독성이 떨어지는 숫자를 대체하고자 기계어와 일대일 대응관계를 형성한 언어가 어셈블리 언어이다.
CPU 종류마다 고유한 어셈블리어를 사용한다. 어셈블러 종류에 따라 채택 가능한 문법이 다르다.
GAS(GNU Assembler) - AT&T 문법
Section
어셈블리 프로그램은 세 가지의 section으로 구성되어 있다. 각 섹션은 메모리의 구조를 알고 있다면 이해하기 쉬울 것 같다.
- section.data
초기값이 있는 전역 변수 혹은 static 변수를 선언하는 공간이다. 상수, 파일 이름, 버퍼 사이즈 등을 이곳에 선언할 수 있다.
- section.text
실행할 코드를 작성하는 공간이다.
- section.bbs
추가적으로 변수를 선언할 때 사용하는 공간이다.
어셈블리어의 명령어 수행 방식
명령어 | 피연산자_1 | 피연산자_2 |
MOV | RAX | 1 |
위와 같이 맨 앞에 명령어가 오고 그 후에 레지스터가 오게 된다.
3. 디버거 설치 및 사용방법 익히기
OllyDbg 설치하기
디버거로는 올리디버거를 설치할 것이다.

올리디버거 최신 버전을 다운 받아준다. 실행파일을 올리디버거를 옮기면 실행할 수 있다.

파일에 Plugin, UDD 폴더를 생성하고 ddl 파일이 있다면 UDD 파일에 넣어준다.

Option>Appearance>Directories 에서 UDD path와 Plugin Path를 이전에 만든 경로로 설정해준다.
UDD란 올리디버거를 사용하면서 생성되는 백업파일이고,
Plugin 파일은 올리디버거를 사용할 때 추가적으로 지원되는 기능을 사용하기 위해 설치하는 파일이다.
이 두 파일들이 OllyDbg 폴더에 자동적으로 생성되는 것을 방지해준다.

Options>Debugging Option>Events에서
WinMain(if location is known) -> Entry point of main module로 바꿔준다.

- Code Window: 기본적으로 disassembly code를 표시하여 각종 comment, label을 보여주며, 코드를 분석하여 loop, jump 위치 등의 정보를 표시
- Register Window: CPU Register 값을 실시간으로 표시하며 특정 register들은 수정도 가능
- Dump Window: 프로세스에서 원하는 memory 주소 위치를 Hex/ASCII/유니코드 값으로 표시하고 수정도 가능
- Stack Window: ESP Register7~ 가리키는 프로세스 stack memory를 실시간으로 표시하고 수정도 가능
디버거가 멈춘 부분은 EP(Entry Point) 코드로 exe 파일의 실행시작 주소이다. 여기서 EP란 Windows 실행파일의 코드 시작점을 의미한다. 프로그램이 실행될 때 CPU에 의해 가장 먼저 실행되는 코드 시작 위치라고 보면 된다.
- Address: 프로세스의 가상 메모리내의 주소
- Instruction: IA32(또는 x86) CPU 명령어
- Disassembled code: OP code를 보기 쉽게 어셈블리로 변환한 코드
- comment: 주석
+올리디버거 단축키
명령어 | 단축키 | 설명 |
Step Into | F7 | 하나의 OP code 실행(함수 내부로 들어감) |
Step Over | F8 | 하나의 OP code 실행(함수 내부로 안 들어감) |
Restart | Ctrl+F2 | 다시 디버깅시작(프로세스 종료하고 재실행시킴) |
Go to | Ctrl+G | 원하는 주소 찾아감(코드 확인할때 사용, 실행되는 것은 아님) |
Run | F9 | 실행(BP 걸려있으면 그 곳에서 실행 정지) |
Execute till return | Ctrl+F9 | 함수 코드 내에서 RETN 명령까지 실행(함수 탈출 목적) |
Execute till cursor | F4 | cursor 위치까지 실행(디버깅 주소까지 바로 갈 수 있음) |
Comment | : | Comment 추가 |
BP | F2 | BP(BreakPoint) 설정/해제 |
Edit data | Ctrl + E | 데이터 편집 |
Assemble | Space | 어셈블리 코드 작성 |
All referenced text string | 마우스 메뉴 Search for - All referenced text strings | 코드에서 참조되는 문자열 보기 |
All intermodular calls | 마우스 메뉴 Search for -All intermodular calls | 코드에서 호출되는 모든 API 함수 보기 |
Name in all modules | 마우스 메뉴 Search for - Name in all modules | 모든 API함수 보기 |
Copy to executble file | 마우스 메뉴 Copy to executable file | 파일의 복사본 생성(변경 사항 반영됨) |
'Reversing' 카테고리의 다른 글
[Reversing] Easy Keygen_WirteUp (0) | 2023.04.29 |
---|---|
PE 구조(2)__notepad.exe(메모장 프로그램) PE 헤더 분석 (0) | 2023.04.28 |
PE 구조 (0) | 2023.04.04 |
0201 메모리 구조, 스택, 스택 프레임 (0) | 2023.03.28 |
[Reversing] Easy Crack_WirteUp (0) | 2023.03.22 |