exploit

포너블/Heap

heap exploit 공부하기 좋은 곳

사실 눈치 챘을 수도 있지만 지금까지 올라온 heap 블로그는 dreamhack의 Heap Allocator Exploit 강의를 기반으로 필자가 직접 공부하고 이해하며 이해하기 쉽도록 재구성하여 작성한 것들이다. 그래서 이전 블로그들은 매우 기본적인 공격 방법을 설명한 것이며 공격 조건이나 공격 방법 등의 것들도 정해져있는 것이 아니라 버전마다 바뀌기 때문에 익스플로잇 기법을 외워서 하기는 조금 힘들다. 그래서 추천드리는 사이트가 바로 how2heap 이다.https://github.com/shellphish/how2heap GitHub - shellphish/how2heap: A repository for learning various heap exploitation techniques.A repos..

포너블/Heap

Tcache memory leak

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..

포너블/Heap

Tcache House of Spirit

공격조건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..

포너블/Heap

breaking calloc

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 함수를 호출..

포너블/Heap

__malloc_hook overwrite

사실 이전 블로그에 이미 등장했지만 어쩌다보니 순서가 이렇게 되었다.공격조건임의의 주소 참조 가능, 혹은 임의의 주소에 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이 존재하기 때문에 똑같이 적용할 수 ..

포너블/Heap

Heap Feng Shui

공격조건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..

포너블/Heap

Large Bin Attack

공격조건unsorted bin 청크를 만들 수 있어야 한다.large bin 청크를 만들 수 있어야 한다.해제된 large bin의 BK, bk_nextsize를 조작할 수 있어야 한다.libc 2.23에서 가능 2.27 안됨Large Bin Attack 이란?해제된 large bin을 조작하여 원하는 주소에 힙 청크의 주소를 덮어쓸 수 있는 공격 기법이다.예시일반적인 Large bin 의 연결(가장 큰 청크보다는 작고 같은 크기의 chunk없을 때)//_int_mallocvictim_index = largebin_index (size);bck = bin_at (av, victim_index);fwd = bck->fd;...while ((unsigned long) size fd_nextsize; ..

포너블/Heap

Overlapping chunks

공격조건해제된 힙의 size를 조작할 수 있을 때glibc 2.27 미만 Overlapping chunks란?해제된 힙의 size를 기존 힙 청크의 크기보다 큰 값으로 조작하고 할당하면 다른 힙 청크의 영역을 침범하여 메타데이터를 덮어 쓸 수 있다.해당 기법은 두 가지 방법이 있다.방법 1할당하려는 크기가 unsorted bin에 들어간 힙 청크의 크기와 같으면 해당 주소를 재사용하여 할당하는 unsorted bin의 특징을 이용한다.방법 2해제된 힙의 특징을 이용한다.예(방법 1)#include #include #include #include int main(int argc , char* argv[]){ uint64_t *ptr1, *ptr2, *ptr3; uint64_t over_ptr; ptr1 ..