일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- _IO_FILE Arbitrary Address Read
- _IO_FILE
- DreamHack
- HackCTF
- srop
- vtable
- DFB
- Android
- Reversing
- shellcode
- 나뭇잎 책
- RTL
- malware
- K-shield Junior
- heap feng shui
- _IO_FILE Arbitrary Address Write
- Lazenca
- DFC 2022
- BOF
- UAF
- __environ
- master canary
- ROP
- heap exploit
- tcache
- heap
- Dynamic Analysis
- GOT overwrite
- seccomp
- H4CKING GAME
Archives
- Today
- Total
Studying Security
[Heap Exploit] House of Lore 본문
728x90
반응형
_int_malloc이해하기 (small bin)
- malloc()에 요청한 메모리 크기가 small bin범위에 포함되는지 확인합니다.
- small bin에 포함된다?
- 요청된 크기에 해당하는 index를 찾습니다.
- victim = bin[index]->bk 이를 bin[index]와 비교해서 다르다면 victim의 값이 0인지 확인합니다.
- victim에 저장된 값이 0이 아니라면?
- bck = victim->bk에 저장된 값
- victim에 저장된 값이 0이 아니라면?
- bck->fd와 victim의 값이 다른지 확인합니다.
- 두 값이 같지 않다면 ("malloc(): smallbin double linked list corrupted")에러 메시지와 함께 프로세스 종료
- 두 값이 같다면 victim->size에 PREV_INUSE를 설정합니다.
- bck가 가지고 있는 값을 bin→bk에 저장되고, bin이 가지고 있는 값을 bck→fd에 저장합니다.
- 해당 arena가 main arena인지 확인 합니다.
- main arena가 아닐 경우 victim→size에 NON_MAIN_ARENA(0x4) flag를 설정합니다.
- 할당자는 chunk2mem()을 호출하여 반환할 주소(victim + 2*SIZE_SZ)를 *p에 저장하고, p를 반환합니다.
- 할당자는 해당 chunk의 크기가 small bin범위에 포함되는지 확인합니다.
- 해당 chunk가 small bin범위에 포함된다면, 해당 chunk의 인덱스 찾습니다.
- 그리고 bin[victim_index]가 가지고 있는 값을 bck에 저장합니다.
- bck->fd가 가지고 있는 값을 fwd에 저장합니다.
- double linked list를 구현하기 위해 해당 chunk의 bk에 bck가 가지고있는 값을 저장되고, fd에는 fwd가 가지고 있는 값을 저장합니다.
- 해당 chunk의 포인터를 fwd→bk, bck→fd에 저장합니다.
House of Lore
malloc()이 small bin에 해당하는 chunk의 재할당과 small bin에 배치하는 과정을 이용한 공격
조건
- stack에 fake chunk를 작성할 수 있을 때
- free chunk의 bk의 값을 덮어쓸 수 있을 때
과정
- fake free chunk 2개를 stack에 작성합니다.
- small bin에 해당하는 메모리를 할당하고 해제하여 이 메모리를 free chunk로 만듭니다.
- 새로운 메모리 할당을 요청하여 free chunk가 small bin에 배치되도록 합니다.
- fake chunk의 포인터를 free chunk의 bk에 덮어씁니다.
- small bin에 배치된 chunk의 할당을 malloc()에 요청하면, fake chunk의 영역에 해당하는 포인터를 반환합니다.
결과적으로 stack에 영역을 할당받을 수 있습니다.
구조
- 2개의 fake chunk가 필요하며 free chunk의 구조를 가져야 합니다.
- 첫 번째 fake chunk의 포인터를 free chunk(heap에 위치한)의 bk에 저장합니다.
- bins[idx]의 포인터를 첫 번째 fake chunk의 fd에 저장합니다.
- 첫 번째 free chunk의 bk에 2번째 fake chunk의 포인터를 저장합니다.
- 2 번째 fake chunk의 포인터를 첫 번째 free chunk의 bk에 저장합니다.
- 이러한 구조를 통해 small bin에 배치된 chunk의 double-linked list가 손상되었는지 확인(bck->fd != victim)을 우회
House of Lore Flow
- fake chunk를 stack에 생성되고 free chunk를 생성한 후에 해당 chunk를 small bin에 배치
- fake chunk의 포인터를 free chunk의 bk에 저장
- 해당 chunk를 재할당 받기 위해 메모리의 할당을 malloc()에 요청하면 할당자는 fake chunk를 small bin에 배치
- 공격자가 다시 한 번 동일한 크기 메모리 할당을 요청하면 할당자는 fake chunk의 메모리를 반환
Reference
The House of Lore[Korean] - TechNote - Lazenca.0x0
“html” 매크로 렌더링 오류 Notify your Confluence administrator that "Bob Swift Atlassian Apps - HTML" requires a valid license. Reason: VERSION_MISMATCH Excuse the ads! We need some help to keep our site up. “html” 매크로 렌더링 오
www.lazenca.net
반응형
'개념 정리 > Heap' 카테고리의 다른 글
[Heap Exploit] House of einherjar (0) | 2022.05.08 |
---|---|
[Heap Exploit] House of Spirit (0) | 2022.05.05 |
[Heap Exploit] House of Force (0) | 2022.05.04 |
[Heap Exploit] Poison null byte (0) | 2022.05.04 |
[Heap Exploit] Overlapping chunks (0) | 2022.05.02 |
Comments