어셈블리어 이해
어셈블리어란? (Assembly language)
- 기계어와 1:1로 대응되는 저급 언어
- CPU마다 지원하는 Operation & Register가 상이
레지스터
- CPU에서 연산을 처리할 때 사용되는 고속의 기억장치
- 범용 레지스터, 세그먼트 레지스터, FLAG 레지스터, RIP 레지스터

어셈블리어 명령어 구성
- 명령은 Opcode와 Operand로 구성
- Opcode : 명령에서 실행할 동작을 나타내는 코드 (call, jump, push, mov, lea 등)
- Operand : 피연산자로, 연산 대상을 의미함 (rbp, rsp, rax, eax 등)
어셈블리어 명령어
- Opcode
- mov : mov operand1, operand2
- Operand2의 값을 Operand1에 복사
- lea : lea operand1, operand2
- Operand2의 주소를 Operand1에 복사
- push : 스택에 값을 저장
- pop : 스택에서 값을 가져옴
- leave : mov rsp, rbp
- pop rbp
- ret : pop rip
- jmp rip
- add : add operand1, operand2
- 첫 번째 operand와 두 번째 operand 덧셈 연산
- sub : sub operand1, operand2
- 첫 번째 operand와 두 번째 operand 뺄셈 연산
- inc : inc operand
- operand의 값을 1 증가
- dec : dec operand
- operand의 값을 1 감소
- cmp : cmp operand1, operand2
- 첫 번째 opernad에서 두 번째 operand를 뺄셈하여 비교
- 뺄셈하여 0이 나오면 1과 2는 같은 값으로 보며, 이 때 Zero Flag는 1이 된다.
- test : test operand1, operand2
- 첫 번째 Opernad와 두 번째 Operand를 AND 연산 수행
- call : 함수 호출
- jmp : 특정 주소로 실행 흐름 변경
- rep : rcx가 0이 될 때까지 반복
- mov : mov operand1, operand2
범용 레지스터
- 논리, 산술 연산에 사용되는 operand나 주소 계산을 하기 위해 사용되는 레지스터
- 64bit(8byte) → r로 시작함, 32bit(4byte) → e로 시작함
- rsp : 사용중인 스택의 위치를 가리키는 레지스터
- rbp : 스택의 Base point를 가리키는 레지스터
- rsi : 출발지 주소를 저장하는 레지스터 (복사한 데이터 저장)
- rdi : 목적지 주소를 저장하는 레지스터 (복사된 데이터 저장)
- rdx : 다른 레지스터를 서포트
- rax : 산술, 논리 연산을 수행하거나 함수의 반환값을 저장
- rbx : 메모리 주소를 저장하기 위한 레지스터
- rcx : 반복문에서 카운터로 사용되는 레지스터
세그먼트 레지스터
- 16bit 크기
- 각 세그먼트의 위치를 나타내는 레지스터
- CS, DS, SS, ES, FS, GS 총 6개로 구성
- CS : 코드 세그먼트의 시작 주소
- DS : 데이터 세그먼트의 시작 주소
- SS : 스택 세그먼트의 시작 주소
- ES, FS, GS : 추가 세그먼트를 가리키는 시작 주소
FLAG 레지스터, RIP 레지스터
- FLAG 레지스터는 EFLAGS로, 프로그램의 수행 상태를 비트 단위로 나타내는 레지스터
- RIP 레지스터는 다음에 수행해야 할 명령어의 위치를 저장하고 있는 레지스터
- CF : 마지막 산술 연산이 레지스터 크기를 초과하여 비트를 빌리거나 올림이 발생한 경우
- PF : 최하위 비트가 0인 경우
- AF : 산술연산에서 BCD 숫자의 캐리가 발생한 경우
- ZF : 연산 결과가 0인 경우
- SF : 연산 결과가 음수인 경우
- TF : 한 번에 하나의 연산만 수행하고, 디버거에서 중단점을 설정한 곳에 TF 설정
- IF : 인터럽트가 사용가능한 경우
- DF : 스트림 데이터를 이동시키거나 비교할 때 왼쪽이나 오른쪽의 방향을 결정
- OF : 산술 연산 후 상위 비트의 오버플로우를 표현
Big Endian, Little Endian
- Big Endian : 큰 데이터가 먼저 저장되는 방식
- Little Endian : 작은 데이터가 먼저 저장되는 방식

Linux 이해
메모리 영역
- Code Segment, Data Segment, BSS Segment, Stack, Heap
- Segmentation, 메모리 관리 및 보호를 위한 기술

Code Segment
- 실행 가능한 명령어 위치
- 읽기, 실행이 가능한 영역
Data Segement
- 초기화 된 데이터 또는 상수 위치
- 읽기, 쓰기가 가능한 영역
BSS Segment
- 초기화되지 않은 데이터 위치
- 읽기, 쓰기가 가능한 영역
Stack
- 높은 주소부터 차례로 쌓임
- 함수 호출과 함께 할당되는 공간으로, 지역 변수와 매개변수가 저장되는 영역
- 읽기, 쓰기가 가능한 영역
Heap
- 동적으로 할당되는 영역
- 읽기, 쓰기가 가능한 영역
- 이 부분을 오버플로우시켜 수행하는 공격을 힙 버퍼 오버플로우라고 함
system & exec 계열 함수
- 명령어를 수행하는 함수
- 인자로 “/bin/sh”, “/bin/bash” 등을 전달하여 Shell을 획득할 때 사용
- exec 계열 함수 : execl, execlp, execle, execv, execvp, execvpe
'Pwnable' 카테고리의 다른 글
| Integer Overflow (0) | 2025.11.19 |
|---|---|
| Format String Bug (0) | 2025.11.19 |
| Buffer Overflow (0) | 2025.11.19 |
| Pwnable Tools (0) | 2025.11.19 |
| Pwnable 방법론 (0) | 2025.11.19 |