Studying Security

[Heap Exploit] House of Lore 본문

개념 정리/Heap

[Heap Exploit] House of Lore

J4guar 2022. 5. 7. 16:03
728x90
반응형

_int_malloc이해하기 (small bin)

  • malloc()에 요청한 메모리 크기가 small bin범위에 포함되는지 확인합니다.
  • small bin에 포함된다?
    • 요청된 크기에 해당하는 index를 찾습니다.
    • victim = bin[index]->bk 이를 bin[index]와 비교해서 다르다면 victim의 값이 0인지 확인합니다.
      • victim에 저장된 값이 0이 아니라면?
        • bck = victim->bk에 저장된 값
    • 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

  1. fake chunk를 stack에 생성되고 free chunk를 생성한 후에 해당 chunk를 small bin에 배치
  2. fake chunk의 포인터를 free chunk의 bk에 저장
  3. 해당 chunk를 재할당 받기 위해 메모리의 할당을 malloc()에 요청하면 할당자는 fake chunk를 small bin에 배치
  4. 공격자가 다시 한 번 동일한 크기 메모리 할당을 요청하면 할당자는 fake chunk의 메모리를 반환

<1번 과정>
<2, 3, 4번 과정>

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