House of SpiritHouse of Spirit?House of Spirit은 스택에 fake chunk를 구성하고 이를 free함수에 전달하여 fastbin이나 tcache에 등록한 뒤, 다시 malloc을 호출하여 재할당 하는 기법이다. 1. 공격 조건free의 인자로 전달되는 포인터를 조작할 수 있어야 한다.스택 등 목표 위치에 가짜 청크를 구성할 수 있어야 한다.조작된 포인터를 free하고 다시 malloc할 수 있는 로직이 있어야 한다. 2. glibc 2.23 동작 과정glibc 2.23 의 _int_free 함수 일부이다. if ((unsigned long)(size) top)#endif ) { if (__builtin_expect (chunk_at_offset (p..
전체 글
Large bin attackLarge bin attack?Large bin은 크기가 큰 청크들을 순서대로 정렬하여 관리한다.Large bin에 있는 청크(fwd)의 bk를 조작하여 임의 주소에 청크(victim) 주소를 덮어쓰는 공격 기법이다.이때 victim과 fwd의 크기가 같을 때 bk_nextsize까지 이용하여 임의 주소 2곳에 청크 주소를 덮어씌울 수 있다. 1. 공격 조건Unsorted bin 청크를 만들 수 있어야 한다.large bin 청크를 만들 수 있어야 한다.large bin 에 있는 청크의 bk, bk_nextsize를 조작할 수 있어야 한다. 2. glibc 2.23 large bin 동작 과정_int_malloc 함수가 Unsorted bin에서 Large bin으로 청크를 ..
Overlapping chunksOverlapping chunks?free chunk의 size 값을 변경하여 해당 chunk가 기존 크기보다 더 큰 메모리를 할당 받도록 만들어 기존 chunk의 공간을 덮어쓰는 기법이다. 1. 공격 조건free chunk를 생성할 수 있어야 한다.free chunk의 size 영역을 조작할 수 있어야 한다. 2. 방법unsorted bin의 특징을 이용한다.해제된 힙의 특징을 이용한다. 방법 1 (unsorted bin 이용)1. glibc 2.23 free (unsorted bin)static void_int_free (mstate av, mchunkptr p, int have_lock){ // ... size = chunksize (p); free 함수는 p의 ..
Unsorted bin Memory LeakUnsorted bin Memory Leak?Unsorted bin에 청크가 처음 들어갈 때 fd, bk에 main arena 영역의 주소가 쓰이게 된다.main arena는 libc 안에 있는 구조체이기 때문에 fd, bk를 알아낸다면 libc base를 구할 수 있다. 1. 공격 조건공격자가 malloc과 free를 할 수 있어야 한다.malloc이 초기화 되지 않아야 한다.free된 청크가 tache나 fastbin이 아닌 unsorted bin에 들어가도록 큰 크기여야 한다. 예제 코드#include #include int main(){ char *ptr = malloc(0x510); char *ptr2 = malloc(0x510); free(ptr)..
Unsorted bin attackUnsorted bin attack?Unsorted bin은 다양한 크기의 해제된 청크들이 다른 bin으로 정렬되기 전에 임시로 저장되는 공간이다.해제된 청크가 Unsorted bin에 들어오면 청크의 fd, bk 포인터는 unsorted bin의 헤더를 가리키게 되어 이중 연결 리스트를 생성한다.이 때 Unsorted bin에 있는 청크의 bk 포인터를 공격자가 덮어씌울 수 있다면 임의의 주소에 main arena 영역의 값을 쓸 수 있다. 1. 공격 조건Unsorted bin에 들어갈만한 청크를 생성할 수 있어야 한다.Unsorted bin에 들어간 청크의 bk 포인터 값을 변경할 수 있어야 한다.해제된 청크와 동일한 크기의 청크를 요청할 수 있어야 한다.(동일하지 ..
Unsafe UnlinkUnsafe Unlink?unsafe, unlink는 헤더 값이 조작된 fake chunk와 다른 인접한 청크가 병합되면서 비정상적으로 unlink되어 발생하는 취약점이다. 1. 공격 조건헤더 조작 : free된 청크의 fd, bk 포인터를 원하는 주소로 덮어쓸 수 있어야 한다unlink : 조작된 청크와 인접한 청크를 free하여 병합을 유도하고 unlink가 호출되게 만든다. 2. unlinkfastbin을 제외한 나머지 bin들은 인접한 free chunk가 있다면 병합할 수 있다.bin list 는 double linked list 구조로 되어 있기 때문에 병합이 일어날 경우 fd, bk 포인터를 정리해주는 작업이 필요하다.이 작업을 unlink라고 한다. 위와 같은 상태에..
Fastbin ConsolidateFastbin Consolidate?fastbin의 처리 로직 때문에 생기는 취약점이다.malloc으로 큰 크기의 요청이 들어오면 fastbin에 있던 청크들을 병합 시킨 뒤 unsorted bin으로 넣는다.그 다음 unsorted bin을 정리하는 과정에서 적절한 bin(small, large)으로 이동시킨다.→ 큰 크기의 요청을 받아 unsorted bin으로 이동되어 fastbin에서 사라진 청크를 다시 free함으로써 double free가 발생한다 1. 청크 할당glibc 2.23 fastbin에서 unsorted bin으로 청크를 옮기는 과정은 다음과 같다.if ((unsigned long) (nb) 요청된 크기가 fastbin의 최대 크기보다 작거나 같은..
보호되어 있는 글입니다.
Fastbin Duplicate1. Fastbni dup?Fastbin dup은 Double Free 버그를 이용하여 Free된 청크의 fd포인터를 조작하여 임의의 주소에 잇는 fake chunk를 fastbin 리스트에 연결하는 것이다. glibc 2.23의 free()함수에서 fastbin에 chunk를 삽입할 때, 중복 삽입을 방지하기 위한 코드는 다음과 같다.if (__builtin_expect (old == p, 0)) { errstr = "double free or corruption (fasttop)"; goto errout; }현재 해제하려는 청크 p가 fastbin 리스트의 맨 앞(head)에 있는 청크 old와 같은지만 비교한다.리스트의 맨 앞(old)만 아니라면 ..
Heap - glibc 2.23 (_int_malloc)_int_malloc1. _int_mallocstatic void *_int_malloc (mstate av, size_t bytes)mstate av : 아레나를 가리키는 포인터이다.size_t bytes : 사용자가 malloc(byte)를 통해 요청한 순수한 메모리 크기이다. INTERNAL_SIZE_T nb; /* normalized request size */ unsigned int idx; /* associated bin index */ mbinptr bin; /* associated bin */ mchunkptr victim; ..