티스토리 뷰

System Study

Analyze heap structure ( glibc malloc )

marshimaro aSiagaming 2017. 7. 9. 23:33

Basic Heap Exploit Study -> how2heap -> Easy CTF Problem -> :-)

이번주의 system exploit 공부 목표





glibc -> heap_info, malloc_state, malloc_chunk라는 구조를 가지고 있음.


heap_info, malloc_state는 main_arena와 thread_arenaa의 차이점을 지니고 있음.


glibc malloc() function -> ( if compiled ) __libc_malloc()

malloc루틴 내에서 또다른 malloc routine들이 불림.



main_arena -> brk(), sbrk()로 영역을 확장.

thread_arena -> mmap()으로 영역을 확장.


* What is Arena? 

-> Main Thread 뿐만 아닌 다른 Threads들 모든 것들에 대한 Heap 영역.


malloc_state -> bins, top_chunk, last_remainder_chunk 등등에 대한 정보를 가지고 있음.


thread_arena의 malloc_state -> heap 영역에 존재    /    thread_arena에서는 multiple heaps라고해도, 하나의 malloc_state만을 가지게 된다.

main_arena의 malloc_state -> 라이브러리의 data 영역에 존재


* main_arena는 heap_info를 갖지 않음.



malloc_chunk -> Heap영역은 User Request에 의하여 chunk로 나누어진다.


chunk의 종류는 일반적으로 4가지 : Allocated Chunk, Free Chunk, Top Chunk, Last Remainder Chunk




[ Allocated Chunk ]


유저에게 반환되는 포인터인 mem과 prev_chunk, next_chunk를 계산할 때 쓰이는 chunk포인터는 서로 별개의 것이다. -> malloc.c에 매크로로 선언되어 있음.

-> next_chunk, prev_chunk는 현재 chunk를 기준으로 prev_size, size를 바탕으로 연산을 진행한다.


현재 size의 끝 3bit는 flags를 담는데, 0x1 0x2 0x4이다. -> PREV_INUSE, IS_MMAPED, NON_MAIN_ARENA



[ Free Chunk ]


Allocated Chunk가 Free되게 되면, User에게 반환되었던 mem의 위치부터 fd, bk가 생성된다.

fd는 bin리스트에 존재하는 다음 chunk의 chunk_ptr을 가리키게 되고, bk는 리스트상의 이전 chunk_ptr을 가리키게 된다.




Bins는 Fastbin을 제외하고는 double linked list를 구성하고 있다.



일단 Bins는 Size에 의존적인데, 왜냐하면 Size에따라 Fastbin, Unsortedbin, Smallbin, Largebin으로 나누어지기 때문이다.



[ Heap Exploit ]


malloc, free -> glibc에서 제공하는 library Function.

똑같은 메모리주소를 1번이상 free하면 안된다. ( 개발자가 조심해야함 ) -> Exploit Vector

Heap overflow를 주의. -> beyond the amount of memory requested



나머지는 how2heap + 아래의 링크와 같이 공부




Heap exploit에 좋은 문서 : https://heap-exploitation.dhavalkapil.com/

'System Study' 카테고리의 다른 글

HITCON Training sysmagic [ lab1 ]  (0) 2017.07.10
unsafe unlink exploit [ Heap exploit ]  (0) 2017.07.10
Analyze heap structure ( glibc malloc )  (0) 2017.07.09
x86 32bit system call convention  (0) 2017.07.07
GDB-PEDA 명령어  (0) 2017.07.07
checksec vs pwntools ELF function  (0) 2017.07.04
댓글
댓글쓰기 폼