fastbin attack / fastbin_dup
fastbin attack
다음 ``c malloc(fast)`` 때 overwrited fast chunk가 반환되면서 fastbin에 `` fake_chunk`` addr이 추가되므로, 그 다음 반환 chunk는 `` fake_chunk``.
```c
fake_chunk[1] = FAST; // bypass check
hptr = malloc(FAST);
victim = malloc(FAST);
free(victim);
strcpy(hptr, argv[1]); // vulnerability ( overflow, uaf, overlap, fastbin_dup... )
victim = malloc(FAST); // return victim
fake = malloc(FAST); // return fake_chunk
```
limitation
[malloc] fastbins size check 에 걸리기 때문에 ``c fake_chunk``에는 속해있는 fastbin 집단과 일치하는 size가 설정되어야 한다.
* 속해있는 fastbin 집단의 size와 일치하지 않으면 `` malloc(): memory corruption (fast)`` 에러가 발생한다.
* 단, align된 단위로 보기 때문에 align 범위 내의 값이면 어떤 값이 와도 상관없다. flag도 마찬가지로 상관 없음.
fastbin_dup
두 번 연속해서 같은 포인터를 free하는 경우 [free] double free check에 걸리지만, 이는 가장 최근 반환 chunk가 다시 ``c free()``되는지만 검사하기 때문에 다음과 같은 상황에서 발생하는 overlap을 이용해 fastbin attack을 시도할 수 있다.
```c
void *a = malloc(SIZE);
void *b = malloc(SIZE);
free(a);
free(b);
free(a);
a1 = malloc(SIZE); // a1
malloc(SIZE); // b
a1 = &fake_chunk;
malloc(SIZE); // a2
malloc(SIZE); // fake_chunk
```
이렇게 되면 linked list는 `` fastbin -> a -> b -> a -> b...``로 구성되기 때문에 `` a1, b, a2`` chunk가 순서대로 반환된다.
원래는 `` a1`` chunk의 `` fd``가 0으로 초기화 되면서 `` a2`` 까지만 반환되지만
`` a2`` 를 할당하기 전에 `` a1``을 이용해 데이터를 쓰는 경우, `` fd``자리에 있는 데이터를 `` fd``로 인식하기 때문에
이후 `` a2``를 할당하면서 `` fd``에 있는 데이터가 fastbin에 들어가게 되고
그 다음 ``c malloc()`` 때 그 데이터를 위치로 하는 chunk가 반한된다.
'Security > System Exploit' 카테고리의 다른 글
[UNDEAD] unlink (0) | 2017.08.15 |
---|---|
The House of Lore (0) | 2017.08.15 |
The House of Spirit (0) | 2017.08.15 |
Poison null byte (0) | 2017.08.15 |
overlapping chunk (0) | 2017.08.15 |