The House of Einherjar
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 |