[Ghidra] Reversing Basic knowledge - 1

코코·2023년 4월 12일
0

Ghidra

목록 보기
3/4
post-custom-banner

리버스 엔지니어링은 하드웨어나 소프트웨어를 분석하여 구성이나 기능을 밝혀내는 기술


✔️ Disassemble vs Decompile

디스어셈블(disassemble) : Hex Code ➡ 어셈블리 언어 등의 저수준 언어로 변환
디컴파일(decompile) : Hex Code ➡ c언어와 같은 고수준 언어로 변환



이제부터 간단하게 CPU레지스터어셈블리어 기초를 살펴보려고 한다.


✔️ Register(레지스터)

우선 레지스터부터 살펴보자.

레지스터란 CPU에서 사용하는 작은 저장 공간으로, 용량은 적지만 속도가 빠르다는 장점을 가지고 있다.


첫 번째로 범용 레지스터이다.
레지스터명레지스터 의미주요 용도
EAXaccumulator 레지스터연산, 함수의 반환 값
EBXbase 레지스터데이터에 대한 포인터
ECXcounter 레지스터루프 처리 시 카운터
EDXdata 레지스터연산
ESPstack pointer 레지스터스택 Top에 대한 포인터
EBPbase pointer 레지스터스택 Base에 대한 포인터
ESIsource index 레지스터스트링 조작 시 소스 포인터
EDIdestination index 레지스터스트링 조작 시 목적지 포인터

두 번째는 상태 레지스터이다.

명칭개요
ZF(Zero Flag)연산 결과가 0일 때 세팅
SF(Sign Flag)연산 결과가 마이너스일 때 세팅
CF(Carry Flag)부호 없는 연산 결과가 오버플로했을 때 세팅
OF(Overflow Flag)부호 있는 연산으로 오버플로했을 때 세팅

세 번째는 세그먼트 레지스터이다.

레지스터명의미
CSCode Segment
DSData Segment
SSStack Segment
ESExtra Segment
FSF Segment
GSG Segment

마지막으로 다음에 실행할 명령어의 주소를 담고 있는 EIP 레지스터가 존재한다.


✔️ Memory 구조

메모리 영역에서는 프로그램의 코드와 사용하는 데이터가 구현된다.
메모리 공간은 크게 4개의 공간으로 분리하고 있다. 첫 번째는 코드(Code)영역, 두 번째는 데이터(Data)영역, 세 번째는 스택(Stack)영역, 네 번째는 힙(Heap) 영역이다.


  1. Code영역
    : 메모리의 코드(Code) 영역은 실행할 프로그램의 코드가 저장되는 영역으로 텍스트(Code) 영역이라고 불린다.

  2. Data영역
    : 메모리의 데이터(Data) 영역은 프로그램의 전역 변수 및 정적 변수(Static)가 저장되는 영역이다.

  3. Heap영역
    : 메모리의 힙(Heap) 영역은 사용자가 직접 관리할 수 있는 메모리 영역으로, Stack과 다르게 낮은 주소에서 높은 주소의 방향으로 할당된다.

  4. Stack영역
    : 메모리의 스택(Stack) 영역은 함수에서 사용하는 지역 변수 및 매개변수가 저장되는 영역으로, Heap과는 다르게 높은 주소에서 낮은 주소 방향으로 할당된다.




다음 글은 함수의 프롤로그와 에필로그, 함수 호출 규약에 대해서 정리해봐야겠다~!!👋


-끗-

profile
화이팅!
post-custom-banner

0개의 댓글