Background: Computer Architecture
컴퓨터 구조 : 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법. 컴퓨터의 기능 구조에 대한 설계, 명령어 집합구조, 마이크로 아키텍처, 그리고 기타 하드웨어 및 컴퓨팅 방법에 대한 설계 등을 포함한다.
명령어 집합구조 : CPU의 명령어에 대한 설계. CPU가 처리해야하는 명령어를 설계하는 분야이다.
마이크로 아키텍처(Micro Architecture) : CPU의 하드웨어적 설계. 정의된 명령어 집합을 효율적으로 처리할 수 있도록, CPU의 회로를 설계하는 분야이다.
폰 노이만 구조 : 연산과 제어를 위해 중앙처리장치(Central Processing Unit, CPU)를, 저장을 위해 기억장치(memory)를 사용한다. 그리고 장치간에 데이터나 제어 신호를 교환할 수 있도록 버스(bus)라는 전자 통로를 사용한다.
- 중앙처리장치 : CPU는 프로그램의 연산을 처리하고 시스템을 관리하는 컴퓨터의 두뇌이다. 프로세스의 코드를 불러오고, 실행하고, 결과를 저장하는 일련의 모든 과정이 CPU에서 일어난다
- 기억장치 : 컴퓨터가 동작하는데 필요한 여러 데이터를 저장하기 위해 사용되며, 용도에 따라 주기억장치와 보조기억장치로 분류된다.
- 주기억장치 : 프로그램 실행과정에서 필요한 데이터들을 임시로 저장하기 위해 사용된다.
- 보조기억장치 : 운영 체제, 프로그램 등과 같은 데이터를 장기간 보관하고자 할 때 사용된다.
- 버스 : 컴퓨터 부품과 부품 사이 또는 컴퓨터와 컴퓨터 사이에 신호를 전송하는 통로
명령어 집합 구조(Instruction Set Architecture, ISA) : CPU가 해석하는 명령어의 집합. 프로그램은 기계어로 이루어져 있는데, 프로그램을 실행하면 이 명령어들을 CPU가 읽고, 처리한다.
x86-64 아키텍처
n 비트 아키텍처 : CPU가 한번에 처리할 수 있는 데이터의 크기. CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부른다. WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라진다.
x86-64 아키텍처: 레지스터 : CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소. 산술 연산에 필요한 데이터를 저장하거나 주소를 저장하고 참조하는 등 다양한 용도로 사용된다. x64 아키텍처에는 범용 레지스터(General Register), 세그먼트 레지스터(Segment Register), 명령어 포인터 레지스터(Instruction Pointer Register, IP), 플래그 레지스터(Flag Register)가 존재한다.
- 범용 레지스터 : 주 용도는 있으나, 그 외의 용도로도 자유롭게 사용할 수 있는 레지스터. x64에는 rax, rbx, rcx, rdx, rsi, rdi, rsp, rbp, r8-r15가 있다.
- 세그먼트 레지스터 : 과거에는 메모리 세그멘테이션이나, 가용 메모리 공간의 확장을 위해 사용됐으나, 현재는 주로 메모리 보호를 위해 사용되는 레지스터 x64에는 cs, ss, ds, es, fs, gs가 있다.
- 명령어 포인터 레지스터 : CPU가 실행해야할 코드를 가리키는 레지스터. x64에서는 rip가 있다.
플래그 레지스터 : 프로세서의 현재 상태를 저장하고 있는 레지스터. 깃발을 올리고, 내리는 행위로 신호를 전달하듯, 플래그 레지스터는 자신을 구성하는 여러 비트들로 CPU의 현재 상태를 표현한다.
레지스터 호환 :
Background: Linux Memory Layout
리눅스 프로세스의 메모리 구조
세그먼트 : 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 그리고 스택 세그먼트로 구분한다. 운영체제가 메모리를 용도별로 나누면, 각 용도에 맞게 적절한 권한을 부여할 수 있다는 장점이 있다. 권한은 읽기, 쓰기, 그리고 실행이 존재하며, CPU는 메모리에 대해 권한이 부여된 행위만 할 수 있다.
코드 세그먼트(Code Segment) : 실행 가능한 기계 코드가 위치하는 영역. 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한과 실행 권한이 부여한다.
데이터 세그먼트(Data Segment) : 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치한다. CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로, 읽기 권한이 부여된다.
rodata(read-only data) 세그먼트 : 쓰기가 불가능한 세그먼트에는 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치한다. 전역으로 선언된 상수가 여기에 포함된다.
BSS 세그먼트(BSS Segment, Block Started By Symbol Segment) : 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역이다. 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화된다.
스택 세그먼트(Stack Segment) : 프로세스의 스택이 위치하는 영역이다. 함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장된다. 스택 프레임(Stack Frame)이라는 단위로 사용된다.
힙 세그먼트(Heap Segment) : 힙 데이터가 위치하는 세그먼트. 스택과 마찬가지로 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다.
x86 Assembly: Essential Part(1)
어셈블리 언어 : 컴퓨터의 기계어와 치환되는 언어. CPU에 사용되는 ISA는 IA-32, x86-64, ARM, MIPS 등 종류가 다양하다.
x64 어셈블리 언어
- 기본 구조 : 동사에 해당하는 명령어(Operation Code, Opcode)와 목적어에 해당하는 피연산자(Operand)로 구성된다.
- 명령어
피연산자 : 상수(Immediate Value), 레지스터(Register), 메모리(Memory)
데이터 이동 : 데이터 이동 명령어는 어떤 값을 레지스터나 메모리에 옮기도록 지시한다.
- mov dst, src: src의 값을 dst에 대입
lea dst, src: src의 유효 주소를 dst에 대입
산술 연산 명령어 : 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 지시한다.
- add dst, src: src의 값을 dst에 더함
sub dst, src: src의 값을 dst에서 뺌
inc op: op의 값을 1 더함
dec op: op의 값을 1 뺌
논리 연산 명령어 : and, or, xor, neg 등의 비트 연산을 지시한다.
- and dst, src: dst와 src가 모두 1이면 1, 아니면 0
or dst, src: dst와 src중 한 쪽이라도 1이면 1, 아니면 0
xor dst, src: dst와 src가 다르면 1, 같으면 0
not op: op의 비트를 모두 반전
비교 명령어 : 두 피연산자의 값을 비교하고, 플래그를 설정한다.
- cmp op1, op2: op1에서 op2를 빼고 플래그를 설정
test op1, op2: op1과 op2에 AND 연산을 하고, 플래그를 설정
분기 명령어 : rip를 이동시켜 실행 흐름을 바꾼다
- jmp addr: addr로 rip 이동
je addr: 직전 비교에서 두 피연산자의 값이 같을 경우 addr로 rip 이동
jg addr: 직전 비교에서 두 피연산자 중 전자의 값이 더 클 경우 addr로 rip 이동
x86 Assembly: Essential Part(2)
Opcode: 스택
- push val : val을 스택 최상단에 쌓음
- pop reg : 스택 최상단의 값을 꺼내서 reg에 대입
Opcode: 프로시저 : 특정 기능을 수행하는 코드 조각. 반복되는 연산을 프로시저 호출로 대체할 수 있어서 전체 코드의 크기를 줄일 수 있으며, 기능별로 코드 조각에 이름을 붙일 수 있게 되어 코드의 가독성을 크게 높일 수 있다.
- 프로시저를 부르는 행위를 호출(Call)이라고 부르며, 프로시저에서 돌아오는 것을 반환(Return)이라고 부른다.
- call addr : addr에 위치한 프로시져 호출
- leave: 스택프레임 정리
- ret : return address로 반환
Opcode: 시스템 콜 : 필요한 기능과 인자에 대한 정보를 레지스터로 전달하면, 커널이 이를 읽어서 요청을 처리한다.
- 커널 모드 : 운영체제가 전체 시스템을 제어하기 위해 시스템 소프트웨어에 부여하는 권한
- 유저 모드 : 운영체제가 사용자에게 부여하는 권한
- 시스템 콜 : 유저 모드에서 커널 모드의 시스템 소프트웨어에게 어떤 동작을 요청하기 위해 사용된다.
'SWUFORCE > 모의해킹팀' 카테고리의 다른 글
모의해킹 과제 4주차 (0) | 2023.11.07 |
---|---|
3주차 웹해킹 과제 (0) | 2023.10.11 |
모의해킹 2주차 과제 - 웹 해킹 (0) | 2023.10.03 |
모의해킹 2주차 과제 - 인프런 강의 [웹 해킹과 모의해킹 현업에 대한 이야기] (0) | 2023.10.03 |
2주차 과제 (0) | 2023.09.26 |