1. 조건
Double free bug 가 가능해야 함
2. 공격 방법
1) 동일한 크기 fast chunk 3개 생성(malloc)
2) 첫 번째 fast chunk 해제(free)
3) 두 번째 fast chunk 해제(free)
4) 첫 번째 fast chunk 해제(free) -> double free
5) 동일한 크기의 fast chunk 2개 재할당(malloc)
6) 재할당 받은 첫 번째 chunk 영역에 fd에 stack 주소 저장
-> stack 주소 값 + 0x8 영역에는 동일한 chunk size 저장되어야 함 (fastbin에서 재할당 시 chunk size가 요청한 size와 같은지 확인하기 때문)
7) 동일한 크기의 fast chunk 할당
-> fd + 0x10 주소가 리턴된다.
3. example code
fastbinsY[6] = 0x602000 -> 0x602080(fd) -> 0x602000(fd)
0x602000의 fd를 stack 주소로
=> fastbinsY[6] = 0x602000 -> &stack(fd) -> 0x602000(fd)
buf4 0x602000
buf5 0x602080
buf6 0x602000
buf7 &stack
4. debugging
pwndbg> disass main
bp1 : *main+87
bp2 : *main+99
bp3 : *main+111
bp4 : *main+121
bp5 : *main+135
bp6 : *main+213
bp7 : *main+227
# bp1 : 첫 번째 chunk free
첫 번째 heap : 0x602410
두 번째 heap : 0x602490
세 번째 heap : 0x602510
pwndbg> ni
fastbinsY[6] = 0x602410
# bp2 : 두 번째 fast chunk free
두 번째 free chunk의 fd에 0x602410이 저장되고, fastbinsY[6] = 0x602490
# bp3 : 첫 번째 fast chunk 다시 해제(free)
fastbinsY[6] = 0x602410 -> 0x602490
첫 번째 chunk의 fd에 0x602490이, 두 번째 chunk의 fd에 0x602410이 저장되어 있음.
서로를 가리키게 됨.
# bp4 : 해제된 chunk와 같은 크기 재할당 -> fastbinsY에 등록되어 있는 0x602410의 heap 영역이 재할당됨
0x602410 영역 할당해주고, fastbinsY에 첫 번째 chunk의 fd에 저장되어 가리키고 있던 0x602490가 등록됨
# bp5 : 같은 크기 chunk 재할당 – 0x602490 heap 영역이 재할당됨
#fd 값 변조
조건 : 공격대상 영역에 해제된 chunk와 같은 크기 값(0x80) 저장되어 있어야 함
할당받은 4번째 heap 영역에 ‘A’*8개를 입력해서 첫 번째 fast chunk의 fd 값을 변경.
set 명령어로 fd 영역에 공격 대상 주소 값을 저장한다.
=> Stack_var – prev_size
# bp6 :
fastbins 변화 : 0x602000 -> 0x7fffffffe218 -> 0x602010 -> 0x0
0x7fffffffe218 영역이 fastbinsY에 등록되어 0x602000의 다음 free chunk로 인식됨.
-> 0x602000 영역 할당 후 또 한 번 할당받을 경우 0x7fffffffe218 영역이 할당된다.
0x7fffffffe218+0x10 은 fd로 인식되어 여기에 0x602010 저장하고, 0x602010+0x10인 fd에는 0x0 저장
[Heap Exploitation] unsafe unlink (0) | 2020.01.05 |
---|---|
[Heap Exploitation] fastbin_dup_consolidate (0) | 2020.01.01 |
[Heap Exploitation] fast_dup (0) | 2019.11.25 |
[Heap Exploitation] Use-After-Free (UAF) (0) | 2019.11.25 |
[Heap Exploitation] The House of Spirit (0) | 2019.11.11 |