Post

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 overflow
  • next\_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 피연산자 순서가 반대다.

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.