hOwDayS 선린 10720

fastbin_dup 본문

공부/how2heap

fastbin_dup

hOwDayS 2018. 2. 15. 14:44
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));



출처: http://5unkn0wn.tistory.com/219 [5unKn0wn's Blog]



free(a)를 할경우 FREELIST 에는  a가 첫번째로 올려지게 된다. 그러므로 또다시 a를 free 시키면 FREELIST에 a가 가장위에 있으므로 오류가 난다. 하지만 b를 free 할경우 b가 FREELIST 맨위에 있으므로 free a를 한번 더 할 수 있게 된다. 그러면 b의 fd는 a를 가르키고 a의  fd는  b를 가르키므로 세번 할당할때 a를 두번 할당 하게 된다.


free (a)


FREELIST

ㅡㅡㅡㅡ

|           |

|    a     |

|           |

ㅡㅡㅡㅡ



free (a) free (a)


FREELIST




ㅡㅡㅡㅡ

|           |

|    a(2) |    -CRASH!

|           |

ㅡㅡㅡㅡ



ㅡㅡㅡㅡ

|           |

|    a(1) |

|           |

ㅡㅡㅡㅡ



free (a) free(b) free (a)


FREELIST


ㅡㅡㅡㅡ

|           |

|    a(2) |    

|           |

ㅡㅡㅡㅡ


ㅡㅡㅡㅡ

|           |

|    b     |    - a(2)를 넣는 기준으로 봤을 때 b가 맨 위가됨

|           |

ㅡㅡㅡㅡ


ㅡㅡㅡㅡ

|           |

|    a(1) |

|           |

ㅡㅡㅡㅡ




RESULT : FREELIST = [&a , &b , &a]

즉 3번 malloc 할경우 a를 두번 malloc할 수 있다는 의미


이것을 바탕으로 fastbin_dup_into_stack를 하자

'공부 > how2heap' 카테고리의 다른 글

unsafe_unlink  (0) 2018.02.25
fastbin_dup_into_stack  (0) 2018.02.15
Comments