또 뭐하지

[기초] 리버싱 개념 간략 정리 본문

I.sly()/9기 기초 - 공통

[기초] 리버싱 개념 간략 정리

mameul 2024. 5. 9. 11:01
728x90

1. Reversing

Reversing : 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 작업

정적 분석 방법 (Static Analysis) : 파일을 실행하지 않고 겉모습을 관찰하여 분석하는 방법
동적 분석 방법 (Dynamic Analysis) : 파일을 직접 실행시켜 분석하고 디버깅 통해 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법

2. ASCII

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

파이썬 아스키코드 변환

  • ord() : 문자 -> 아스키코드 값
  • chr() : 아스키코드 값 -> 문자

3. Byte Order

엔디안 (Endianness) : 1차원 공간에 여러 개의 연속된 대상을 배열하는 방법

빅 엔디안(Big-endian) : 최상위 바이트(MSB)부터 차례로 저장
리틀 엔디안(Little-endian) : 최하위 바이트(LSB)부터 차례로 저장

예시 빅 엔디안 리틀 엔디안
0x12345678 0x12 / 0x34 / 0x56 / 0x78 0x78 / 0x56 / 0x34 / 0x12

4. Memory Structure

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

  • RAM (주기억장치, 메모리) : 사용 중인 프로그램이나 데이터가 저장되는 휘발성 메모리
  • ROM : 시스템 소프트웨어를 기억하는 비휘발성 메모리

메모리 공간 분류

(1) Stack 영역

  • 함수 호출과 함께 할당, 호출 완료시 소멸, 지역변수와 매개변수 저장
  • 스택 프레임 : 스택 영역에 저장되는 함수 호출 정보
  • Push (데이터 저장), Pop (데이터 인출)
  • 동작방식 : 후입선출(LIFO)

(2) heap 영역

  • 실행중에 동적으로 할당
  • 스택 세그먼트와 반대 방향으로 자람(충돌 방지)

(3) data 영역

  • 프로그램의 전역변수와 정적변수가 저장되는 영역
  • 프로그램 시작과 함께 할당, 종료 시 소멸

(4) code 영역 = text 영역

  • 실행할 프로그램의 코드가 저장되는 영역
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리

5. Instruction Cycle

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

  1. Fecth : 다음 실행할 명령어를 읽어옴
  2. Decode : 읽어온 명령어 해석
  3. Execute : 해석한 명령어 실행

1,2,3의 과정을 반복

6. Computer Structure

CPU(중앙처리장치) : 프로그램을 실행하고 입력된 데이터를 처리
Memory(주기억장치) : 실행 중인 프로그램(=프로세스)와 프로그램 실행에 필요한 데이터를 일시적으로 저장
Disk(보조기억장치) : 프로그램과 데이터를 영구적으로 저장
프로그램 : 컴퓨터를 실행시키기 위해 차례대로 작성된 명령어 모음
프로세스 : 정적 프로그램이 메모리에 올라와서 실행 가능해진 상태

 

레지스터 : CPU에서 명령어를 실행하는 동안 필요한 정보를 저장하는 기억 장소, 중앙처리장치 종류에 따라 개수와 크기가 다름
목적에 따른 레지스터 분류

  • 범용 레지스터(General Register): 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
  • 세그먼트 레지스터(Segment Register): 과거에는 메모리 세그먼테이션이나, 가용 메모리 공간의 확장을 위해 사용했으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터이다. x64에는 cs, ss, ds, es, fs, gs가 있다.
  • 플래그 레지스터(Flag Register): CPU의 상태를 저장하는 레지스터
  • 명령어 포인터 레지스터(Instruction Pointer Register, IP): CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.

7. Assembly Language

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

 

Intel Syntax : <명령어> <피연산자1><피연산자2> ;주석

ex) mov eax, 5

  • 데이터 이동 : mov, lea
  • 스택 조작 : push, pop
  • 연산 : inc, dec, add, sub
  • 흐름 제어 : jmp, cmp, je, jne
  • 프로시저 : call, ret

8. How to Reverse Engineering?

Debugger : 디버거 툴은 Breakpoint(중단점)을 잡고, 그때의 레지스터 값을 관찰하며 소프트웨어를 분석하는데 사용

  • OllyDbg(Win GUI, x86) 
  • gdb, pwndbg(Linux CLI)

x/print 명령어 : 프로그램 실행 시 메모리를 검사할 때 사용

-  형식 : (gdb) x/옵션 기준점 (기준점 : 메모리 주소 or 레지스터)