또 뭐하지
[기초] 리버싱 개념 간략 정리 본문
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 : 기계 코드가 실행되는 한 번의 과정
- Fecth : 다음 실행할 명령어를 읽어옴
- Decode : 읽어온 명령어 해석
- 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 레지스터)
'I.sly() > 9기 기초 - 공통' 카테고리의 다른 글
[기초] 포너블 개념 간략 정리 (0) | 2024.05.17 |
---|---|
[기초] 리버싱 기초 문제 (Linux) (0) | 2024.05.09 |
[기초] 웹 해킹 개념 간략 정리 (0) | 2024.04.04 |
[기초] 웹 개념 간략 정리 (0) | 2024.03.28 |
[기초] OverTheWire:Bandit - level 0~level 6 (0) | 2024.03.28 |