공격조건2.23에서는 가능, malloc과 free를 임의로 할 수 있어야함. heap영역의 주소를 알 수 있어야 함, free된 chunk에 접근 가능해야함, fake chunk의 주소 알아야 함.House of Lore란?smallbin 크기의 힙이 존재 할 때 bck→fd를 조작하여 임의의 주소에 청크를 할당할 수 있는 공격 기법이다.하지만 이에는 몇 가지 검증 코드가 있기 때문에 이를 우회해야 한다.if (in_smallbin_range (nb)){ idx = smallbin_index (nb); bin = bin_at (av, idx); if ((victim = last (bin)) != bin) { if (victim == 0) /* initialization check */ mal..
공격조건2.23에서는 가능, fake chunk의 주소(stack 주소) 알아야 함. 임의의 주소 free 가House of Spirit이란?stack에 fake fastbin chunk를 만들고 이를 free하면 이 fake chunk가 fast bin에 들어가게 된다. 그리고 다시 재할당을 하면 fake chunk가 할당된다. 단, fake chunk의 header 크기를 정상적인 크기로 해줘야 한다. 간단하니까 실습은 패스
공격조건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; ..
공격조건해제된 힙의 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 ..
unsorted bin attack공격조건glibc 2.27에 가능(단 tcache에 들어가지 않는 크기여야함)기본적으로는 glibc 2.23 공격기법이다. 해제된 청크의 bk 포인터를 조작할 수 있어야 한다. 기본적으로 모든 버전에서 free된 chunk에 접근하여 값을 쓸 수 있어야한다. unsorted bin attack이란?해제된 청크의 bk 포인터를 조작할 수 있을 때, 임의 주소에 main_arena 영역의 주소를 쓸 수 있는 공격 기법이다.쓰여지는 값은 주로 특정 버퍼의 사이즈를 덮는 등 추가적인 공격을 연계하기 위해 사용된다. 재할당 과정fastbin의 크기가 아닌 청크를 처음 해제하면 fd, bk 영역에 main_arena 영역의 주소가 써진다. 그리고 같은 크기로 힙을 할당하면 fd를 ..
double free란?해당 취약점은 libc 2.23에서 발생하는 취약점으로 free를 두번 하게 되면서 생기는 오류이다.if (__builtin_expect (old == p, 0){ errstr = "double free or corruption (fasttop)"; goto errout;}이러한 코드로 인해 free를 두번 할 경우 오류가 생긴다. 하지만 만약 chunk1 해제후 chunk2를 해제하고 다시 chunk1을 해제하면 old는 chunk2이고 p는 chunk1이여서 이 오류검출을 우회할수있다. 그러면 같은 binlist에 같은 주소가 2개가 생긴다. 이렇게되면 재할당시 두개의 객체가 한 개의 주소를 가리킬수 있게 된다.#include #include int main(){ ..
UAF란?Use After Free해제된 메모리에 접근할 수 있을때 발생하는 취약점공격조건메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화하지 않는경우해제한 메모리를 초기화하지 않고 다음 청크에 재할당glibc 2.27 이하에서 가능Dagling Pointer란?유효하지 않은 메모리 영역을 가리키는 포인터취약한 부분malloc함수는 할당한 메모리의 주소를 반환하여 선언된 포인터에 저장된다. 그리고 free를 하면 chunk를 반환하는데 이때 chunk의 주소를 담고 있던 포인터를 초기화하지 않는다. 따라서 free이후에 프로그래머가 포인터를 초기화하지 않으면 포인터는 해제된 chunk를 가리키는 Dangling Pointer가 된다.따라서 공격자에게 공격 수단으로 활용될 수도 있다.예1// ..