1. 목적
Unsorted Bin에 들어있는 unsorted chunk를 다시 할당할 때 unlink 과정에서 발생하는 취약점을 이용해서
main_arena 영역의 주소를 특정 메모리에 저장하는 것
* Unsorted Bin : 해제된 small chunk, large chunk 관리
2. Exploit Plan
1) 2개의 chunk 할당(malloc)
2) 1번째 chunk 해제(free)
-> 해제된 1번째 chunk가 unsorted bin에 등록된다.
3) 1번째 chunk의 bk에 (해제되면 chunk의 user data 영역이 fd와 bk가 됨) 공격 대상 주소를 적는다.
-> 64bit : &공격대상주소 - 0x10
* unlink() 과정에서 bck->fd = unsorted_chunks (av); 를 통해
victim의 변경된 bk 영역에 저장된 값을 bck에 저장한다.
이로 인해 변경된 unsorted chunk의 bk 값 + 0x10 영역에 main_arena.top 주소값 (main_arena+88)을 저장할 수 있다
4) 1번째 heap 영역과 동일한 크기의 heap 영역 할당(malloc)
- 공격 대상 영역에 main_arena 영역의 주소가 저장된다.
3. vuln code
1) chunk 2개 할당
2) 1번째 chunk를 해제
3) 0x602000+0x18(bk) 영역에 &state-0x10 저장하고, 0x602000+0x10(fd) 영역에 main_arena+88 (main_arena의 top 영역) 저장
1번째 heap 영역과 같은 크기 할당 -> state 변수에 main_arena+88 영역 값이 저장된다.
* freeChunk의 bk 영역을 덮어썼기 때문에 이런 현상 발생
- free() 함수에서 덮어쓴 bk값을 확인하고 다음 Chunk가 존재한다고 판단.
- free() 함수는 0x7fffffffe248 영역이 다음 chunk이므로
다음 chunk의 fd 영역(0x7fffffffe258)에 freeChunk의 fd 값 (0x7ffff7dd37b8)을 저장한다.
state 변수에 값이 저장되어 있으므로 if문 조건 우회 가능 -> printf문 출력
이 코드에서는 if문 조건을 우회하기 위해 unsorted bin attack을 사용했지만
main_arena 영역에 값을 덮어쓰거나 global_max_fast 값을 변경하는 것으로 사용할 수도 있다.
[Heap Exploitation] The House of Lore (0) | 2020.01.15 |
---|---|
[Heap exploitation] House of Force (0) | 2020.01.12 |
[Heap Exploitation] unsafe unlink (0) | 2020.01.05 |
[Heap Exploitation] fastbin_dup_consolidate (0) | 2020.01.01 |
[Heap Exploitation] fastbin_dup_into_stack (0) | 2019.11.25 |