Post

The House of Lore

The House of Lore

free’d small/fast chunk의 bkfake_chunk addr로 overwrite.

https://github.com/umbum/pwn/blob/master/how2heap/house_of_lore_fast.c

https://github.com/umbum/pwn/blob/master/how2heap/house_of_lore_small.c

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

smallbins bk check & unlink

1
2
3
4
5
6
7
8
9
10
11
12
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;

malloc(small) 시 chunk를 smallbins에서 제거하고, next serve chunk를 준비하는 unlink 과정을 이용한다. unlink하면서 bin->bk = victim->bk가 되므로, 다음 반환 chunk는 victim->bk가 된다.

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

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

limitation

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

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

#2

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

!
  • fastbin attack fastbin에 fake chunk가 들어간다.
  • The House of Lore smallbin에 fake chunk가 들어간다. fastbin attack은 size가 속해있는 fastbin 집단의 size와 일치해야 한다는게 단점. 그래도 조건 맞추기가 비교적 수월한 듯.
This post is licensed under CC BY 4.0 by the author.