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이 존재한다고 가정하였을 때
만약 다음 할당요청 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
이 때 유의할 점은 scanf 함수 사용 시에 stdin structure를 어지럽힐 수 있다
(좀 더 자세히 알아볼 것을 권유)
'System Hacking > Study Notes' 카테고리의 다른 글
아이참 (0) | 2023.01.14 |
---|---|
Seccomp (0) | 2020.09.18 |
[ Kernel ] KAISER와 KPTI, and Exploit (2) | 2020.08.17 |
[ Kernel ] Meltdown 취약점 (0) | 2020.08.16 |
어셈블리어 구구단 만들기 (3) | 2020.07.01 |