본문 바로가기

Pwnable/how2heap

how2heap first_fit


원본 소스 : https://github.com/shellphish/how2heap/blob/master/first_fit.c

번역한 소스 (영어 5등급이 무슨 번역...)

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
36
37
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void) {
    printf("이 파일은 공격에 관한 입증을 하는 것이 아닌 glibc메모리 할당의 본질을 보여줍니다.\n");
    printf("glibc는 free되어 있는 청크를 선택할 때 first-fit이라는 알고리즘을 사용합니다.\n");
    printf("만약에 청크가 free되어 있고 그 크기가 충분하다면, malloc은 이 청크를 선택할 것입니다.\n");
    printf("그리고 이것은 use-after-free 공격 환경이 될 수 있습니다.\n");
 
    printf("두 개의 버퍼를 할당하겠습니다. 이들은 크기가 충분해야하고, fastbin을 가지지 않아야 합니다.\n");
    char* a = malloc(512);
    char* b = malloc(256);
    char* c;
 
    printf("첫 번째 malloc(512): %p\n", a);
    printf("두 번째 malloc(256): %p\n", b);
    printf("우리는 이곳에 malloc을 다시 할 것입니다...\n");
    printf("이제 우리가 나중에 읽을 수 있도록 문자열을 넣어 봅시다 \"this is A!\"\n");
    strcpy(a, "this is A!");
    printf("첫 번째 할당된 %p는 %s를 가리키고 있습니다.\n", a, a);
 
    printf("첫 번째를 free하겠습니다.\n");
    free(a);
 
    printf("우리는 어떤 것도 다시 free할 필요가 없습니다. 우리가 512보다 작은 값을 할당하기만 하면 아마 %p에 할당이 될 것입니다.\n", a);
    
    printf("그러므로, 이번에는 500바이트를 할당 해 봅시다.\n");
    c = malloc(500);
    printf("세 번째 malloc(500): %p\n", c);
    printf("그리고 위와 다른 문자열을 넣어줍니다 \"this is C!\"\n");
    strcpy(c, "this is C!" );
    printf("세 번째 할당된 %p는 %s를 가리키고 있습니다.\n", c, c);
    printf("첫 번째 할당된 %p는 %s를 가리키고 있습니다.\n", a, a);
    printf("만약 우리가 첫 번째 할당된 곳을 다시 사용한다면, 이는 세 번째 할당된 곳의 값을 가리키고 있을 것입니다.\n");
}
 
cs

할당했던 청크를 free하고 원래 크기보다 작은 크기를 할당하려 하면 free했던 주소에 그대로 다시 할당이 된다.

'Pwnable > how2heap' 카테고리의 다른 글

how2heap fastbin_dup_into_stack  (0) 2016.05.19
how2heap fastbin_dup  (0) 2016.05.16