1. 조건
Double free bug 가 가능해야 함
(해제된 fast chunk를 한 번 더 해제하는 것이 가능해야 함)
2. 공격 방법
1) 동일한 크기 fast chunk 3개 생성(malloc)
2) 첫 번째 fast chunk 해제(free)
fastbinsY[6] = 0x602000
3) 두 번째 fast chunk 해제(free)
fastbinsY[6] = 0x602080 -> 0x602000(fd)
4) 첫 번째 fast chunk 해제(free) -> double free
fastbinsY[6] = 0x602000 -> 0x602080(fd) -> 0x602000(fd)
5) 공격 대상 영역과 같은 크기의 heap 3개 할당(malloc)
-> 첫 번째 heap 영역과 세 번째 heap 영역 주소(0x602000) 같음
0x602000 영역 malloc 해줌, fastbinsY[6] = 0x602080 -> 0x602000(fd) -> 0x602080(fd)
0x602080 영역 malloc 해줌 fastbinsY[6] = 0x602000 -> 0x602080(fd) -> 0x602000(fd)
0x602000 영역 malloc 해줌, fastbinsY[6] = 0x602080 -> 0x602000(fd) -> 0x602080(fd)
3. example code
# break point 설정
bp1 : 첫 번째 free() 함수 호출
bp2 : 두 번째 free() 함수 호출
bp3 : 세 번째 free() 함수 호출
bp4 : 4 번째 malloc() 함수 호출
bp5 : 5 번째 malloc() 함수 호출
bp6 : 6 번째 malloc() 함수 호출
free() 함수 호출 전에는 fastbinsY에 등록된 chunk 없음
첫 번째 free() 함수 호출 후 fastbinsY에 0x602000 영역이 등록됨
pwndbg> ni
bp2 : 두 번째 heap free() 호출 후
두 번째 heap 영역 주소가 fastbinsY에 등록되고 0x602000(fd)을 가리킴
해제된 두 번째 chunk이 fd에 0x602000 값이 적혀있음
bp3 : 해제된 첫 번째 chunk 다시 free()
fastbinsY에 첫 번째 heap 주소 적혀있음 0x602010은 0x602080(fd) 가리킴
bp4~bp6 ; 동일한 크기(112)의 heap 영역 할당(malloc)
malloc() 함수는 fastbinsY에 동일한 크기의 free chunk가 존재하기 때문에 fastbinsY에 등록된 heap 영역을 재할당해준다.
=> fastbins 가 free chunk를 single list로 관리하가 때문.
동일한 크기의 fast chunk가 여러 개 해제되면 chunk header의 fd 영역을 이용해 관리하는데, double free로 인해 buf1과 buf2 free chunk의 fd 값이 상대 chunk를 가리키기 때문에 이런 현상 발생
fastbinsY[6] = 0x602000 -> 0x602080 -> 0x602000 -> 0x602080
fastbinsY[6] = 0x602000 -> 0x602080
[Heap Exploitation] fastbin_dup_consolidate (0) | 2020.01.01 |
---|---|
[Heap Exploitation] fastbin_dup_into_stack (0) | 2019.11.25 |
[Heap Exploitation] Use-After-Free (UAF) (0) | 2019.11.25 |
[Heap Exploitation] The House of Spirit (0) | 2019.11.11 |
[TechNote] malloc (Heap) (0) | 2019.11.02 |