Hacker한 나라의 앨리스
드림핵 Phase1_01 본문
들어가며
공부를 시작하기 전에, 학습 흐름에 참고가 될 수 있도록 여태까지 학습 과정을 간단하게 정리하겠습니다.
[기존 공부 스택]
- 기간 : 2026.02 ~ 2026.05
- 내용 : 정보통신개론 → 정보보안개론 → 드림핵(일부) → 정보보안기사필기이론서(법 제외) → K-Shield 주니어
- 드림핵 Path : Dream Beginners → Linux 101 → Building a Web Service
- 특이사항 : 보안 공부 전에 Python, php, React 등 기초 수준의 공부 및 약간의 개발 했음
Hacker한 나라의 앨리스의 이론 공부는 드림핵의 Path와 자격증 공부를 기반으로 구성하였습니다.세부 학습 계획은 Phase가 바뀔 때마다 간단하게 소개할 예정입니다.
[드림핵 Phase1]
1. Assembly Language
2. Security awareness training
또한, 앞으로의 포스팅은 공부 과정에서 정리한 원본을 기반으로 재구성한 학습 기록입니다.
필요하실 경우, 흐름만 참고 부탁드립니다.
어셈블리어를 배우기 전에 알아야 할 컴퓨터 기초
어셈블리어를 공부하다 보면 레지스터, 메모리, 주소, 비트 연산 같은 단어가 계속 등장한다. 처음부터 명령어를 외우려고 하면 금방 헷갈리기 때문에, 먼저 컴퓨터가 데이터를 어떻게 표현하고 다루는지 큰 그림을 잡아두는 편이 좋다.
이번 글에서는 어셈블리어를 읽기 전에 알아두면 좋은 기본 개념을 정리한다.
진법
컴퓨터는 데이터를 0과 1로 표현한다. 그래서 시스템 프로그래밍이나 리버싱을 공부할 때는 2진수와 16진수를 자주 보게 된다.
| 진법 | 의미 | 예시 |
| 2진법 | 0과 1로 수를 표현 | 0b1010 |
| 10진법 | 우리가 일상적으로 쓰는 숫자 표현 | 10 |
| 16진법 | 0~9, A~F로 수를 표현 | 0xA |
16진수는 2진수를 사람이 읽기 쉽게 줄여 쓰는 방식이라고 볼 수 있다. 예를 들어 2진수 1010은 16진수로 A이고, 보통 프로그래밍에서는 앞에 0x를 붙여 0xA처럼 표기한다.
비트와 바이트
비트(bit)는 컴퓨터가 다루는 가장 작은 데이터 단위다. 하나의 비트는 0 또는 1 중 하나의 값만 표현할 수 있다.
바이트(byte)는 8개의 비트로 구성된다.
1 byte = 8 bits
8비트로 표현할 수 있는 경우의 수는 2^8, 즉 256가지다. 그래서 1바이트는 0~255 범위의 값을 표현할 수 있다.
비트를 읽을 때는 위치도 중요하다.
| 용어 | 의미 |
| MSB | Most Significant Bit, 가장 왼쪽에 있는 비트 |
| LSB | Least Significant Bit, 가장 오른쪽에 있는 비트 |
부호가 있는 정수를 표현할 때는 보통 MSB를 부호 비트로 사용한다. MSB가 0이면 양수, 1이면 음수로 해석한다. 음수 표현에는 2의 보수 방식이 사용된다.
바이트 오더링
2바이트 이상의 데이터가 메모리에 저장될 때는 어떤 바이트를 낮은 주소에 먼저 둘지 정해야 한다. 이 방식을 바이트 오더링이라고 한다.
대표적인 방식은 빅 엔디안과 리틀 엔디안이다.
| 방식 | 저장 순서 | 주로 사용되는 곳 |
| 빅 엔디안 | 최상위 바이트부터 낮은 주소에 저장 | 네트워크 전송 |
| 리틀 엔디안 | 최하위 바이트부터 낮은 주소에 저장 | 대다수 개인용 컴퓨터와 서버 CPU |
예를 들어 0x12345678이라는 값을 메모리에 저장한다고 생각해보자.
빅 엔디안 : 12 34 56 78
리틀 엔디안 : 78 56 34 12
문자열은 보통 사람이 읽는 순서대로 저장되지만, 정수처럼 여러 바이트로 구성된 데이터는 시스템의 바이트 오더링에 따라 메모리에서 보이는 순서가 달라질 수 있다.
비트 연산
비트 연산은 값을 2진수로 보고 비트 단위로 계산하는 방식이다. 시스템 프로그래밍, 암호학, 리버싱, 익스플로잇 분석에서 자주 등장한다.
| 연산자 | 의미 | 설명 |
| x | y | OR | 둘 중 하나가 1이면 1 |
| x & y | AND | 둘 다 1이면 1 |
| x ^ y | XOR | 두 비트가 다르면 1 |
| ~x | NOT | 0은 1로, 1은 0으로 반전 |
비트 연산과 논리 연산은 비슷해 보이지만 목적이 다르다. 비트 연산은 실제 비트 단위 값을 계산하고, 논리 연산은 참과 거짓을 판단한다.
x & y // 비트 단위 AND
x && y // 논리 AND
시프트 연산도 자주 사용된다.
| 연산자 | 의미 |
| x << n | 비트를 왼쪽으로 n칸 이동 |
| x >> n | 비트를 오른쪽으로 n칸 이동 |
왼쪽 시프트는 보통 2^n을 곱하는 효과가 있고, 오른쪽 시프트는 2^n으로 나누는 효과가 있다. 특정 위치의 비트만 확인하고 싶을 때는 AND 연산과 시프트 연산을 조합해 비트 마스킹을 한다.
인코딩과 디코딩
컴퓨터는 모든 데이터를 숫자로 다룬다. 사람이 읽는 문자도 내부적으로는 숫자로 저장된다. 이때 데이터를 특정 형식으로 바꾸는 과정을 인코딩, 다시 원래 의미로 해석하는 과정을 디코딩이라고 한다.
ASCII
ASCII는 문자를 숫자로 표현하기 위한 표준 코드다. 7비트로 128개의 문자를 표현할 수 있고, 영어 알파벳과 숫자, 일부 특수문자를 포함한다.
'A' -> 65 -> 0x41
Unicode와 UTF
Unicode는 전 세계의 문자를 하나의 표준으로 표현하기 위한 문자 집합이다. 각 문자는 U+AC00처럼 고유한 번호를 가진다.
Unicode를 실제 메모리나 파일에 저장하는 방식에는 여러 인코딩 형식이 있다.
| 형식 | 특징 |
| UTF-8 | 가장 널리 쓰이는 가변 길이 인코딩 |
| UTF-16 | 16비트 단위 기반 인코딩 |
| UTF-32 | 모든 문자를 32비트로 표현 |
URL 인코딩과 Base64
URL에는 그대로 사용할 수 없는 문자가 있다. 공백이나 특수문자는 %20처럼 퍼센트 인코딩으로 변환된다.
Base64는 이진 데이터를 ASCII 문자로 표현하는 인코딩 방식이다. 파일, 이미지, 바이너리 데이터를 텍스트 기반 환경에서 다룰 때 사용된다. 원본 데이터를 6비트씩 나누고, 각 값을 Base64 문자표의 문자로 바꾼다. 길이가 맞지 않으면 = 문자를 패딩으로 붙인다.
운영체제
운영체제는 하드웨어와 사용자 프로그램 사이에서 자원을 관리하는 소프트웨어다. CPU, 메모리, 입출력 장치 같은 하드웨어를 효율적으로 나누어 쓰게 해준다.
운영체제의 주요 역할은 다음과 같다.
- 어떤 프로세스에 CPU를 줄지 결정한다.
- 각 프로세스에 메모리 공간을 할당하고 관리한다.
- 입출력 장치와 프로그램 사이의 데이터 흐름을 관리한다.
- 사용자와 컴퓨터 사이의 인터페이스를 제공한다.
운영체제는 크게 커널과 셸로 나누어 볼 수 있다.
| 구성 요소 | 역할 |
| 커널 | 하드웨어와 소프트웨어 사이의 핵심 제어 담당 |
| 셸 | 사용자가 운영체제에 명령을 내릴 수 있게 해주는 인터페이스 |
시스템 해킹에서 "셸을 획득했다"는 말은 공격자가 운영체제에 명령을 내릴 수 있는 실행 환경을 얻었다는 뜻이다. 그래서 어셈블리어를 공부할 때 운영체제와 셸의 개념은 단순한 배경지식이 아니라 실제 분석과 공격 흐름을 이해하는 데 중요한 기반이 된다.
정리
어셈블리어는 CPU가 실제로 처리하는 명령에 가까운 언어다. 그래서 문법 자체보다도 컴퓨터가 데이터를 표현하는 방식, 메모리에 저장하는 순서, 비트 단위 연산, 운영체제의 역할을 먼저 이해하는 것이 중요하다.
이번 글에서 정리한 핵심은 다음과 같다.
- 컴퓨터는 데이터를 2진수로 표현하고, 사람은 16진수로 읽기 쉽게 다룬다.
- 비트와 바이트는 메모리와 레지스터를 이해하는 기본 단위다.
- 멀티바이트 데이터는 엔디안 방식에 따라 메모리 저장 순서가 달라진다.
- 비트 연산은 마스킹, 플래그 확인, 암호화, 저수준 데이터 처리에 자주 쓰인다.
- 인코딩은 문자와 바이너리 데이터를 컴퓨터가 다룰 수 있는 형식으로 바꾸는 과정이다.
- 운영체제는 하드웨어 자원을 관리하고 사용자 프로그램이 실행될 수 있는 환경을 제공한다.