엄범


The House of Lore

free'd small/fast chunk의 bk를 `` fake_chunk`` addr로 overwrite.


fastbin도 결국 large request가 들어오면 smallbin으로 옮겨지기 때문에 이 경우 small과 똑같이 동작한다.
``c mov_to_small=malloc(large)``를 호출하지 않으면 차이가 발생한다. ( limitation #2 )

smallbins bk check & unlink

```c

            else

            {

                bck = victim->bk;

                if (__glibc_unlikely (bck->fd != victim))

                {

                    errstr = "malloc(): smallbin double linked list corrupted";

                    goto errout;

                }

                set_inuse_bit_at_offset (victim, nb);

                // unlink

                bin->bk = bck;

                bck->fd = bin;

```

``c malloc(small)`` 시 chunk를 smallbins에서 제거하고, next serve chunk를 준비하는 unlink 과정을 이용한다.

unlink하면서 ``c bin->bk = victim->bk``가 되므로, 다음 반환 chunk는 ``c victim->bk``가 된다.


smallbins에 속해 있는 `` victim``을 조작해 ``c victim->bk = fake_chunk``로 만들면, fake_chunk를 smallbins에 연결할 수 있다.

바로 이후 ``c malloc(small)`` 때는 `` victim``이 반환되고, fake_chunk는 그 다음 ``c malloc(small)`` 때 반환된다.



limitation

#1  fake_chunk와 bypass_buf가 존재하며 컨트롤할 수 있어야 한다.

``c fake_chunk->fd & bk``를 채워주어야 check를 회피할 수 있기 때문에 `` fake_chunk , bypass_buf``에 쓰기가 가능해야 한다.

#2

``c malloc(fast)`` 일 때는 smallbins로 옮기기 위해 반드시 ``c malloc(large)``가 필요하다.

``c malloc(small)``일 때는 굳이 ``c malloc(large)``가 아니어도 smallbins으로 옮겨지기 때문에 이런 제한은 없다.
또한 smallbins로 옮길 수 없는 상황이라면 ``c fake_chunk->size``를 채워 unsorted bin unlink를 사용해도 공격을 성공시킬 수 있다.


!

  • fastbin attack
    fastbin에 fake chunk가 들어간다.
  • The House of Lore
    smallbin에 fake chunk가 들어간다.

fastbin attack은 size가 속해있는 fastbin 집단의 size와 일치해야 한다는게 단점.

그래도 조건 맞추기가 비교적 수월한 듯.


'Security > System Exploit' 카테고리의 다른 글

unsorted bin attack  (0) 2017.08.15
[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