프로그램이 기계 수준에서 실제로 실행되기까지의 과정을 다루는 학문이다. 즉, 컴퓨터가 내부에서 어떤 식으로 작동하는지를 분석하고 이해하는 것
해킹, 리버싱, 포너블 등 보안 분야를 잘하려면 컴퓨터 구조에 대한 이해가 필수이다. 이러한 분야를 배울 때 프로그램이 어떻게 실행되는지 분석하는 과정에서 컴퓨터 구조를 잘 알고있는 것이 좋다.
컴퓨터의 두뇌 역할로 모든 연산과 명령어를 해석하고 실행하는 역할을 한다.
구성요소
연산 논리 장치(ALU): 덧셈, 뺄셈, 논리 연산 수행
제어 장치(Control Unit): 명령어를 해석하고 다른 부품들을 제어
레지스터(Register): 데이터를 임시로 저장하는 초고속 메모리
CPU가 이해하고 실행할 수 있는 명령어의 집합이다.
구성요소
x86, x86-64: 인텔/AMD에서 많이 쓰이는 복잡 명령어 집합
ARM: 모바일, IoT 등에서 많이 쓰이는 단순 명령어 집합
데이터를 저장하는 공간이다.
구성요소
주기억장치(RAM): 프로그램 실행 중 사용하는 메모리로, 프로그램과 데이터를 임시 저장
보조기억장치(Storage): 하드디스크(HDD), SSD 데이터를 영구 저장
2바이트 이상 데이터가 연속적으로 저장될 때, 메모리가 정렬되는 방식이다.
바이트의 크기는 숫자가 작은 순서대로 바이트의 크기가 크다.
bit의 순서가 아니라 byte의 순서를 고려한다.
=> byte 내 bit의 순서는 동일 하고 Byte의 순서만 달라진다. 즉 바이트 단위로 순서가 이동한다.
구성요소
어떤 바이트부터 낮은 주소에 저장되는지에 따라 두 방식을 구분한다.
빅 엔디안 (Big-endian): 가장 왼쪽에 있는(큰) 바이트부터 메모리의 낮은 주소에 저장 (ex: 네트워크)
리틀 엔디안(Little-endian): 가장 오른쪽에 있는(작은) 바이트부터 메모리의 낮은 주소에 저장 (ex: x86, x86-64 CPU)
!! 문자열을 메모리에 저장할 때는 Byte Ordering을 고려하지 않음.
인코딩 (Encoding): 데이터를 특정한 형식으로 변환하는 것. 데이터의 크기를 줄이거나, 컴퓨터가 이해하기 쉽게 변환할 때 사용된다. (ex: Base64)
디코딩 (decoding): 인코딩된 데이터를 원래대로 복원할 때 사용된다.
사용자와 하드웨어 사이의 중재자 역할이다. 컴퓨터의 모든 프로그램들을 운영체제에서 관리하고, 제어해준다.
운영체제가 하는 일
CPU, 메모리 등 하드웨어 자원을 효울적으로 사용하도록 자원을 분배, 할당한다.
실행중인 프로그램에 CPU를 번갈아 할당해야 하는데, 이때 어떤 프로세스에 CPU를 할당할지 결정한다. 이를 CPU스케줄링이라고 부른다.
메모리 공간을 각 프로세스에 분배하고 사용하는 과정을 관리한다.
컴퓨터가 입출력 장치와 정보를 주고 받는 과정을 관리한다.
핵심 구성요소
커널 (Kernel)
하드웨어 관리를 실제로 수행하는 프로그램이다.
즉, 소프트웨어와 하드웨어 간의 커뮤니케이션 관리를 담당한다.
Kernel의 주요 역할
프로세스 관리: exec()
메모리 관리
파일 시스템 관리: open(), read(), write()
I/O 관리
System Call 제공
셸 (Shell)
사용자와 운영체제의 커널 사이에서 사용자가 운영체제에 명령을 내릴 수 있도록 인터페이스 역할을 한다.
사용자가 셸에 명령을 입력하면, 셸이 명령을 해석하여 커널에 요청한다.
Shell의 종류: bash, zsh, sh
셸을 획득하면 명령어를 통해 원하는 작업을 수행하고 시스템을 제어할 수 있게 되어, 일반적으로 셸을 획득하는 것이 시스템 해킹의 성공으로 여겨진다.
크게 두가지로 나눌 수 있다.
Window
UNIX/Linux 운영체제
이외에 mac os, Android, ios가 있다
UNIX
벨 연구소에서 개발한 운영체제로 현대 운영체제의 원형이다. CUI 기반의 대화식 운영체제이다.
Linux
UNIX기반의 운영체제이다. 누구나 수정하고 재배포 할 수 있는 오픈소스 프로그램으로 무료로 사용할 수 있고, 커스터 마이징이 자유로워 서버, 임베디드, 데스크톱 등 다양한 환경에서 사용된다.
문자로 사용자와 컴퓨터가 상호작용하여 동작하는 인터페이스로 터미널에서 명령어를 입력해 시스템을 조작 할 수 있다.
사용자가 컴퓨터와 상호작용하기 위해 시각적 요소(아이콘, 버튼, 메뉴 등)를 사용하는 인터페이스
ls : 현재 디렉터리의 파일 목록을 표시
cd <폴더명> : 현재 사용자의 홈 디렉터리로 이동
cd .. : 상위 폴더(한 단계 위)로 이동
pwd : 현재 디렉토리의 절대 경로를 표시
mkdir <폴더명> : 새로운 디렉토리를 생성
rmdir <폴더명> : 폴더 안에 아무것도 없을 경우 삭제
rm -r <폴더명> : 폴더 안에 파일이 있을 경우 삭제
touch <파일명> : 새 파일을 생성 (ex: touch home.txt)
cat <파일명> : 파일의 내용을 화면에 출력 (ex: cat home.txt)
echo "내용" > <파일명> : 해당 내용을 파일에 저장 (덮어쓰기) (ex: echo "hello" > home.txt)
echo "내용" >> <파일명> : 해당 내용을 파일에 추가함 (기존 내용 뒤에 이어쓰기)
clear: 사용중인 터미널 화면을 깨끗이 지움
vim <파일명> : 메모장처럼 파일을 수정할 수 있는 편집기 실행
파일만들면 아래 insult뜨는데 여기서 원하는 거 적으면 됨
vim에서 나가기:
입력 모드에서 나가려면 Esc
저장하고 종료 :wq
저장하지 않고 종료 :q!
gcc <파일명.c> : C 언어 소스 파일을 컴파일
gcc main.c -o main → /main으로 실행 가능
. 파일 이름이나 디렉터리의 제일 앞 글자를 ‘.’으로 지정하면 자동으로 숨김 파일이 된다.
1.폴더 만들기
mkdir gayun을 통해서 gayun 폴더를 만들어 주고 ls를 통해 확인해줬다.
2.폴더 이동
cd gayun을 통해서 gayun 폴더에 이동해줬다.
3.파일 만들기
vim layer7.c 를 통해 c언어 파일을 생성해주었다.
4.vim에서 코드 입력
i키를 눌러 입력모드로 변환하고 소스코드를 작성해주었다.
Esc로 입력모드를 나와 :wq로 파일을 저장하고 나왔다.
마지막으로 cat layer7.c를 통해 파일을 읽어주면 입력했던 소스코드가 나오는 걸 볼 수 있다.