사실 눈치 챘을 수도 있지만 지금까지 올라온 heap 블로그는 dreamhack의 Heap Allocator Exploit 강의를 기반으로 필자가 직접 공부하고 이해하며 이해하기 쉽도록 재구성하여 작성한 것들이다. 그래서 이전 블로그들은 매우 기본적인 공격 방법을 설명한 것이며 공격 조건이나 공격 방법 등의 것들도 정해져있는 것이 아니라 버전마다 바뀌기 때문에 익스플로잇 기법을 외워서 하기는 조금 힘들다. 그래서 추천드리는 사이트가 바로 how2heap 이다.https://github.com/shellphish/how2heap GitHub - shellphish/how2heap: A repository for learning various heap exploitation techniques.A repos..
tcache에서 라이브러리 영역 주소를 릭하는 방법은 다음과 같다.1. 7개의 tcache_entry 를 꽉 채워 tcache를 사용하지 않도록 한 후 unsorted bin을 만든다. (fast bin에 들어가지 않을 크기여야한다.)// gcc -o leak1 leak1.c -no-pie#include #include #include int main(){ uint64_t *ptr[10]; int i; for(i=0;i 2. tcache에서 허용하지 않는 크기를 할당한 이후 해제해 unsorted bin 을 만든다.// gcc -o leak2 leak2.c -no-pie#include #include #include int main(){ uint64_t *ptr[2]; ptr[0] = malloc(0x4..
공격조건fake chunk의 주소를 알아야 한다. 임의의 주소를 free할 수 있다. Tcache House of Spirit 이란?free 함수의 인자를 조작하여 임의의 메모리를 해제할 수 있을 때 사용할 수 있는 기법으로 원하는 주소에 힙을 할당해 임의의 주소에 값을 쓸 수 있다. 예시// gcc -o spirit1 spirit1.c -no-pie#include #include int main(){ long long fake_chunk[10] = {0,}; fake_chunk[0] = 0; fake_chunk[1] = 0x31; fake_chunk[2] = 0x41414141; free(&fake_chunk[2]); char *fake_alloc = malloc(0x20); printf("fake c..
calloc 이란?calloc은 malloc과 같이 동적으로 메모리를 할당하는 함수이다.calloc은 할당과 동시에 메모리를 초기화 해서 기존에 남이있던 데이터의 재사용을 방지한다.void *calloc(size_t nmemb, size_t size);calloc함수는 다음과 같고 첫 번째 인자는 할당할 크기, 두 번째 인자는 자료형의 크기다.그래서 총 크기는 nmemb * size 가 된다. calloc의 특징- calloc으로 할당한 힙을 해제하면 tcache_entry에 추가되긴 하지만 다시 calloc 함수를 통해 할당 요청을 하면 tcache_entry를 참조하지 않는다. 즉, tcache에 들어가기는 하지만 tcache에서 가져오지는 않는다. breaking calloccalloc 함수를 호출..
사실 이전 블로그에 이미 등장했지만 어쩌다보니 순서가 이렇게 되었다.공격조건임의의 주소 참조 가능, 혹은 임의의 주소에 fake chunk 만들기 가능, 2.34 부터 hook 없어짐 __malloc_hook overwrite란?__libc_malloc에는 hook 함수 포인터가 존재하는데 이는 malloc함수가 시작할 때 실행할 함수의 주소를 가진다. 일반적으로는 null이며 인자값으로는 malloc함수의 인자값을 그대로 사용한다. 그래서 이것을 one_gadget으로 overwrite하고 malloc을 호출하거나 hook을 system함수로 overwrite 하고 malloc(”/bin/sh”의 주소)를 실행하면 셸을 획득할 수 있다.free에도 free_hook이 존재하기 때문에 똑같이 적용할 수 ..
공격조건2.27에서는 가능, heap overflow 발생 Heap Feng Shui란?힙의 레이아웃을 조작하여 원하는 객체를 덮어쓸 수 있게 하는 기법이다.중요한 점은 tcache에서는 size검증을 안해서 heap overflow를 통해 free된 tcache chunk의 fd(next)를 아무 주소로 overwrite하면 그 주소를 chunk로 할당 가능하다.별다른 특징이 없는 기법이다. 예제// gcc -o fengshui1 fengshui1.c -no-pie #include #include #include int add();int del();int edit();int show();char *ptr[20];int ptr_size[20];int heap_idx = 0;int main(){ int i..
공격조건2.27에서는 가능,glibc 2.27의 tcache는 Double Free에 대한 검증이 없는 것으로 알려져 있으나, 로컬에서 사용 중인 Glibc 2.27의 버전은 Ubuntu GLIBC 2.27-3ubuntu1.4로 이후 버전에서 도입된 검증 로직이 적용되었다.사실상 2.26까지 가능하다.임의의 할당과 해제가 가능해야한다.Tcache dup란?tcache는 double free와 같은 버그의 검증이 존재하지 않아 다른 공격기법에 비해 난이도가 낮다. tcache dup는 double free bug를 이용하여 tcache_entry를 조작해 이미 할당된 메모리에 다시 힙 청크를 할당하는 공격기법이다. 2.26 으로 도커짜기도 귀찮으니 그냥 패스 하자. 공격 방식은 fastbin dup와 거의..
공격조건2.23에서는 가능, malloc을 임의로 할 수 있어야함. top chunk의 size를 조작할 수 있다. 임의의 주소를 알고있어야 한다.House of Force란?top chunk의 size를 조작함으로써 임의의 주소에 힙 청크를 할당 할 수 있는 공격 기법이다. 아래는 top chunk를 처리하는 _int_malloc 코드이다.static void *_int_malloc (mstate av, size_t bytes){ INTERNAL_SIZE_T nb; /* normalized request size */ ... mchunkptr remainder; /* remainder from a split */ unsigned long remai..