Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
how2heap — 다양한 힙 익스플로잇 기법을 학습하기 위한 저장소입니다. | Kitploit
도구/GitHubGitHub/shellphish/how2heap
ExploitationCTFLearning & EducationCurated ResourcesBinary ExploitationLabs & Practice
GitHubshellphish/how2heap

how2heap

다양한 힙 익스플로잇 기법을 학습하기 위한 저장소입니다.

저장소 보기
8.8k1.3k3개월 전Kitploit 검토 완료

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

교육용 힙 익스플로잇

이 저장소는 다양한 힙 익스플로잇 기법을 학습하기 위한 것입니다. 우리는 Ubuntu의 Libc 릴리스를 기준으로 삼습니다. 각 기법은 해당 Ubuntu 릴리스에서 동작하는 것을 검증했습니다. Debian 계열 운영 체제에서 apt source libc6를 실행하여 사용 중인 Libc의 소스 코드를 다운로드할 수 있습니다. 또한 ▶️를 클릭하면 브라우저에서 gdb를 사용하여 기법을 디버깅할 수 있습니다.

우리는 해킹 미팅 중에 이 아이디어를 떠올렸고, 다음과 같은 기법들을 구현했습니다:

파일▶️기법Glibc 버전패치적용 가능한 CTF 챌린지
first_fit.cglibc malloc의 first-fit 동작을 시연합니다.
calc_tcache_idx.cglibc의 tcache 인덱스 계산을 시연합니다.
fastbin_dup.c▶️fastbin freelist를 악용하여 malloc이 이미 할당된 힙 포인터를 반환하도록 속입니다.< 2.43patch
fastbin_dup_into_stack.c▶️fastbin freelist를 악용하여 malloc이 거의 임의의 포인터를 반환하도록 속입니다.< 2.43patch9447-search-engine, 0ctf 2017-babyheap
fastbin_dup_consolidate.c▶️fastbin freelist와 top chunk 모두에 포인터를 배치하여 malloc이 이미 할당된 힙 포인터를 반환하도록 속입니다.< 2.43patch

GnuLibc는 지속적으로 개발 중이며, 위 기법들 중 일부는 malloc/free 로직에 도입된 일관성 검사로 이어졌습니다. 결과적으로 이러한 검사는 일부 기법을 주기적으로 깨뜨리며, 이를 우회하려면 (가능하다면) 조정이 필요합니다. 우리는 조정이 필요한 각 Glibc 릴리스에 대해 동일한 기법의 여러 버전을 유지하여 이 문제를 해결합니다. 구조는 glibc_<version>/technique.c입니다.

좋은 예제가 있나요? 여기에 추가하세요! 전체 기법을 단일 .c 파일에 인라인으로 작성해 보세요. 그렇게 하면 훨씬 배우기 쉽습니다.

시작하기

빠른 설정

  • 다음 패키지/도구가 설치되어 있는지 확인하세요: patchelf zstd wget (물론 컴파일러용 build-essential 또는 유사한 것, make 등도 필요합니다)
  • 또한, /usr/bin/python은 사용자의 python 바이너리를 가리키거나 그 위치에 있어야 합니다 (예: /usr/bin/python3)```shell git clone https://github.com/shellphish/how2heap cd how2heap make clean base ./malloc_playground
root@kitploit:~
참고: 이렇게 하면 바이너리가 시스템 libc와 링크됩니다. 다른 libc 버전으로 실험하려면 `Complete Setup`을 참조하세요.

## Complete Setup

호스트 머신에서 컴파일된 바이너리에 `LD_PRELOAD`로 libc를 적용하려고 하면 심볼 버전 문제가 발생합니다 ([이 링크](https://github.com/shellphish/how2heap/issues/169) 참조).
이를 우회하는 방법은 두 가지입니다.

### 방법 1: 이전 libc에 링크
이 방법은 링커에게 대상 바이너리를 대상 libc와 링크하도록 지시합니다.```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
H2H_USE_SYSTEM_LIBC=N make v2.23

이 모든 바이너리를 해당 libc에 링크합니다. 더 좋은 점은 디버그 심볼이 포함되어 있다는 것입니다. 이제 호스트 머신에서 어떤 libc 버전이든 사용해 볼 수 있습니다. 이 예제에서는 모든 glibc-2.23 바이너리를 컴파일하고 libc-2.23에 링크합니다. 숫자를 변경하면 다른 libc 버전을 사용해 볼 수 있습니다.

방법 2: docker 사용

이 방법은 Docker 기반 접근 방식을 사용하여 오래된 ubuntu 컨테이너 안에서 바이너리를 컴파일하므로 대상 libc 버전으로 실행할 수 있습니다.```shell git clone https://github.com/shellphish/how2heap cd how2heap

the next command will prepare the target binary so it runs with

the expected libc version

make base ./glibc_run.sh 2.30 ./malloc_playground -d -p

now you can play with the binary with glibc-2.30

and even debug it with the correct symbols

readelf -d -W malloc_playground | grep RUNPATH # or use checksec readelf -l -W malloc_playground | grep interpreter gdb -q -ex "start" ./malloc_playground

root@kitploit:~
# 힙 익스플로잇 도구

여기저기 떠도는 힙 익스플로잇 도구들이 몇 가지 있습니다.

## Malloc Playground

제공된 `malloc_playground.c` 파일은 사용자에게 메모리를 대화형으로 할당하고 해제하는 명령을 입력하도록 요청하는 프로그램의 소스입니다.

## Pwngdb

gdb에서 glibc 힙을 검사합니다: https://github.com/scwuaptx/Pwngdb

## pwndbg

glibc 힙을 보고/조작할 수 있는 기능을 제공하는 익스플로잇 중심의 gdb 플러그인입니다: https://github.com/pwndbg/pwndbg

## gef

glibc 힙을 검사할 수 있는 또 다른 훌륭한 gdb 플러그인입니다: https://github.com/hugsy/gef

## heap-viewer

IDA Pro에서 glibc 힙을 검사합니다: https://github.com/danigargu/heap-viewer

## heaptrace

주소를 심볼로 대체하여 힙 연산을 시각화하는 데 도움을 줍니다: https://github.com/Arinerron/heaptrace

# 기타 리소스

다음은 대략 출판 역순으로 정리한 유용한 힙 익스플로잇 리소스 목록입니다:

## 유용한 힙 익스플로잇 튜토리얼
- GLIBC 힙 익스플로잇 기법 개요 (https://0x434b.dev/overview-of-glibc-heap-exploitation-techniques/) <!-- 2022 -->
- glibc 심층 튜토리얼 (https://heap-exploitation.dhavalkapil.com/) - 책 및 익스플로잇 샘플 <!-- 2022 -->
- glibc-2.31에서 동작하는 힙 익스플로잇 기법 (https://github.com/StarCross-Tech/heap_exploit_2.31) <!-- 2020 -->
- Linux 유저랜드 힙에 대한 고통 없는 입문 (https://sensepost.com/blog/2017/painless-intro-to-the-linux-userland-heap/) <!-- 2017 -->
- ptmalloc 팬진, ptmalloc에 대한 메타데이터 공격과 관련된 리소스 및 예제 모음 (http://tukan.farm/2016/07/26/ptmalloc-fanzine/) <!-- 2016 -->
- Glibc Adventures: The Forgotten Chunk (https://github.com/bash-c/slides/blob/master/pwn_heap/Glibc%20Adventures:%20The%20forgotten%20chunks.pdf) - 고급 힙 익스플로잇 <!-- 2015 -->

## 역사적 힙 익스플로잇 (역사)
- Pseudomonarchia jemallocum (http://www.phrack.org/issues/68/10.html) <!-- 2012 -->
- The House Of Lore: Reloaded (http://phrack.org/issues/67/8.html) <!-- 2010 -->
- Malloc Des-Maleficarum (http://phrack.org/issues/66/10.html) - 일부 malloc 익스플로잇 기법 <!-- 2009 -->
- 또 하나의 free() 익스플로잇 기법 (http://phrack.org/issues/66/6.html) <!-- 2009 -->
- wilderness를 무력화하기 위한 set_head의 사용 (http://phrack.org/issues/64/9.html) <!-- 2007 -->
- 힙을 깨뜨려 이해하기 (https://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf) - 힙 구현과 몇 가지 익스플로잇을 설명합니다 <!-- 2007 -->
- OS X 힙 익스플로잇 기법 (http://phrack.org/issues/63/5.html) <!-- 2005 -->
- The Malloc Maleficarum (http://seclists.org/bugtraq/2005/Oct/118) <!-- 2005 -->
- Exploiting The Wilderness (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- Doug lea의 고급 malloc 익스플로잇 (http://phrack.org/issues/61/6.html) <!-- 2003 -->

# 하드닝
glibc에는 `export MALLOC_CHECK_=1` (일부 검사 활성화), `export MALLOC_PERTURB_=1` (데이터가 덮어써짐), `export MALLOC_MMAP_THRESHOLD_=1` (항상 mmap() 사용), ... 등과 같은 몇 가지 "하드닝" 조치가 내장되어 있습니다.

자세한 정보: [mcheck()](http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html), [mallopt()](http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html).

또한 [mtrace()](http://manpages.ubuntu.com/mtrace), [malloc_stats()](http://manpages.ubuntu.com/malloc_stats), [malloc_info()](http://manpages.ubuntu.com/malloc_info), [memusage](http://manpages.ubuntu.com/memusage) 및 이 계열의 다른 함수들에도 추적 지원이 있습니다.
도구 다운로드
Hitcon 2016 SleepyHolder
unsafe_unlink.c▶️손상된 청크에 대한 free를 악용하여 임의 쓰기를 수행합니다.latestHITCON CTF 2014-stkof, Insomni'hack 2017-Wheel of Robots
house_of_spirit.c▶️가짜 fastbin 청크를 해제하여 malloc이 거의 임의의 포인터를 반환하도록 합니다.latesthack.lu CTF 2014-OREO
poison_null_byte.c▶️단일 널 바이트 오버플로를 악용합니다.latestPlaidCTF 2015-plaiddb, BalsnCTF 2019-PlainNote
house_of_lore.c▶️smallbin freelist를 악용하여 malloc이 거의 임의의 포인터를 반환하도록 속입니다.latest
overlapping_chunks.c▶️새 할당이 기존 청크와 겹치도록 unsorted bin에 있는 해제된 청크 크기의 덮어쓰기를 악용합니다.< 2.29patchhack.lu CTF 2015-bookstore, Nuit du Hack 2016-night-deamonic-heap
overlapping_chunks_2.c▶️새 할당이 기존 청크와 겹치도록 사용 중인 청크 크기의 덮어쓰기를 악용합니다.< 2.29patch
mmap_overlapping_chunks.c새 할당이 현재 mmap 청크와 겹치도록 사용 중인 mmap 청크를 악용합니다.latest
house_of_force.c▶️malloc이 거의 임의의 포인터를 반환하도록 Top Chunk (Wilderness) 헤더를 악용합니다.< 2.29patchBoston Key Party 2016-cookbook, BCTF 2016-bcloud
unsorted_bin_into_stack.c▶️거의 임의의 포인터를 반환하도록 unsorted bin freelist에 있는 해제된 청크의 덮어쓰기를 악용합니다.< 2.29patch
unsorted_bin_attack.c▶️임의 주소에 큰 값을 쓰기 위해 unsorted bin freelist에 있는 해제된 청크의 덮어쓰기를 악용합니다.< 2.29patch0ctf 2016-zerostorage
large_bin_attack.c▶️임의 주소에 큰 값을 쓰기 위해 large bin freelist에 있는 해제된 청크의 덮어쓰기를 악용합니다.< 2.42patch0ctf 2018-heapstorm2
house_of_einherjar.c▶️단일 널 바이트 오버플로를 악용하여 malloc이 제어된 포인터를 반환하도록 속입니다.latestSeccon 2016-tinypad
house_of_water.cUAF 또는 double free를 악용하여 t-cache 메타데이터를 누수 없이 제어하고, libc를 t-cache에 연결하는 누수 없는 방법을 확보합니다.latest37c3 Potluck - Tamagoyaki
sysmalloc_int_free.cmalloc (sysmalloc _int_free() )을 사용하여 거의 임의 크기의 Top Chunk (Wilderness)를 해제하는 것을 시연합니다.latest
house_of_orange.c▶️임의 코드 실행을 얻기 위해 Top Chunk (Wilderness)를 악용합니다.< 2.26patchHitcon 2016 houseoforange
house_of_tangerine.ctcache freelist를 악용하여 malloc이 완전히 임의의 포인터를 반환하도록 Top Chunk (Wilderness)를 악용합니다.>= 2.26PicoCTF 2024- high frequency troubles
house_of_roman.c▶️가짜 fastbin, unsorted_bin attack 및 상대적 덮어쓰기를 통해 원격 코드 실행을 얻기 위한 누수 없는 기법.< 2.29patch
tcache_poisoning.c▶️tcache freelist를 악용하여 malloc이 완전히 임의의 포인터를 반환하도록 속입니다. (2.32 이상에서는 힙 릭이 필요합니다)> 2.25patch
tcache_house_of_spirit.c▶️가짜 청크를 해제하여 malloc이 거의 임의의 포인터를 반환하도록 합니다.> 2.25
house_of_botcake.c▶️tcache의 double free 제한을 우회합니다. tcache_dup을 다시 위대하게 만듭니다.> 2.25
tcache_stashing_unlink_attack.c▶️calloc의 도움으로 small bin freelist에 있는 해제된 청크의 덮어쓰기를 악용하여 malloc이 임의의 포인터를 반환하도록 속이고 임의 주소에 큰 값을 씁니다.> 2.25Hitcon 2019 one punch man
fastbin_reverse_into_tcache.c▶️임의 주소에 큰 값을 쓰기 위해 fastbin에 있는 해제된 청크의 덮어쓰기를 악용합니다.2.26 - 2.42patch
house_of_mind_fastbin.c▶️arena 처리를 이용한 단일 바이트 덮어쓰기를 악용하여 임의 주소에 큰 값(힙 포인터)을 씁니다.< 2.43patch
house_of_storm.c▶️large bin과 unsorted bin 청크 모두에서 use-after-free를 악용하여 malloc에서 임의의 청크를 반환합니다.< 2.29
house_of_gods.c▶️8번의 할당 안에 스레드의 arena를 가로채는 기법< 2.27
decrypt_safe_linking.c▶️연결 리스트에서 오염된 값을 복호화하여 실제 포인터를 복구합니다.>= 2.32
safe_link_double_protect.c포인터를 두 번 보호하여 PROTECT_PTR을 누수 없이 우회하고, t-cache에서 임의 포인터 연결을 허용합니다.>= 2.3237c3 Potluck - Tamagoyaki
tcache_dup.c(더 이상 사용되지 않음)tcache freelist를 악용하여 malloc이 이미 할당된 힙 포인터를 반환하도록 속입니다.2.26 - 2.28patch
tcache_metadata_poisoning.ctcache 메타데이터 구조체를 조작하여 tcache가 임의의 포인터를 제공하도록 속입니다.>= 2.26
house_of_io.c해제된 tcache 청크에서 UAF로 tcache 관리 구조체를 조작하여 malloc이 임의 메모리를 가리키는 포인터를 반환하도록 속입니다.2.31 - 2.33
tcache_relative_write.c경계를 벗어난 tcache 메타데이터 쓰기를 통한 힙 내 임의의 십진 값 및 청크 포인터 쓰기2.30-2.41patch
tcache_metadata_hijackingtcache 메타데이터로의 오버플로를 통한 임의 할당>= 2.42