본문 바로가기

DreamHack: System Hacking

(45)
tcache의 구조 및 함수들의 동작 & Double Free Bug 개요 Double Free Bug & Duplicated Free List의 정의 -Double Free Bug란 임의의 청크를 두 번 혹은 그 이상 free 시킬 수 있는 버그를 뜻한다. -Duplicated Free List란 free list(tcache 또는 bins)에 임의의 청크가 중복해서 들어있는 것을 뜻한다. -Double Free Bug를 통해 duplicated free list를 만들 수 있다면 우리는 임의의 청크를 우리가 원하는 주소에 할당하여 그 청크를 통해 그 주소에 있는 데이터 값을 읽거나, overwrite 할 수 있게 된다. *Double Free Bug가 발생하는 가장 주된 이유는 바로 Stage 11에서 언급됐던 Dangling Pointer 때문이다. 이 글에서는 tcach..
uaf_overwrite 소스코드 및 보호 기법 // 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 Human *human; struct Robot *robot; char *custom[10]; int c_idx; void print_name() { printf("Name: %s\n", robot->name); } void menu() { printf("1. Human\..
Use After Free 개념 설명 1. Dangling Pointer Dangling Pointer는 유효하지 않은 메모리 영역을 가리키는 포인터를 뜻한다. 메모리의 할당 메모리를 동적으로 할당해줄 때 사용하는 malloc()은 특정 크기만큼의 영역을 할당해주고, 그 영역의 주소를 반환해준다. 따라서 우리는 malloc함수를 사용할 때 void *k = malloc(0x40) 와 같이 포인터 변수에 malloc함수가 할당한 메모리의 주소를 저장한다. 메모리의 해제 할당 받았던 메모리를 해제할 때는 free()를 사용한다. free함수는 할당받았던 청크를 다시 ptmalloc에게 반환하는 역할을 한다. free(k) 문제점 그러나 free()를 사용할 때 문제가 발생할 수 있다. 1. free()는 할당되어있던 청크를 ptmalloc에게 ..
basic_exploitation_003 소스코드 #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); } void get_shell() { system("/bin/sh"); } int main(int argc, char *argv[]) { char *heap_buf = (char *)malloc(0x80); char stack_buf[0x90] = {}; initialize(); read(0, heap_buf,..
basic_exploitation_002 & Format String Bug(개요) 포맷 스트링 버그 개요 -C언어에는 scanf, fprintf, fscanf, sprintf, sscanf 등.. 이외에도 많은 포맷 스트링을 인자로 사용하는 함수들이 있다. -이 함수들은 포맷 스트링을 채울 값들을 레지스터나 스택에서 가져온다. 그러나, 이들 내부에는 포맷 스트링이 필요로 하는 인자의 개수와 함수에 전달된 인자의 개수를 비교하는 루틴이 없다. 그래서 만약 사용자가 포맷 스트링을 입력할 수 있다면, 악의적으로 다수의 인자를 요청하여 레지스터나 스택의 값을 읽어낼 수 있다. -심지어는 다양한 형식지정자를 활용하여 원하는 위치의 스택 값을 읽거나, 스택에 임의 값을 쓰는 것도 가능하다. 소스코드 #include #include #include #include void alarm_handler..
Background: ptmalloc2 Memory Allocator 동적 메모리의 할당 및 해제를 효율적으로 관리하기 위한 알고리즘 ptmalloc2 개요: 리눅스에서 사용되는 Memory Allocator 알고리즘. ptmalloc2는 어떤 메모리가 해제되면, 해제된 메모리의 특징을 기억하고 있다가 비슷한 메모리의 할당 요청이 발생하면, 그 해제됐던 메모리를 비슷한 callee에게 할당해준다. (구글은 tcmalloc, 페이스북이나 파이어폭스는 jemalloc을 사용) ptmalloc의 역할 1. 메모리 낭비 방지 해제된 메모리 공간 중에서 요청된 크기와 같은 크기의 메모리 공간이 있다면 이를 그대로 재사용하게 한다. and 작은 크기의 할당 요청이 발생했을 때, 해제된 메모리 공간 중 매우 큰 메모리 공간이 있으면 그 영역을 나누어 주기..
out_of_bound out of bound란 배열은 데이터들의 연속된 집합이므로, 배열의 크기를 벗어나는 index를 줬을 때 그 위치에 해당하는 데이터에 비정상적으로 접근할 수 있는 것을 악용하는 것이 out of bound 공격의 개념이다. out of bound의 개념 자체는 굉장히 단순해서 이 카테고리(Stage 9)에서 개념을 설명하는 글은 생략했다. 보호 기법 소스 코드 #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() ..
oneshot 소스코드 // 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", stdout..