본문 바로가기

Dreamhack

(22)
[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. 정의 배열의 임의 인덱스에 접근이 가능하여, 악의적으로 배열의 경계를 넘어 값을 읽거나 쓸 수 있는 취약점이다. 배열 참조에 사용되는 인데스를 임의 값으로 설정할 수 있다면, 배열의 주소로부터 특정 오프..
[Wargame] hook 1. 실습 코드 // gcc -o init_fini_array init_fini_array.c -Wl,-z,norelro #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { long *ptr; size_t size; initialize(); printf("stdout: %p\n", stdout); prin..
[Wargame] oneshot 1. 실습 코드 // gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int main(int argc, char *argv[]) { char msg[16]; size_t check = 0; initialize(); printf("stdout: %p\n", st..
[Wargame] fho 해당 문제는 강의에 기반한 문제로, 자세한 풀이는 아래 주소를 참고하세요. 2022.07.14 - [Dreamhack/Lecture & Practice] - [Practice] Hook Overwrite 1. 실습 코드 // Name: fho.c // Compile: gcc -o fho fho.c #include #include #include int main() { char buf[0x30]; unsigned long long *addr; unsigned long long value; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); puts("[1] Stack buffer overflow"); printf("Buf: "); read(0, bu..
[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 쓰기 권한이 불..
[Wargame] basic_rop_x86 1. 실습 코드 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } 2. 풀이 ① checksec을 이용하여, 메모리 보호기법을 확인한..