The House of Einherjar
The House of Einherjar
https://github.com/umbum/pwn/blob/master/how2heap/house_of_einherjar.c
**off-by-one( null)
- Force 응용( huge consolidate ) + unlink check 회피.**
fake chunk까지 consolidate 하고 다시 malloc()
하면 fake chunk가 반환되는 식.
off-by-one(null)
1
2
victim->size's LSB = 0x00
Poison null byte와 같은 off-by-one overflow를 이용해 size LSB를 0x00
으로 만들지만, 차이가 있다.
Poision null byte
free(victim)
이후 off-by-one overflownext\_chunk->prev\_size
위치를 속여 업데이트를 막기 위해 사용한다.
The House of Einherjar
- off-by-one overflow 이후
free(victim)
- consolidate backward 를 유발하기 위해 사용한다.
따라서, Poison null byte는 기존 LSB가 0x00
(flag 제외)이면 안되는데 반해 Einherjar는 기존 LSB가 0x00
이어야 편하다. 0x00
이 아닐 경우 size
가 줄어들어[free] next size check (normal) 에 걸리기 때문에, 줄어든 곳에 bypass_chunk를 만들어 두어야 하기 때문.
Force 응용 ( huge consolidate )
1
2
3
difference = (victim - 2\*sizeof(void\*)) - fake\_chunk\_addr;
victim->prev\_size = difference
The House of Force와 달리 consolidate backward 하므로 difference
피연산자 순서가 반대다.
unlink check 회피
consolidate backward 하면서 fake\_chunk
에 대한unlink 가 일어나며 fake\_chunk
size가 굉장히 크기 때문에 fake\_chunk->fd & bk & fd\_nextsize & bk\_nextsize
모두 설정해주어야 한다.
1
2
3
4
5
fake\_chunk[2] = fake\_chunk; // fd
fake\_chunk[3] = fake\_chunk; // bk
fake\_chunk[4] = fake\_chunk; // fd\_nextsize
fake\_chunk[5] = fake\_chunk; // bk\_nextsize
return fake
free(victim)
하면 ` fake_chunk까지 consolidate되기 때문에 다음 반환 chunk는
fake_chunk`
1
2
3
free(victim);
fake = malloc();
This post is licensed under CC BY 4.0 by the author.