The House of Lore
The House of Lore
free’d small/fast chunk의 bk를 fake_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)
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와 일치해야 한다는게 단점. 그래도 조건 맞추기가 비교적 수월한 듯.