System Hacking/Study Notes

Unsorted bin attack

S!_Jmini 2020. 9. 18. 16:37

glibc-2.23

 


#1. 소개

 

 

unsorted bin attack 은 how2heap에 자세히 소개되어있다

 

 

github.com/shellphish/how2heap/blob/master/glibc_2.26/unsorted_bin_attack.c

 

 

unsorted bin attack은 glibc-2.27 까지 응용가능하며

 

 

실습은 glibc-2.23에서 진행할 예정이다

 

 

 

 

다른 heap 공격기법에 비해 단순하기 때문에 간단히 정리해보면

 

 

unsorted bin attack을 하기 위해서는

 

unsorted bin free chunk의 bk 값 조작만 가능하다면 이용할 수 있고

 

 

unsorted bin attack으로 할 수 있는 것은

 

임의의 주소에 main_arena 주솟값을 남길 수 있다

 

 

 

 

 

 

 

 


#2. 분석하기

 

 

unsorted bin 에 free chunk p1이 존재한다고 가정하였을 때

 

 

unsorted bin의  unlink 과정

 

만약 다음 할당요청 size값이 p1과 일치한다면

 

p1의 bk가 가르키는 주솟값의 fd위치에

 

main_arena+88 주솟값을 작성한다

(main_arena+88은 unsorted bin을 관리하는 chunk)

 

 

이 때 p1의 bk값이 유효한지 검사하지 않기때문에

 

원하는 위치에 main_arena+88 주솟값을 작성할 수 있다

(* 이 때 main_arena+88 주솟값이라함은 main_arean+88의 fd값을 의미)

 

 

 

예시

 

 

위 예시사진에서 보다시피

 

전혀 엉뚱한 곳에 main_arena+88 값이 남아있는 것을 볼 수 있다

 

 

 

 

 

 

 

 


#3. 응용하기

 

 

메모리에 main_arean+88 값을 남겨서 무슨 의미가 있는지 생각이 들 수 있지만

 

사용하기 적합한 곳이 하나 있다

 

 

그 부분은 FILE Stream 중 stdin file structure 인데

 

그 중에서도 io_stdin+64에 해당하는 io_buf_end 부분이다

 

 

 

 

 

먼저 stdin은 입력함수가 호출되어질 때 사용되는 구조체인데

 

사용자의 입력을 버퍼에 저장하여 처리하도록 돕는다

 

 

그 때 버퍼에 해당하는 메모리 공간을 지정하는 것이

 

io_buf_base와 io_buf_end 부분이고

 

base부터 end에 적힌 주솟값까지 사용자의 입력이 저장되는 것이다

 

 

그리고 보다시피 0x7fff7dd1963 부분에

 

사용자의 입력인 '\n' 값이 저장된 것을 볼 수 있다

 

 

그런데 만약 io_buf_end값의 부분이 해당 부분보다 더 큰값으로 변경된다면

 

즉, main_arena+88과 같은 값으로 덮어씌어진다면

 

base부터 main_arena+88까지의 값들을 사용자의 입력값으로 덮을 수 있는 것이다

(기존 io_buf_end보다 main_arean+88값이 더 크기때문에 가능)

 

 

 

예시

 

 

위 예시에서 libc메모리의 일부분을 덮은 모습을 볼 수 있는데

 

노란색 네모박스부분(jump_table) 값까지 덮어버린다면

 

RIP control 까지 가능할 것이다

 

 

프로그램의 흐름조작하는 자세한 방법은 아래에서 

sf-jam.tistory.com/61?category=817387

 

[ 11 ] IO_buf_end overwrite & unsorted bin attack

 

sf-jam.tistory.com

 

 

 

 

이 때 유의할 점은 scanf 함수 사용 시에 stdin structure를 어지럽힐 수 있다

(좀 더 자세히 알아볼 것을 권유)