본문 바로가기
Pwnable

Heap Exploitation

by ms-eo 2025. 11. 19.

Use After Free

UAF (Use After Free)

  • 메모리 해제 후, 초기화되지 않은 free chunk를 재사용할 때 생기는 취약점

Dangling Pointer

  • 할당이 해제되어 유효하지 않은 메모리를 가리키는 포인터

공격 기법 실습

  1. 바이너리 파일 정보 수집

2. 바이너리 파일 실행

3. 정적 분석

4. 공격 시나리오

5. Exploit


Double Free Bug

DFB (Double Free Bug)

  • 이미 해제된 chunk인 free chunk를 다시 해제할 수 있을 때 발생하는 버그

glibc 버전 별 DFB 검증

  • glibc 버전 별로 DFB를 검증하는 방식에 있어 차이가 존재
  • DFB 활용 시, glibc 버전을 먼저 확인하고 공격 시나리오를 작성하는 것이 중요

_int_free()

  • chunk가 해제되었을 때 호출되는 함수
  • glibc 2.24 _int_free()

Fastbin Dup (glibc ver. < 2.26)

  • 동일 크기 (fastbin size)의 chunk들을 교차해 free 시켜 double free bug 탐지를 우회하는 공격
  • 공격을 위해 원하는 특정 영역에 공격 코드나 값을 덮어 씌우는 것이 가능

Tcache Dup

  • e → key를 다른 값으로 덮어씌워 DFB 탐지 로직을 우회하는 공격 기법
  • free chunk가 되어 tcache bin에 추가될 경우, e → key에넌 tcache 포인터가 저장된 상태

Unsorted Bin Attack

Unsorted Bin Attack

  • Unsorted Bin의 free chunk 재할당 시, list에서 제거할 때 발생하는 취약점을 이용한 공격 기법
  • main_arena 영역의 주소를 임의의 메모리에 덮어씌워 저장하는 것이 가능

Unsorted Bin Attack 공격 조건

  1. Fake chunk 생성 후 bk 포인터 조작
  2. bk 포인터가 조작된 free chunk를 unsorted bin list 에서 해제

Unsorted Bin into Stack

  • Stack 영역에 생성한 fake chunk를 Unsorted Bin에 연결시킴

Unsafe Unlink

Unlink

  • 병합 시, 연결되어 있던 bin list에서 chunk를 제거할 때 사용하는 개념
  • chunk가 빠져나오면서, 앞 뒤로 인접했던 chunk들의 bk, fd 포인터를 정리해 재연결하는 과정

_int_free()

  • chunk가 해제되었을 때 호출되는 함수
  • 인접 free chunk와 병합 가능한 상황일 경우, unlink() 호출

unlink()

  • Bin에서 free chunk를 제거할 때 호출되는 함수

Unsafe Unlink

  • Unlink 기능을 활용해 공격자가 원하는 주소에 악의적인 코드나 값을 쓰는 공격 기법
  • unlink()에 존재하는 2개의 조건문을 우회할 수 있는 fake chunk 생성

Unsafe Unlinke 공격 조건

  1. 전역 변수에 heap pointer가 선언
  2. 할당된 chunk인 in-use-chunk 2개 필요
  3. Fake chunk 생성이 가능
  4. Fake chunk와 인접한 chunk의 header 조작 가능

Advanced Heap Exploitation

House Series

House of Force : Top chunk의 size를 조작해 임의의 주소에 chunk를 할당할 수 있게 하는 공격

House of Spirit : Fake fastbin chunk 재할당 시 임의의 포인터를 반환하게 해 원하는 주소에 값을 쓰는 공격

House of Botcake : tcache DFB 검증에 쓰이는 e→key의 조작 없이, DFB를 발생시키는 공격

House of Lore : Small bin에서 bck→fd를 조작해서 임의의 주소에 chunk를 할당할 수 있는 공격

House of Einherjar : _int_free()가 chunk를 top chunk에 등록하는 과정을 악용하는 공격

House of Orange : _int_malloc() 내부의 메모리 손상 시 출력하는 error 대신, 원하는 함수를 실행하는 공격

'Pwnable' 카테고리의 다른 글

Heap Basic  (0) 2025.11.19
Integer Overflow  (0) 2025.11.19
Format String Bug  (0) 2025.11.19
Buffer Overflow  (0) 2025.11.19
Pwnable Tools  (0) 2025.11.19