The House of Einherjar

off-by-one(null) + Force 응용( huge consolidate ) + unlink check 회피.

fake chunk까지 consolidate 하고 다시 ``c malloc()``하면 fake chunk가 반환되는 식.


off-by-one(null)

```c

victim->size's LSB = 0x00

```

Poison null byte와 같은 off-by-one overflow를 이용해 size LSB를 ``c 0x00``으로 만들지만, 차이가 있다.

Poision null byte

  • ``c free(victim)`` 이후 off-by-one overflow
  • ``c next_chunk->prev_size`` 위치를 속여 업데이트를 막기 위해 사용한다.
The House of Einherjar
  • off-by-one overflow 이후 ``c free(victim)``
  • consolidate backward 를 유발하기 위해 사용한다.


따라서, Poison null byte는 기존 LSB가 ``c 0x00``(flag 제외)이면 안되는데 반해 Einherjar는 기존 LSB가 ``c 0x00``이어야 편하다. 

``c 0x00``이 아닐 경우 ``c size``가 줄어들어 [free] next size check (normal)에 걸리기 때문에, 줄어든 곳에 bypass_chunk를 만들어 두어야 하기 때문.


Force 응용 ( huge consolidate )

```c
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가 굉장히 크기 때문에
``c fake_chunk->fd & bk & fd_nextsize & bk_nextsize`` 모두 설정해주어야 한다.
```c
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

``c free(victim)`` 하면 `` fake_chunk``까지 consolidate되기 때문에 다음 반환 chunk는 `` fake_chunk``
```c
free(victim);
fake = malloc();
```


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

Return to VDSO using ELF Auxiliary Vectors leck  (0) 2017.09.02
SROP  (0) 2017.08.17
The House of Force  (0) 2017.08.15
[UNDEAD] The House of Mind  (0) 2017.08.15
unsorted bin attack  (0) 2017.08.15