1. 환경
공격자가 heap 영역을 할당(malloc), 해제(free)할 수 있어야 한다.
2. 공격 방법
1) 2개의 Heap 영역 할당(malloc)
2) 첫 번째 Heap 영역 해제(free)
3) Heap 영역 할당(malloc)
- Fastbin : 해제된 chunk가 fastbinsY에서 관리될 경우 해제된 Heap과 크기 동일하게 할당
- Unsorted bin : 해제된 chunk가 unsorted bin에서 관리되는 small, large chunk인 경우, 해제된 Heap의 크기와 같거나 작은 크기를 할당
4) 해제되었던 Heap 영역을 재할당받게 된다.
3. example vuln code
1) 크기 0x90인 힙 할당
2) 크기 0x100인 힙 할당
3) 크기 0x90인 힙 해제. 이때 a는 여전히 해제된 크기 0x90인 힙 주소 저장
4) 크기 0x90인 힙 할당. 해제된 a가 가리키던 힙 영역이 재할당됨.
따라서 c로 할당된 영역에 값을 넣으면, a는 여전히 동일한 힙 영역을 가리키고 있어서 a가 참조하는 영역의 값 출력 시 동일하게 “Secret message”가 출력됨
4. debugging
# break point 설정
bp1 : free() 함수 호출 (0x4005e1, main+43)
bp2 : malloc(0x90) 호출 (0x4005eb, main+53)
bp3 : leave 명령어 (0x400627, main+113)
포인터 a가 가리키는 heap 영역 주소는 0x602010, b가 가리키는 heap 주소는 0x6020b0이다.
free() 함수가 호출되고 a가 가리키는 0x602010 영역이 해제된다.
a에 heap 주소가 적혀있다.
이 영역이 해제되는 것이고, malloc(0x90)에 의해 c가 가리키는 heap 영역으로 재할당된다.
pwndbg> p main_arena.bins[1]
pwndbg> ni
free() 호출된 이후 unsorted bin에 0x602000이 등록되었다.
malloc(0x90) 호출 후 리턴된 heap 영역 주소는 0x602010(해제된 첫 번째 heap 영역)
-> gblic은 first-fit 알고리즘 이용해서 free chunk를 선택하는데 malloc() 함수는 해당 chunk가 요청된 heap 크기보다 충분히 크거나 같으면 해당 영역을 사용한다.
malloc(0x90) 전
– 0x6020b0 heap 영역은 앞의 chunk가 해제된 상태라서 flag가 0 (110)
-할당되지 않은 나머지 영역은 top chunk 영역 (0x20e50 바이트)
malloc(0x90) 후
0x6020b0 영역의 크기 저장하는 값에서 flag가 1로 바뀜
첫 번째 heap 영역 출력 시 세 번째 heap 영역에 복사한 문자열 출력됨
0x602010에 값이 들어가 있는 것 확인 가능
[Heap Exploitation] fastbin_dup_into_stack (0) | 2019.11.25 |
---|---|
[Heap Exploitation] fast_dup (0) | 2019.11.25 |
[Heap Exploitation] The House of Spirit (0) | 2019.11.11 |
[TechNote] malloc (Heap) (0) | 2019.11.02 |
[Exploit Tech] JOP(Jump-Oriented Programming) (0) | 2019.11.02 |