목록Hack/DreamHack(로드맵) (94)
CIDY

*ptmalloc2 지난 시간에 use after free 취약점을 설명하면서 이런 말을 한 적이 있다. "ptmalloc2는 청크 할당 요청이 들어오면 해제된 청크 중 유사한 크기의 것이 있는지 확인한 후 그것을 우선으로 내어준다." 그리고 이를 이용해 원샷 가젯을 써 익스플로잇까지 해 보았다. 여기서 ptmalloc2는 메모리 allocator의 일종이다. memory allocator는 말 그대로 할당 요청이 들어오면 메모리를 할당해주는 친구인데, 운영체제마다 (혹은 소프트웨어마다) 상이한 allocator를 이용한다. -> 리눅스의 allocator가 ptmalloc2이다. ptmalloc2가 하는 일은 메모리를 효율적으로 관리할 수 있도록 하는 것이다. 1. 메모리 낭비 방지 2. 빠른 메모리 ..

*Dangling Pointer 유효하지 않은 메모리 영역을 가리키는 포인터이다. 만약 malloc으로 동적할당 해준 이후 free로 할당했던 공간을 반환해줬다고 하자. (ptmalloc에 반환) -> 해당 청크의 주소를 담은 포인터를 초기화시키는건 아님 예를들어, int* ptr = (int *)malloc(0x70); 해준 뒤 free(ptr); 해줬다고 하자 -> 0x70만큼의 공간은 할당 해제되었지만 ptr은 여전히 malloc이 반환했던 주소를 갖고 있고, 또다시 free(ptr)해줄 수 있음 -> Double Free Bug 발생 가능. *Use After Free 말 그대로 free된 메모리에 접근 가능한 취약점을 말한다. malloc과 free는 할당하거나 해제한 메모리의 데이터를 따로 초..

// 32-bit, nx, partial relro #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] = {}; initial..

// 64-bit, nx, partial relro #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 buf[0x80]; initialize(); read(0, buf, 0x80); printf(buf); exit(0); }..

rop를 하다보니 풀이가 정말 다양하게 나올 수 있다는걸 느꼈다... 이때까지 배운 방법들로 rop를 다양하게 풀어보겠다. got overwrite 및 libc leak을 이용한 3가지 풀이 방법은 아래 링크에 있다. ↓ https://orcinus-orca.tistory.com/35 [System_Hacking] stage7_문제풀이(Return Oriented Programming) 간단한 문젠데 이것저것 하다보니 풀이를 3개나 써버렸다ㅋㅋ다들 비슷비슷한 인자세팅이긴 함. // Name: rop.c // Compile: gcc -o rop rop.c -fno-PIE -no-pie // 64-bit, canary, nx, partial relro #include #.. orcinus-orca.tisto..

#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() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main() { int idx; initialize(); printf("Admin name: "); read(0, name, sizeof(name)); p..

// 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("Size:..

// gcc -o oneshot1 oneshot1.c -fno-stack-protector -fPIC -pie // 64-bit, pie, nx, partial relro #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(); ..