Tiny Bunny

동아리/전체 활동

[8기 기초] 5주차

bento 2023. 11. 8. 02:03

리버싱

1. 소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석

2. 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조 파악

3. 이를 바탕으로 원래의 소스가 어떻게 작성된 것인지 알아냄

→ 패치, 크랙, 게임 핵 제작 등에 이용됨

 

  • 정적 분석 방법 (Static Analysis)

파일을 실행하지 않고 겉모습을 관찰하여 분석하는 방법

파일 종류나 크기, 헤더(PE) 정보, API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것

 

  • 동적 분석 방법 (Dynamic Analysis)

파일을 직접 실행시켜 분석하고 디버깅 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법

파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램 행위 분석

디버거를 이용하여 프로그램의 내부 구조와 동작 원리 분석 가능


ASCII

: 미국 국립 표준 협회(ANSI)에서 표준화한 정보교환용 7비트 부호체계


Byte Order

엔디안(Endianness)

: 컴퓨터 메모리와 같은 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법

 

  • 빅 엔디안(Big-endian)

최상위 바이트(MSB - Most Significant Byte)부터 차례로 저장하는 방식

 

  • 리틀 엔디안(Little-endian)

최하위 바이트(LSB - Least Significant Byte)부터 차례로 저장하는 방식


Memory Structure

Memory

: 프로그램의 실행을 위해 컴퓨터의 운영체제에서 할당하는 공간

RAM (=주기억장치, 메모리) ROM
자유롭게 읽고 쓸 수 있는 기억장치
사용 중인 프로그램이나 데이터가 저장됨 휘발성 메모리
기억된 내용을 읽을 수만 있는 기억 장치
변경 가능성이 없는 시스템 소프트웨어를 기억시키는 데 이용 비휘발성 메모리

 

메모리 공간

1.Stack 영역

- 함수 호출과 관계되는 지역변수와 매개변수가 저장되는 영역

- 함수 호출과 함께 할당되며, 호출 완료되면 소멸

- 스택 프레임 : 스택 영역에 저장되는 함수 호출 정보

- 푸시(push) 동작 : 데이터 저장

- 팝(pop) 동작 : 데이터 인출

- 동작 방식 : 후입선출(LIFO, Last-In First-Out) → 가장 늦게 저장된 데이터가 가장 먼저 인출됨

- 메모리의 높은 주소 → 낮은 주소 방향으로 할당

 

2.heap 영역

- 사용자가 직접 관리하는 메모리 영역

- 사용자에 의해 메모리 공간이 동적 할당되고 해제됨

- 메모리의 낮은 주소 → 높은 주소 방향으로 할당

- 동작 방식 : 선입선출(FIFO, First-In First-Out) → 가장 먼저 들어온 데이터가 먼저 인출됨

 

3.data 영역

- 프로그램의 전역변수와 정적변수가 저장되는 영역

- 프로그램 시작과 함께 할당되며, 종료 시 소멸

 

4.code 영역

- 실행할 프로그램의 코드가 저장되는 영역

- 텍스트(text) 영역이라고도 부름

- CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리함


Instruction Cycle

: 기계 코드가 실행되는 한 번의 과정

 

  • Fetch : 다음 실행할 명령어를 읽어옴
  • Decode : 읽어온 명령어 해석
  • Execute : 해석한 명령어 실행

Computer Structure

  • CPU (중앙처리장치): 프로그램을 실행하고 입력된 데이터를 처리
  • Memory (주기억장치): 실행 중인 프로그램(=프로세스)와 프로그램 실행에 필요한 데이터를 일시적으로 저장
  • Disk (보조기억장치): 프로그램과 데이터를 영구적으로 저장

 

  • 프로그램: 컴퓨터를 실행시키기 위해 차례대로 작성된 명령어 모음
  • 프로세스: 정적 프로그램이 메모리에 올라와서 실행 가능해진 상태

 

  • 레지스터: CPU에서 명령어를 실행하는 동안 필요한 정보를 저장하는 기억 장소

레지스터의 개수와 크기는 중앙처리장치 종류에 따라 다르며 목적에 따라 레지스터 종류가 나눠짐(전용/범용)

EAX 산술 연산 및 논리 연산 수행
EBX 메모리 주소 저장
ECX 반복문 사용 시 반복 카운터로 사용
반복할 횟수 지정하고 반복 작업 수행
EDX EAX 레지스터와 같이 쓰임
부호 확장 명령 등에 사용
큰 수의 곱셈 또는 나눗셈 연산
EDI 복사할 때 목적지 주소 저장
ESI 데이터를 조작하거나 복사할 때 데이터의 주소 저장
ESP 메모리 스택의 끝 지점 주소 포인터
EBP 메모리 스택의 첫 시작 주소 포인터
EIP 명령어 포인터 레지스터
용도가 엄격하게 정해져 있으며, 다음에 실행될 명령어가 위치한 주소를 가리킴

 

Assembly Language

Intel & AT&T

  Intel AT&T
레지스트리 표현 eax %eax
상수 표현 h(16진수), b(2진수), o(6진수)
ex) 80h
$숫자
ex)$0x80
operands 위치 <instr> <dest> <src> <intr> <src> <dest>
메모리 주소 참조 [eax] (%eax)
레지스터+offset 위치 [eax+숫자] 숫자(%eax)

 

Intel

 

mov a b: b(데이터)를 a로 복사

lea a b: b(주소)를 a에 저장

push a: a(레지스터)의 값을 스택에 저장

pop a: 스택의 값을 a(레지스터)로 가져옴

inc a: a의 값을 1 증가

dec a: a의 값을 1 감소

add a b: a에 b를 더함(a+=b)

sub a b: a에서 b를 뺌(a-=b)

jmp a: a(주소)로 가서 명령어 실행

cmp a b: a와 b를 비교. 이후에 분기문이 나옴. 조건 점프 명령어나 조건 이동 명령어 와 사용

je(jump equal) a: 비교한 값이 같으면 a(주소)로 가서 명 령어 실행

jne(jump not equal) a: 비교한 값이 다르면 a(주소)로 가서 명 령어 실행

call A: A 함수를 call하고 그 주소로 제어를 옮김. EIP를 변경시킴

ret: Return. 호출된 함수에서 호출한 함수로 복귀. ESP에 있는 값을 꺼내 EIP에 할당

728x90

'동아리 > 전체 활동' 카테고리의 다른 글

[9기] 설명 자료  (0) 2024.03.10
[8기 기초] 6주차  (0) 2023.11.11
[8기 기초] 4주차  (0) 2023.10.16
[8기 기초] 3주차  (0) 2023.10.07
[8기 기초] 2주차  (0) 2023.09.24