티스토리 뷰
first_fit.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { fprintf(stderr, "이 파일은 공격에대한 증명을 하지는 않지만, glibc allocator의 특성을 보여줍니다.\n"); fprintf(stderr, "glibc는 free chunk를 선택하는데 first-fit 알고리즘을 사용합니다.\n"); fprintf(stderr, "만약 chunk가 free되고 충분이 그 크기가 크면, malloc은 이 chunk를 선택합니다.\n"); fprintf(stderr, "이것은 use-after-free 공격 상황이 될 수 있습니다.\n"); fprintf(stderr, "버퍼 두 개를 할당합니다. 이들은 크기가 커야하고, fastbin을 가지면 안됩니다.\n"); char* a = malloc(512); char* b = malloc(256); char* c; fprintf(stderr, "첫번째 malloc(512): %p\n", a); fprintf(stderr, "두번째 malloc(256): %p\n", b); fprintf(stderr, "우리는 여기서 동적할당을 계속할 수 있습니다.\n"); fprintf(stderr, "이제 나중에 읽을 수 있는 문자열을 여기에 넣어봅시다.\"this is A!\"\n"); strcpy(a, "this is A!"); fprintf(stderr, "첫번째로 할당된 %p는 %s를 가리키고 있습니다.\n", a, a); fprintf(stderr, "첫번째 것을 free 합니다..\n"); free(a); fprintf(stderr, "우린 어떤것도 다시 free할 이유가 없습니다. 우리가 512보다 작은 값을 할당하면 이것은 아마 %p에 할당 될 것입니다.\n", a); fprintf(stderr, "그러므로, 500바이트를 할당해봅시다.\n"); c = malloc(500); fprintf(stderr, "세번째 malloc(500): %p\n", c); fprintf(stderr, "그리고 여기에 다른 문자열을 넣어보겠습니다, \"this is C!\"\n"); strcpy(c, "this is C!"); fprintf(stderr, "세번째 할당된 %p는 %s를 가리키고 있습니다.\n", c, c); fprintf(stderr, "첫번째 할당된 %p는 %s를 가리키고 있습니다.\n", a, a); fprintf(stderr,"만약 당신이 첫번째 할당된 것을 재사용한다면, 이것은 아마 세번째 할당된 곳의 데이터를 가리키고있을 것 입니다. "); } | cs |
할당을 하고, free한 후 다시 할당할 때 첫번째 할당했던 크기보다 작은 크기를 할당하면 첫번째 할당하고 free했던 주소에 할당이 된다.
'Pwnable > how2heap' 카테고리의 다른 글
fastbin_dup_into_stack (0) | 2018.11.18 |
---|---|
fastbin_dup (0) | 2018.11.18 |
댓글