목록Heap Exploitation (8)
ghkdtlwns987
//fastbin dup into stack #include #include #include int main(){ unsigned long long chunk_size = 0x21; unsigned long long * a = (unsigned long long*)malloc(8); unsigned long long * b = (unsigned long long*)malloc(8); printf("%p %p \n",a,b); free(b); free(a); unsigned long long * c = (unsigned long long*)malloc(8); printf("%p \n",c); *b = (unsigned long long)(((char *)&chunk_size) - sizeof(b)); un..
Heap 으로 Memory leak 하는 방법은 무엇일까? 그 방법은 여러가지가 존재한다. (포인터에 특정 함수의 GOT 를 넣어 출력되게 하거나, File * 를 활용하거나... 등등) 이번에 Heap Exploit 할때, 가장 많이 쓰이는 방법을 하나 소개하려 한다. small bin 이나 large bin 을 해제하게 되면 unsorted bin 에 들어가게 된다. unsorted bin 에 들어가게 된 chunk 는 FD, BK 에 main_arena 의 주소가 들어가게 되는데, main_arena 는 libc.so.6 라이브러리에 존재하는 구조체이기 때문에, libc_leak 이 가능해 진다. 다음은 드림핵에 나와있는 코드를 컴파일 했다. 내가 보여줄 환경은 glibc2.23 버젼이다. (gli..
UAF vs Double free Bug UAF(Use After free) 는 malloc() 하고 free() 했을때 , 또다시 동일 size를 malloc() 하게 되면 기존에 존재하던 heap 영역을 재사용 할 수 있다. 근데 만약 heap 에 포인터가 존재한다면 그 포인터를 system() 과 같은 주소로 덮게 되면 exploit 이 된다. 하지만 UAF 는 glibc2.23 이상은 막혔다. Double free Bug DFB는 free() 를 연속으로 하게되면 발생하는 버그이다. free(ptr1) free(ptr1) -> glibc 2.23 까지는 이와같이 free() 해도 무방했는데, 이제 더이상 위와같이 free()하게 되면 오류가 발생한다. free(ptr1) free(ptr2) fre..
large bin large bin 은 512 바이트 이상의 크기의 chunk가 해제 되었을 때 사용되는 bin이다. large bin 은 이중연결리스트를 사용하고, FIFO 구조를 사용한다. large bin 만의 특성이 있는데 이는 fd_nextsize , bk_nextsize 를 사용한다 if (!in_smallbin_range (nb))// large bin >= 512 { bin = bin_at (av, idx); /* skip scan if empty or largest chunk is too small */ if ((victim = first (bin)) != bin && (unsigned long) (victim->size) >= (unsigned long) (nb)) { victim = ..
smallbin smallbin -> 이중 연결리스트, FIFO 구조 사용 smallbin 의 크기는 512 바이트 미만 ( smallbin bk; if (__glibc_unlikely (bck->fd != victim)) { errstr = ..
unsorted bin unsorted bin 은 다음에 정리할 small bin 과 large bin 크기의 힙 chunk 가 해제되면 이후 재할당을 위해 사용되는 bin이다. -> unsorted bin 의 개수는 1개이다. -> unsorted bin 은 FIFO 구조를 사용한다. 다음은 unsorted bin 코드를 분석해 보도록 하겠다. /* Take now instead of binning if exact fit */ INTERNAL_SIZE_T nb; /* normalized request size */ checked_request2size (bytes, nb); size = chunksize (victim); if (size == nb) { set_inuse_bit_at_offset (vi..
워게임 푸는데 뭔가 제데로 알고있다고 생각되지 않아서 다시 정리하고자 한다. Fastbin : 작은 크기의 heap chunk를 할당하고 해제할 때 사용하는 bin이다. Fastbin 의 특징 -> 단일 연결 리스트 사용 -> 할당 및 해제 속도가 빠름 -> 할당, 해제시 LIFO (후입 선출) 방식으로 처리 -> 두 개의 청크가 인접해 있어도 하나의 청그로 병합되지 않음. 다음은 free 소소코드의 일부다. if ((unsigned long)(size)
hitcon training lab14 를 푸려고했는데, 약간 부족한거 같아, 공부했던걸 약간 끄적여보려고 한다. Unsorted bin 이란? -> 나중에 정리하겠지만, small bin 이나, large bin 이 free() 되었을 때 unsorted bin 에 거쳐 free() 되어진다. 1. unsorted bin 공격이란? Unsorted bin 에 들어가고, free() 될 때 발생하는 unlink 과정에서 발생하는 취약점을 이용해 main_arena 영역의 주소를 특정 메모리에 저장하는 기법이다. 2. Exploit Senario 1) 2개의 heap을 할당 2) index 0 chunk 해제 -> (unlink 취약점 이용) 3) index 0 chunk 의 bk에 주소를 overwrit..