본문 바로가기

분류 전체보기

(68)
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..
hook 소스코드 // 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); printf("..
[함께 실습] Hook Overwrite 개념 1) Full RELRO(O) 이더라도 -> libc의 데이터 영역에는 쓰기 권한(O) 2) malloc 함수 -> __malloc_hook 변수의 값이 NULL이 아닌지 검사 -> NULL(X) -> __malloc_hook이 가리키는 함수를 먼저 실행. -> 이때, malloc 함수의 인자는 훅 함수에 전달된다. 위의 내용은 훅 변수를 사용하는 free, realloc도 마찬가지 3) 위의 함수(malloc, free, realloc)들은 libc.so에 정의돼있음. $ readelf -s /lib/x86_64-linux-gnu/libc-2.27.so | grep -E "__malloc_hook|__free_hook|__realloc_hook" 를 통해 확인해보면 __free_hook, __ma..
PIE & RELRO PIE [PIE(Position-Independent Executable)]: ASLR이 코드 영역에도 적용되게 해주는 기술. 무작위 주소에 매핑돼도 실행 가능한 실행 파일 -ASLR 환경에서 PIE가 적용된 바이너리 -> 실행될 때마다 다른 주소에 적재된다. 따라서, 코드 영역의 가젯을 사용하거나, 데이터 영역에 접근하려면 -> 바이너리가 적재된 주소를 알아야 한다. [ELF]: 실행 파일 or 공유 오브젝트(ex. libc.so) [PIE 우회] a) 코드 베이스 구하기 b) Partial Overwrite: **** 키워드 **** -상대 참조(Relative Addressing): 어떤 값을 기준으로 다른 주소를 지정하는 방식 -Position Independent Code (PIC): 어떤 주소..
bof [소스코드] #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme); // smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } (1) main함수에서 인자로 0xdeadbeef를 주며 func함수를 호출한다. (2) func함수에선 gets를 이용해 값을 입력받아 overflowme에 저장하고 (3) 인자인 key와 0xcafebabe를 비교하여 일치하면 ..