본문 바로가기

Pwnable/how2heap

how2heap fastbin_dup


원본 소스 : https://github.com/shellphish/how2heap/blob/master/fastbin_dup.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
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    printf("이 파일은 fastbin에서의 간단한 double-free 공격을 보여줍니다.\n");
 
    printf("먼저 세 개의 버퍼를 할당합니다.\n");
    int* a = malloc(8);
    int* b = malloc(8);
    int* c = malloc(8);
    
    printf("첫 번째 malloc(8): %p\n", a);
    printf("두 번째 malloc(8): %p\n", b);
    printf("세 번째 malloc(8): %p\n", c);
 
    printf("그 다음 첫 번째를 free합니다.\n");
    free(a);
 
    printf("만약 우리가 %p를 다시 free한다면, 크래시가 날 것입니다. 왜냐하면 %p는 free리스트의 가장 위에 있기 때문입니다.\n", a, a);
    // free(a);
 
    printf("그러므로, 우리는 %p를 대신 free할 것입니다.\n", b);
    free(b);
 
    printf("이제 우리는 다시 %p를 free할 수 있습니다. 왜냐하면 이 이후로 더 이상 free리스트의 맨 위에 있지 않기 때문입니다.\n", a);
    free(a);
 
    printf("이제 free리스트는 [ %p, %p, %p ]를 가지고 있습니다. 만약 우리가 malloc을 다시 3번 한다면, 우리는 %p를 두 번 할당받을 수 있습니다!\n", a, b, a, a);
    printf("첫 번째 malloc(8): %p\n"malloc(8));
    printf("두 번째 malloc(8): %p\n"malloc(8));
    printf("세 번째 malloc(8): %p\n"malloc(8));
}
 
cs

번역을 하면서 따라해 보니까 이해도 잘 되고 더 재밌는거 같다. 

+ 좀 더 찾아보았는데 약간 혼란스러운 점이 있다. 일단 더블프리는 fast bin에서만 일어난다. malloc 사이즈가 120일 때는 더블프리가 되고, 121일 때는 더블프리가 안되는 것으로 보아 120까지만 fast bin에 저장이 되고 나머지는 small bin이나 large bin 이런데 저장되는 것 같다. 힙 구조를 더 찾아봐야겠다.

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

how2heap fastbin_dup_into_stack  (0) 2016.05.19
how2heap first_fit  (0) 2016.05.15