DreamHack - System Hacking Lecture
CPU : 실행할 명령어와 명령어 처리에 필요한 데이터를 메모리에서 읽고, Instruction Set Architecture(ISA)에 따라 처리한 연산 결과를 다시 메모리에 적재함
-> 공격자가 메모리를 악의적으로 조작할 수 있다면 조작된 메모리 값에 의해 CPU도 잘못된 동작을 할 수 있음 = 메모리가 오염(Memory Corruption)되었다고 표현함.
Stack Buffer Overflow / Off by One / Format String Bug / Double Free Bug / Use After Free
리눅스 메모리 구조(Memory Layout)
리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분함
세그먼트 : 적재되는 데이터의 용도별로 메모리 구획을 나눈 것
코드 세그먼트 / 데이터 세그먼트 / BSS 세그먼트 / 힙 세그먼트 / 스택 세그먼트로 구분함
운영체제가 메모리를 용도별로 나누면 각 용도에 맞게 적절한 권한을 부여할 수 있음(읽기, 쓰기, 실행)
computer architecture – 레지스터 정리 추가할것
Code segment | 실행 가능한 기계 코드가 위치하는 영역 (Text Segment라고도 함) 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 코드 세그먼트에는 읽기/쓰기 권한이 부여됨. |
Data segment | 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치함 CPU는 이 세그먼트의 데이터를 읽을 수 있어야 하므로 읽기 권한이 부여됨. 쓰기 가능한 세그먼트 – 전역변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터가 위치 (data 세그먼트) 쓰기 불가능한 세그먼트 – 프로그램이 실행되며 값이 변하면 안되는 데이터가 위치 = 전역으로 선언된 상수가 여기 포함됨 (rodata 세그먼트 : read-only data) |
BSS segment | Block Started By Symbol Segment – 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함됨 프로그램이 시작될 때, 모두 0으로 값이 초기화됨 읽기, 쓰기 권한이 부여됨 |
Heap segment | 힙 데이터가 위치하는 세그먼트 / 스택과 마찬가지로 실행중 동적할당 될 수 있고 스택 세그먼트와 반대 방향으로 자람(in Linux) malloc() 등으로 호출해서 할당받는 메모리가 이 세그먼트에 위치함 읽기와 쓰기 권한이 부여됨 |
Stack segment | 프로세스의 스택이 위치하는 영역으로, 함수의 인자나 지역변수 같은 임시 변수들이 실행중에 여기에 저장됨. Stack Frame이라는 단위 사용 : 함수가 호출될 때 생성되고, 반환될 때 해제됨 프로그램의 흐름은 사용자의 입력을 이용한 여러 요인에 영향을 받기 때문에 프로세스가 실행될 때, 해당 프로세스가 얼마 만큼의 스택 프레임을 사용할지를 미리 계산하는 것은 일반적으로 불가능함. 따라서 OS는 프로세스를 시작할 EO 작은 크기의 스택 세그먼트를 미리 할당해주고 부족해질때마다 이를 확장해줌 “아래로 자란다” 라는 표현은 스택이 확장될 때 기존 주소보다 낮은 주소로 확장되기 때문에 붙은 표현임. CPU가 자유롭게 값을 읽고 쓸 수 있어야 하므로 읽기와 쓰기 권한이 부여됨 |
힙과 스택 세그먼트가 자라는 방향이 반대인 이유 :
두 세그먼트가 동일한 방향으로 자라서 연속된 메모리 주소에 할당된다고 가정하면,
기존의 힙 세그먼트를 모두 사용한 뒤 확장하는 과정에서 스택 세그먼트와 충돌하게 됨
이를 해결하기 위해 리눅스는 스택을 메모리의 끝에 위치시키고 힙과 스택을 반대로 자라게 함
따라서 메모리를 최대한 자유롭게 사용할 수 있고, 충돌 문제로부터 비교적 자유로워짐
명령어 집합구조(Instruction Set Architecture, ISA) : 컴퓨터 구조 중에서 CPU가 사용하는 명령어와 관련된 설계
대표적으로 가장 널리 사용되는 ISA 중 하나가 인텔의 x86-64 아키텍쳐
x86-64 아키텍처 : 인텔의 32비트 cpu 아키텍처인 것을 64비트 환경에서 사용할 수 있도록 확장한 것
n 비트 아키텍처 : n은 cpu가 한번에 처리할 수 있는 데이터의 크기를 말함
컴퓨터 과학에서는 이를 CPU가 이해할 수 있는 데이터의 단위라는 의미에서 WORD라고 부름
WORD의 크기는 CPU가 어떻게 설계됐느냐에 따라 달라짐
ex) 32비트 아키텍처에서 ALU는 32비트까지 계산할 수 있음, 레지스터 용량 및 각종 버스들의 대역폭 = 32비트
따라서 이들로 구성된 CPU는 설계상 32비트의 데이터까지만 처리 가능함
WORD가 크면 유리한점 : 큰 바이트의 가상메모리를 제공할 수 있기 때문에, 가용한 메모리 자원이 부족하여 소프트웨어의 최고 성능을 낼 수 없다거나 소프트웨어의 실행이 불가능한 상황이 거의 발생하지 않는다.
'INTERLUDE ✦ > 2022 SYSTEM STUDY' 카테고리의 다른 글
[ DreamHack ] Shell_basic 풀이 (0) | 2022.11.01 |
---|---|
[ DreamHack ] pwndbg 실습 (0) | 2022.10.04 |
pwndbg, pwntools 설치 (0) | 2022.10.04 |
[ DreamHack ] 동적 분석 연습 1 (0) | 2022.09.29 |
[ DreamHack ] x86 Assembly (0) | 2022.09.25 |