본문 바로가기

분류 전체보기

(68)
sint Logical Bug: Type Error와 관련된 내용은 https://dreamhack.io/lecture/courses/118 Logical Bug: Type Error 타입을 잘못 사용하여 발생할 수 있는 버그를 학습합니다. dreamhack.io 에 아주 자세히 설명돼있으니 꼭 강의를 수강하길 바란다. 소스코드 #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);..
tcache_dup2 소스코드 및 보호 기법 Partial RELRO가 적용돼있으니 tcache_dup과 마찬가지로 GOT overwrite 공격을 고려해볼 수 있겠다. 소스코드에 청크의 데이터를 출력해주는 코드가 없으므로 libc base를 구하기 어려워 hook overwrite는 힘들고, while(1)을 통해 무한반복문을 돌기 때문에 bof를 통한 공격도 어렵다. #include #include #include #include char *ptr[7]; void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); } void create_heap(int idx) { size_t size; if (idx >= 7) exit(0)..
tcache_dup 소스코드 및 보호 기법 Partial RELRO가 적용돼있으니 GOT overwrite, hook overwrite 등등을 고려해볼 수 있겠다. while(1)을 통해 반복문이 무한 반복되므로 bof를 이용한 공격은 현실적으로 어렵다. // gcc -o tcache_dup tcache_dup.c -no-pie #include #include #include #include char *ptr[10]; void alarm_handler() { exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(60); } int cr..
Tcache Poisoning Tcache Poisoning Tcache Poisoning은 free list에 중복되어 있는 청크를 재할당하면, 해당 청크가 해제된 청크임과 동시에 할당된 청크라는 점을 악용하여 원하는 주소에 청크를 할당하고, 원하는 주소에 할당된 청크를 통해 원하는 주소의 값을 읽거나 원하는 주소의 값을 overwrite 시킬 수 있는 기법이다. 소스코드 및 보호 기법 -Full RELRO와 NX가 적용되어 있으니, hook overwrite를 고려해볼 수 있겠다. 소스코드에서 while(1)을 통해 반복문이 무한 반복되므로 bof를 통한 공격은 현실적으로 어렵다. #include #include #include int main() { void *chunk = NULL; unsigned int size; int i..
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,..