[유튜브] 리버싱 핵심원리_Ch 00. 악성코드 분석 개요
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
: 스택을 이용한 함수 매개변수 전달