내용정리

[유튜브] 리버싱 핵심원리_Ch 00. 악성코드 분석 개요

suuuullloc 2023. 10. 2. 23:24

1. 프로그램 Execution

Source Code --Compiler--> 기계어 --Linker--> 실행파일 --Loader--> 메모리

 

2. IA32 Register

# Register란?

 : 작은 데이터의 임시 저장 공간

 : 연산처리 및 번지지정을 도와 줌

 : CPU 내부에서 각 용도에 맞는 다양한 레지스터들이 존재

 ex) ESP, EBP

 

# General Register

 : 연산결과를 받거나 연산에 직접 사용될 수 있는 레지스터

 : 필요에 따라 자유롭게 사용할 수 있다.

 ex) EAX, EBX, ECX, EDX

 

# Index Register

 : 연산과 간접 번지 지정에 사용

 : 문자열을 비교하거나 전송하는 스트링 명령에서는 다음과 같이 사용됨

 ex) ESI, EDI

 

# 자주 쓰이는 Status Flag

 ex) CF, ZF, SF, OF

 

# Pointer Register

ESP (Stack Pointer) - Full Descending 방식을 사용하는 Intel Architecture의 경우, 가장 최근에 스택에 입력된 데이터를 가리킴
EBP (Base Pointer) - Stack Frame을 사용할 경우 현재 실행 중인 함수가 사용하는 stack frame의 바닥을 가리킴
EIP (Instruction Pointer) - 다음에 수행될 명령어 주소
- CS 세그먼트 레지스터와 한 쌍이 되어 실행 번지를 참조

* Stack Frame : 현재 수행 중인 함수의 스택 영역을 나타내며 ESP와 EBP 사이의 공간을 의미

 

# Segment Register

 ex) CS, DS, SS, FS

 : 32비트 이상 프로세스 -> segment가 필요없이 CS, DS, SS의 시작점이 모두 0

 

# Debug Register

 : Hardware Breakpoint에 사용되는 레지스터

 : 총 6개의 레지스터가 사용됨

 

3. IA32 Command

# Opcode  Destination-Operand-1  Source-Operand-2

 

# MOV

 : 데이터 복사

 

# MOVZX

 : source operand의 내용을 destination operand로 복사

 : 남는 공간은 모두 0으로 채움

 

# MOVSX

 : source operand의 사이즈가 destination operand의 사이즈보다 작은 경우, sign bit 유지 & 나머지는 0으로 채움

 

# MOVS

 : ESI가 가리키는 주소에 있는 데이터를 EDI가 가리키는 주소로 복사

 

# 산술연산

 ex) ADD, SUB, MUL, DIV

 

# 논리연산

 ex) AND, OR, XOR

 

# Shift

 ex) SHL, SHR

 : 피연산자의 비트를 이동시키는 명령어

 

# LEA (Load Effective Address)

 : 두 번째 operand의 effective address를 계산하여 첫 번째 operand에 저장한다.

 

# PUSH

 : Stack에 데이터를 저장 -> ESP 값은 자동으로 조정됨

 : 함수 인자 전달, 지역 변술글 위한 공간 할당, 단순 백업

 

# POP

 : ESP가 가리키는 곳에 저장된 내용을 destination operand에 저장 후 ESP 값을 증가시킨다.

 

# 프로그램의 흐름을 변경하는 명령 : JMP, CALL, RET

 

# LEAVE

 : Stack frame을 릴리즈하는데 사용하는 명령어

 

4. 메모리 구조 & 이용

# Virtual Address

 : 메인 메모리를 실제 메모리로 보았을 때 응용 프로그램 입장에서 메모리를 사용할 때 보이는 메모리

 : 운영체제와 마이크로 프로세서의 도움을 통해서 구현됨

 : 구현을 위해서 segment와 paging 개념이 사용됨

 

# Stack

 : LIFO (Last In First Out) 원칙을 가지는 자료 구조

 : Architecture level에서의 Stack 용도

  - 임시 데이터 백업

  - 지역 변수 저장

  - 함수 매개변수 전달

  - 함수 호출관련 정보

  - SO에서 필요 시

 : Type

  - Full Stack : TOP이 스택에 마지막에 PUSH된 데이터를 가리킴

  - Descending Stack : 높은 주소에서 시작하여 낮은 주소 방향으로 자라남

 

# Stack Frame

 : 모든 함수는 자신만의 고유의 stack 영역 (stack frame)을 가질 수 있음

 : 함수의 stack frame 시작점은 EBP 레지스터가 가리킴

 : 스택 프레임을 사용하지 않을 수도 있음

 

# 스택을 이용한 함수 매개변수 전달

 : PUSH

 : MOVS

 

# 함수 call

 : 스택을 이용한 함수 매개변수 전달