...
- 다음과 같은 방법으로 공격할 수 있습니다.
Add Free chunk to Unsorted bin
- 1개의 Heap 영역을 생성합니다.
- Top chunk 영역에 아래와 같은 조건을 만족하는 값을 덮어 씁니다.
- Top chunk + size는 페이지 정렬이 되어야 합니다.
- Top chunk 값에 prev_inuse 비트를 설정해야 합니다.
- Ex) Top chunk : 0x20c01, Overwrite to value : 0xc00 + 0x1 = 0xc01
- Top chunk 영역의 값보다 큰 크기의 Heap 영역을 생성합니다.
- Malloc은 이 요청을 처리하기 위해 sysmalloc이 호출됩니다.
- sysmalloc()의 _int_free() 함수에 의해 "Top chunk - 0x8" 영역이 Unsorted bin에 등록됩니다.
- "Top chunk" 영역을 Free chunk 형태를 가집니다.
- Write to "Fake struct _IO_FILE_plus", " Fake struct _IO_wide_data"
- Free chunk 영역에 "Fake struct _IO_FILE_plus", "Fake struct _IO_wide_data" 구조를 작성합니다.
- Fake "struct _IO_FILE_plus"
- _mode = '0' 보다 큰 값
vtable = "Fake vtable address"
_wide_data = "Fake struct _IO_wide_data"가 저장된 주소
Fake "struct _IO_wide_data"
Fake "struct _IO_FILE_plus"가 작성된 공간을 활용 할 수 있습니다.
_IO_flush_all_lockp() 함수에서 사용하지 않는 "fp"변수의 "_freeres_list", "_freeres_buf" 영역 다음과 같이 활용합니다.
- fp→_wide_data 변수에 fp→_offset의 주소 값을 저장합니다.
- fp→_freeres_list = _wide_data->_IO_write_ptr
- fp→_freeres_buf = _wide_data->_IO_write_base
- fp→_wide_data 변수에 fp→_offset의 주소 값을 저장합니다.
- Fake "struct _IO_FILE_plus"
- Unsorted bin attack
- Free chunk의 bk 영역에 "&_IO_list_all - 0x16 0x10" 값을 덮어 씁니다.
- Free chunk를 smallbin[4]에 등록하기 위해 Free chunk의 size 값을 변경합니다.
- 사용 가능한 크기 : 90 ~ 98
- 새로운 Heap 영역을 생성합니다.
- House of orange(?)
- _int_malloc() 함수에서 "_IO_list_all" 영역의 값을 "main_arena.Top" 영역 주소로 변경합니다.
- _int_malloc() 함수에서 smallbin[4] 영역의 값이 Free chunk 의 주소로 변경합니다.
- _int_malloc() 함수에서 메모리 손상으로 인해 _IO_flush_all_lockp() 함수를 호출합니다.
- _IO_flush_all_lockp() 함수는 변경된 "_IO_list_all"의 값(main_arena)을 사용하게 됩니다.
_IO_flush_all_lockp() 함수의 "fp = fp→_chain" 코드에 의해 fp 값이 변경됩니다.
- 변경된 fp의 값은 "Fake struct _IO_FILE_plus"의 시작 주소입니다.
- _IO_flush_all_lockp() 함수는 변경된 fp의 값을 이용해 _IO_OVERFLOW를 호출합니다.
_IO_list_all->vtable->_IO_overflow_t
- _IO_OVERFLOW : fp + 0x60(vtable) → + 0x18(_IO_overflow_t) = 호출할 함수의 주소
...