어려워서 생각을 정리할겸 써본다.
Fastbin_dup_into_Stack.c
1. int main()
2. {
3. unsigned long long stack_var;
4.
5. int *a = malloc(8);
6. int *b = malloc(8);
7. int *c = malloc(8);
8.
9. free(a);
10 free(b);
11. free(a);
12.
13.
14. unsigned long long *d = malloc(8);
15
16. malloc(8);
17.
18. stack_var = 0x20;
19.
20. *d = (unsigned long long) (((char*)&stack_var) - sizeof(d));
21.
22. malloc(8);
23. printf("malloc(8): %p\n", malloc(8));
24. }
a,b,c에 말록을 받고 free를 해주는데 a를 두번을 free를 해주어서 Double Free Bug가 생긴다.
Double Free Bug로 인해서 이중연결리스트가 서로가 서로를 계속 가르키고 있다.
이상태에서 fd를 Stack의 특정주소로 변경을 한 후 malloc을 해주어서 힙이 할당 되도록 하는 것 이다.
디버깅을 하면서 살펴보자.
일단은 a,b,c에 malloc을 한 뒤인 8번줄에 브레이크를 걸어보자.
브레이크를 건 다음
heap명령어를 통해서 heap구조를 살펴보니 이와같이 malloc이 잘 된 모습을 볼 수 있다.
이번에는 free를 한줄씩 실행을 해보면서 fd가 어떻게 바뀌는지 살펴보고 fastbin에 들어가는지도 확인하자.
free(a)
일단은 fastbin에 올라간 것을 볼 수 있다.
그리고 처음으로 free가 되서 fd가 없다.
free(b)
b를 free를 한 상태이다.
fastbin list를 보면 b의 fd가 a를 가리키고 있다.
이번에는 free(a)를 다시해서 Double Free Bug를 발생시켜 보자.
free(a)
Double Free Bug를 통해서 Fastbin dup chain이 만들어 졌다.
이번에는 14번째 줄 unsigned long long *d = malloc(8);을 실행시켜보자
unsigned long long *d = malloc(8);
unsigned long long *d = malloc(8);을 통해서 free한 A 청크가 할당이 된다.
이번에는 16번째 줄을 실행시켜 보겠다.
malloc(8)
Fastbin에 있던 B청크가 할당이 되고 A청크 하나만 남아있다.
20번째 줄을 실행을 해보자.
*d = (unsigned long long) (((char*)&stack_var) - sizeof(d));
A청크를 할당하기 전 fd를 조작해서 다음에 malloc을 할 주소를 정해준다.
그럼 원하는 스택의 주소에 값을 쓸 수 있게 된다.
(※ -sizeof(d)를 해준 이유는 fd에는 chunck의 address주소가 들어가서 -sizeof(d)를 해줌)
printf("malloc(8): %p\n", malloc(8));
마지막 malloc을 해서 스택 영역이 할당 된다.
fastbin list를 보면 사라진 것을 볼 수 있다.
.
.
.
아직은 이해가 많이 안간다...
이해가 되거나 깨달은 것이 있으면 수정을 해서 보충해야 겠다.
'SYSTEM HACKING > 기법' 카테고리의 다른 글
[How2Heap] House of Force (0) | 2018.03.08 |
---|---|
[How2Heap] House of Spirit (0) | 2018.02.01 |
Special Chapter-Double Stage Format String Bug (0) | 2018.01.01 |
DAY-8 FSB(Format String Bug) (0) | 2017.12.31 |
DAY-7 ROP(Return Oriented Programming) (0) | 2017.11.18 |