hOwDayS 선린 10720
fastbin_dup 본문
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 |