본문 바로가기

2. Reversing (리버싱)/2) 개념 정리

[2025.03.29] 리버싱난다_2주차 활동

참조 강의: 유튜브 Fin 강의

 

5강. 스택 (Stack)

스택의 역할

1. 함수 내 변수 임시저장

2. 함수 호출 시 매개변수(파라미터) 전달

3. 복귀 주소 저장

 

스택의 특징

FILO (First - In - Last - Out) 선입후출 방식

Push: 스택에 데이터를 넣는 작업

Pop: 스택에 마지막으로 들어온 데이터를 빼는 작업

Top: 스택의 가장 위에 들어있는 값

Bottom: 스택의 가장 아래에 들어있는 값

 

스택에서 중요한 레지스터

ESP: 스택 포인터, 유동적으로 값이 바뀜

EBP: ESP의 값을 저장해 둠, 부동적인 레지스터

 

6강. 스택 프레임 (Stack Frame)

EBP를 이용하여 스택 내의 변수 파라미터 복귀 주소에 접근하는 기법

 

예시 어셈블리 코드)

Push EBP   // EBP 스택에 백업

MOV EBP, ESP  // (EBP = ESP) ESP를 EBP에 저장함으로써 ESP 백업 

.      // 함수가 실행되는 부분

.    // 실행 부분에서 ESP 값 변경돼도 백업 돼 있기 때문에 상관없다

MOV ESP, EBP   // ESP 복원

POP EBP   //EBP 복원

 

ESP 값이 얼마나 변하든 EBP를 기준으로 안전하게 해당 변수나 파라미터, 복귀 주소에 접근이 가능하다.

하지만 스택에 값을 저장해둔다는 점에서 보안상 취약해질 수 있으므로 주의해야 한다.

 

7강. 크랙미 실습

 

cmp = if 구문

je, jz = jmp equal

jmp = jmp zero (무조건 jmp 실행시킴)

je > jmp로 메모리 변조

cmp구문의 zero flag값이 1이 되지 않아 바로 실패 창으로 넘어가는 상황

je 대신 jmp로 메모리 변조를 해줌으로서 바로 성공 화면으로 넘어가게 해 주면 된다.

8강. 함수호출규약

함수를 호출할 때 매개변수(파라미터)를 어떤 식으로 전달하는지에 대한 약속

 

1. Caller(호출자): 함수 호출

2. Callee(피호출자): 함수 호출 당함

 

함수 호출 규약

1. Cdecl

C언어에서 사용된다.

Caller(호출자)에서 스택을 정리한다.

 

2. Stdcall

Win32 API에서 사용된다.

Callee(피호출자)에서 스택을 정리한다.

 

3.Fastcall

Stdcall과 동일하지만 x64아키텍처에서 사용된다.

ECX, ESX, RDX, RCX 레지스터를 이용해 더 빠른 호출이 가능하다.

매개변수 값이 여러개일때 최대 두 개까지 레지스터를 통해 전달하고 나머지는 스택으로 이동시킨다.

9강. PE FILE FORMAT

PE FILE: windows OS에서 실행 가능한 파일

* PE는 32비트 용어, 64비트 PE FILE표기: PE+, PE32+

 

PE FILE의 헤더부분은 PE FILE의 핵심 부분으로 수많은 정보가 구조체 형태로 저장돼 있다. 

 

PE FILE 종류

실행 계열: EXE, SCR(소스코드 확장자)

드라이브 계열: SYS, VXD

Library 계열: DLL, OCX, CPL, DRV

OBJ 계열: OBJ  ->실행할 수 없지만 PE FILE에 포함돼 있다. 

   object 파일은 원래 실행이 불가능하다.

10강. DOS HEADER

PE FILE 헤더 구성

DOS Header - DOS Stub - NE Header - Section Header

 

VA & RVA 

VA: Virtual Adress

절대주소(고유한 경로) 변할 수 없는 값이기 때문에 잘 사용하지 않는다.

RVA: Relative-Virtual Adress

상대 주소(현재 위치를 기준으로 파일의 상대적인 경로를 입력)

 

ImageBase: 변수(현재위치)

RVA + ImageBase = VA

 

Relocation(재배치): 상대주소가 빈 공간을 찾는 과정

재배치가 발생했을 때 쉽게 주소를 바꿀 수 있기 때문에 RE FILE헤더에서 VA보다 RVA를 많이 사용함

 

MS-DOS에서 호환성을 위해 만든 헤더

IMAGE_DOS_HEADER 구조체: window의 모든 프로그램 앞에 존재

e_magic: DOS의 Signature, 아스키코드로 MZ(헥사코드로 4D 5A)를 나타낸다.

e_lfanew: NT Header의 오프셋을 표시한다.