Heap exploitation
-
glibc - ptmalloc (1)Heap exploitation/malloc 2020. 3. 1. 16:15
malloc()은 사용자가 프로그램 실행시 동적으로 메모리를 할당받을 수 있게 해주는 함수이다. 이는 내부적으로 sbrk()를 사용해 커널로부터 힙 영역을 할당받는데, sbrk()는 커널모드로 들어가기 때문에 단순히 요청한 크기만큼 sbrk()를 해주면 큰 부하가 걸린다. 이를 해결하기 위해 glibc는 ptmalloc을 사용하여 힙 영역을 관리한다. Arena arena란 힙 영역을 관리하는 구조체로, ptmalloc에서는 쓰레드별로 관리하여 main arena, thread arena가 존재한다. 단일 쓰레딩 환경에서는 main_arena만 존재한다. arena의 구조체는 아래와 같다. struct malloc_state { /* Serialize access. */ mutex_t mutex; /* ..
-
House of Orange - how2heapHeap exploitation/how2heap 2020. 2. 26. 13:59
Abstract House of Orange는 Fake _IO_FILE_plus를 만들고 IO_list_all를 수정한 후 의도적으로 힙에 손상을 일으켜 에러 메시지를 출력하게 한다. 이 때 abort.c 안의 _IO_flush_all_lockup()을 통해 에러 메시지를 출력시키는데, IO_list_all이 수정되었기에 fake _IO_FILE_plus를 실제 File Stream chain으로 인식한다. 이후 이에 대해 _IO_OVERFLOW()를 호출하게 되는데, fake _IO_FILE_plus의 vtable을 참조하기 때문에 RIP를 컨트롤할 수 있다. 말이 너무 길어졌는데, 순서대로 설명하면 아래와 같다. Exploit flow 적당히 큰 free된 청크를 만들기 위해 Top Chunk를 원래..
-
fastbin_dup_consolidate - how2heapHeap exploitation/how2heap 2020. 2. 17. 21:20
Abstract fast chunk와 large chunk를 이용한 fastbin_dup 기법이다. 이름대로 청크 병합을 할 때 발생하는 취약점인데, 힙에서 병합이 일어나는 경우는 아래 두가지가 있다. prev_inuse비트가 해제된 청크를 해제했을 때 prev chunk와 병합 혹은 prev_inuse 비트가 해제된 청크의 앞으로 두번째 청크가 해제했을 때 그 뒤 청크와 병합한다. (해제하는 청크의 앞 혹은 뒤 청크가 해제된 경우) large chunk를 할당했을 때 fastbin chunk와 인접해있는 경우 fastbin chunk와 병합한다. 위 2번째 상황에서 large chunk와 fastbin chunk가 인접해있지 않은 경우 fastbin chunk를 smallbin으로 이동한다 → fast..
-
fastbin_dup_into_stack - how2heapHeap exploitation/how2heap 2020. 2. 17. 20:53
Abstract fastbin_dup을 응용한 기법이다. fastbin_dup를 응용한 기법이다. fastbin_dup과의 차이점은 double-free를 한 후 다시 첫번째, 두번째 청크를 할당하고 첫번째 청크의 fd값을 stack의 주소(여기서는 stack이라 했지만 할당을 원하는 주소)로 변경해주는 것이다. fd값을 변경한 후 다시 같은 크기의 청크를 요청하면 stack의 주소를 리턴해준다. 주의점: fastbin에서 재할당을 할 때는 청크의 사이즈가 요청한 사이즈와 같은지 확인한다. 그래서 변경한 fd값 + 0x8(64bit 기준)의 주소에 청크 사이즈가 저장되어 있어야 한다. 청크의 사이즈는 4바이트만 검사하기 때문에 하위 4바이트만 크기를 맞춰주면 된다. Exploit Flow 동일한 크기의 ..
-
fastbin_dup - how2heapHeap exploitation/how2heap 2020. 2. 17. 20:22
Abstract double-free bug를 이용해 fastbin에 동일한 청클를 두번 등록해 할당받을 수 있는 기법이다. Exploit Flow 1. 동일한 크기의 fast chunk를 3개 할당 2. (1), (2) 순서로 free 3. (1)을 한번 더 free → double-free 4. 동일한 크기의 fast chunk를 3개 할당 → 첫번째, 세번째 할당받은 주소가 같다. Code #include #include int main() { fprintf(stderr, "This file demonstrates a simple double-free attack with fastbins.\n"); // 3개의 힙을 할당 fprintf(stderr, "Allocating 3 buffers.\n");..
-
FSOP - File Stream Oriented ProgrammingHeap exploitation 2020. 2. 15. 04:28
FSOP란 glibc의 FILE 구조체가 가지고있는 vtable을 변경하는 등 파일 스트림을 이용해 프로그램의 흐름을 변경하는 기법이다. Structures struct _IO_FILE 이 구조체는 glibc에서 사용하는 FILE 구조체이다. 파일을 선언하고 fopen으로 파일을 열게 되면 힙에 이 구조체가 생성된다. struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags /* The following pointers correspond to the C++ streambuf protocol. */ /* Note: Tk uses the _IO_read_ptr and..