리버스 엔지니어링은 하드웨어나 소프트웨어를 분석하여 구성이나 기능을 밝혀내는 기술
디스어셈블(disassemble) : Hex Code ➡ 어셈블리 언어 등의 저수준 언어로 변환
디컴파일(decompile) : Hex Code ➡ c언어와 같은 고수준 언어로 변환
이제부터 간단하게 CPU 및 레지스터와 어셈블리어 기초를 살펴보려고 한다.
우선 레지스터부터 살펴보자.
레지스터란 CPU에서 사용하는 작은 저장 공간으로, 용량은 적지만 속도가 빠르다는 장점을 가지고 있다.
레지스터명 | 레지스터 의미 | 주요 용도 |
---|---|---|
EAX | accumulator 레지스터 | 연산, 함수의 반환 값 |
EBX | base 레지스터 | 데이터에 대한 포인터 |
ECX | counter 레지스터 | 루프 처리 시 카운터 |
EDX | data 레지스터 | 연산 |
ESP | stack pointer 레지스터 | 스택 Top에 대한 포인터 |
EBP | base pointer 레지스터 | 스택 Base에 대한 포인터 |
ESI | source index 레지스터 | 스트링 조작 시 소스 포인터 |
EDI | destination index 레지스터 | 스트링 조작 시 목적지 포인터 |
두 번째는 상태 레지스터이다.
명칭 | 개요 |
---|---|
ZF(Zero Flag) | 연산 결과가 0일 때 세팅 |
SF(Sign Flag) | 연산 결과가 마이너스일 때 세팅 |
CF(Carry Flag) | 부호 없는 연산 결과가 오버플로했을 때 세팅 |
OF(Overflow Flag) | 부호 있는 연산으로 오버플로했을 때 세팅 |
세 번째는 세그먼트 레지스터이다.
레지스터명 | 의미 |
---|---|
CS | Code Segment |
DS | Data Segment |
SS | Stack Segment |
ES | Extra Segment |
FS | F Segment |
GS | G Segment |
마지막으로 다음에 실행할 명령어의 주소를 담고 있는 EIP 레지스터가 존재한다.
메모리 영역에서는 프로그램의 코드와 사용하는 데이터가 구현된다.
메모리 공간은 크게 4개의 공간으로 분리하고 있다. 첫 번째는 코드(Code)영역, 두 번째는 데이터(Data)영역, 세 번째는 스택(Stack)영역, 네 번째는 힙(Heap) 영역이다.
Code영역
: 메모리의 코드(Code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(Code) 영역이라고 불린다.
Data영역
: 메모리의 데이터(Data) 영역은 프로그램의 전역 변수 및 정적 변수(Static)가 저장되는 영역이다.
Heap영역
: 메모리의 힙(Heap) 영역은 사용자가 직접 관리할 수 있는 메모리 영역으로, Stack과 다르게 낮은 주소에서 높은 주소의 방향으로 할당된다.
Stack영역
: 메모리의 스택(Stack) 영역은 함수에서 사용하는 지역 변수 및 매개변수가 저장되는 영역으로, Heap과는 다르게 높은 주소에서 낮은 주소 방향으로 할당된다.
다음 글은 함수의 프롤로그와 에필로그, 함수 호출 규약에 대해서 정리해봐야겠다~!!👋
-끗-