본문 바로가기

Dreamhack/Lecture & Practice

(10)
[Practice] Use After Free 1. Use After Free (UAF) 해제된 메모리에 접근할 수 있는 취약점으로, 메모리에 남아있던 데이터를 유출하거나 사용할 수 있다. 참고 : 2022.08.20 - [Dreamhack/Lecture & Practice] - [Lecture] Use After Free 2. 실습 코드 // Name: uaf_overwrite.c // Compile: gcc -o uaf_overwrite uaf_overwrite.c #include #include #include #include struct Human { char name[16]; int weight; long age; }; struct Robot { char name[16]; int weight; void (*fptr)(); }; struct ..
[Lecture] Use After Free 1. Use-After-Free 메모리 참조에 사용한 포인터를 메모리 해제 후, 제대로 초기화하지 않아 발생하는 취약점이다. 해제한 메모리를 초기화하지 않고 다음 청크에 재할당해주기 때문이다. 즉, 해제된 메모리에 접근할 수 있을 때, 발생하는 취약점이다. Chunk(청크) 란? • malloc에 메모리 할당을 요청하면, 넓은 메모리의 영역을 다양한 크기의 덩어리(chunk)로 나눈다. • chunk는 사용중인 덩어리, 해제된 덩어리, Top 덩어리, Last Remainder 덩어리가 있다. • 위에서 말하고 있는 청크는 "해제된 덩어리"로 응용프로그램에서 시스템에 반환한 덩어리를 의미하는 것이다. 2. Dangling Pointer 2-1. 정의 컴퓨터 과학에서 'Dangling Pointer'는 유..
[Practice] 64bit_FSB (Format String Bug) 1. Format String Bug (FSB) 포맷스트링을 사용하는 함수에서 발생할 수 있는 취약점이다. 리눅스 라이브러리 함수에서는 printf, fprintf, sprintf와 같은 함수들에서 발생한다. 참고 : 2022.08.10 - [Dreamhack/Lecture & Practice] - [Lecture] Format String Bug (FSB) 2. 실습 코드 changeme의 값을 1337로 바꾸는 것이 실습의 목표이다. // Name: fsb_overwrite.c // Compile: gcc -o fsb_overwrite fsb_overwrite.c #include #include #include void get_string(char *buf, size_t size) { ssize_t ..
[Lecture] Format String Bug (FSB) 1. 포맷 스트링 버그 (Format String Bug, FSB) 포맷 스트링을 인자로 사용하는 함수는 대표적으로 scanf, fprintf, fscanf, sprintf, sscanf가 있다. 포맷 스트링을 채울 값들은 레지스터나, 스택에서 가져온다. 하지만, 포맷 스트링을 사용하는 함수의 내부에는 필요로 하는 인자 개수와 함수에 전달된 인자의 개수를 비교하는 루틴이 존재하지 않는다. 포맷 스트링을 사용자가 입력할 수 있을 때, 공격자는 레지스터와 스택을 읽을 수 있고, 임의 주소 읽기 및 쓰기를 할 수 있다. 포맷 스트링 함수를 잘못 사용하여, 발생하는 버그를 "포맷 스트링 버그"라고 한다. 2. 레지스터 및 스택 읽기 2-1. 실습 코드 사용자가 임의의 포맷 스트링을 입력할 수 있는 코드이다. s..
[Lecture] OOB (Out of bounds) 1. 배열의 속성 배열은 연속된 메모리 공간을 점유하며, 배열의 각 요소의 주소는 배열의 주소, 요소의 인덱스, 요소 자료형 크기를 이용하여 계산한다. 배열이 점유하는 공간의 크기는 요소의 개수와 요소 자료형의 크기를 곱한 값이며, 배열이 포함하는 요소의 개수를 배열의 길이라고 한다. // array[n]의 배열 크기 sizeof(array) = sizeof(elem) * n // array[n]의 k번째 배열을 참조 &array[k] = array + sizeof(elem) * k 2. OOB 2-1. 정의 배열의 임의 인덱스에 접근이 가능하여, 악의적으로 배열의 경계를 넘어 값을 읽거나 쓸 수 있는 취약점이다. 배열 참조에 사용되는 인데스를 임의 값으로 설정할 수 있다면, 배열의 주소로부터 특정 오프..
[Practice] Hook Overwrite 1. Hook Overwrite Hook의 특징을 이용한 공격 기법이다. [참고] Hooking은 운영체제가 어떤 코드를 실행하려할 때, 이를 낚아채어 다른 코드가 실행되게 하는 것을 의미하며, 이때 실행되는 코드를 Hook이라고 한다. 2. 실습 목표 본 실습에서는 malloc과 free함수를 후킹하여, 각 함수가 호출될 때 공격자가 작성한 악의적인 코드가 실행되도록 하는 기법을 실습한다. Full RELRO가 적용되어도, libc의 데이터 영역에는 쓰기가 가능하므로 Full RELRO를 우회하는 기법으로 사용할 수 있다. 3. 메모리 함수 훅 C언어에서 메모리 동적할당&해제를 담당하는 함수는 malloc, free, realloc이 대표적이며, 해당 함수들은 libc.so에 구현되어 있다. libc에..
[Lecture] PIE (Position-Independent Executable) 1. PIC (Position-Independent Code) 정의 리눅스에서 ELF에는 실행파일(Executable)과 공유 오브젝트(Shared Object, SO)가 존재하며, 공유 오브젝트는 libc.so와 같은 라이브러리 파일이 해당된다. 공유 오브젝트는 기본적으로 재배치가 가능하도록 설계되어 있는데, 이러한 성질을 만족하는 코드를 PIC라고 한다. gcc는 PIC 컴파일을 지원한다. [참고] '재배치가 가능하다는 것'은 메모리의 어느 주소에 적재되어도, 코드의 의미가 훼손되지 않음을 의미한다. 2. PIC 실습 2-1. 실습 코드 PIC 적용된 바이너리와 적용되지 않은 바이너리 비교를 위해, 두 가지 방식으로 컴파일해준다. // Name: pic.c // Compile: gcc -o pic p..
[Lecture] RELRO (RELocation Read-Only) 1. lazy binding 함수가 처음 호출될 때, 함수의 주소를 구하고 GOT 테이블에 업데이트하는 것을 의미한다. 이는 바이너리가 실행 중에 GOT테이블을 업데이트할 수 있는 쓰기 권한이 있어야 가능하다. 2. ELF의 데이터 세그먼트 프로세스 초기화 및 종료와 관련된 .init_array, .fini_array가 존재한다. .init_array, .fini_array는 프로세스의 시작과 종료에 실행할 함수들의 주소를 저장하고 있다. 이에 해당 위치에 공격자가 임의로 값을 쓸 수 있다면, 프로세스의 실행 흐름을 조작할 수 있는 것이다. 이러한 문제점을 해결하고자, 프로세스의 데이터 세그먼트를 보호하는 "RELRO (RELocation Read-Only)"를 사용한다. 3. RELRO 쓰기 권한이 불..