티스토리 뷰

Pwnable/how2heap

first_fit

xxvd 2018. 9. 17. 17:06

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
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
글 보관함