...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
Fastbin duplicate
- "Fastbin duplicate"는 fastbin에 배치된 리스트를 악용한 공격입니다.
애플리케이션이 fastbin에 포함되는 메모리들을 중복으로 해제를 요청할 경우 할당자는 해당 chunk들을 list에 중복으로 배치됩니다.
중복으로 등록된 chunk와 동일한 크기의 메모리 할당을 여러번 요청하면, 할당자는 해당 chunk의 포인터를 중복으로 리턴합니다.
- 이러한 악용은 fastbin에서만 가능합니다.
- 예를 들어 malloc()에 크기가 112byte인 메모리의 할당을 3번 요청합니다.
- 애플리케이션이 첫번째 메모리의 포인터를 인수로 free()를 호출하면 할당자는 해당 chunk를 fastbin[6]에 배치합니다.
- 그리고 애플리케이션이 두번째 메모리를 해제를 요청하면 할당자는 fastbin[6]에 배치된 chunk의 fd에 해당 chunk를 배치합니다.
- 이미 해제된 첫번째 메모리를 다시 해제를 요청하면 해당 chunk가 fastbin[6]의 list 마지막에 배치됩니다.
- 즉, Fastbin[6]의 list는 "첫번째 메모리(0x602000) --> 두번째 메모리(0x602080) --> 첫번째 메모리(0x602000) --> ..." 와 같은 형태가 됩니다.
- 애플리케이션이 malloc()에 해제된 메모리와 같은 크기의 메모리의 할당을 요청합니다.
- 첫번째 요청에서는 Fastbin에 마지막에 배치된 메모리가 재할당합니다.
- 두번째 요청에서는 그 다음 메모리가 재할당됩니다.
- 세번째 요청에서 첫번째 요청에서 할당받은 메모리와 동일한 메모리가 할당됩니다.
- 즉 애플리케이션은 첫번째 메모리와 세번째 메모리의 포인터는 서로 같은 포인터입니다.
Panel | ||
---|---|---|
| ||
Example
- 다음 코드는 malloc()에게 크기가 112byte인 메모리 할당을 3번 요청합니다.
- 이 코드는 buf1,buf2 해제를 free()에 요청하고, buf1 해제를 다시 요청합니다.
- 그리고 다시 크기가 112byte인 메모리 할당을 malloc()에 3번 요청합니다.
...
Code Block | ||
---|---|---|
| ||
gdb-peda$ c Continuing. Breakpoint 2, 0x00000000004005c6 in main () gdb-peda$ i r rax rax 0x602010 0x602010 gdb-peda$ p main_arena.fastbinsY[6] $3 = (mfastbinptr) 0x602080 gdb-peda$ c Continuing. Breakpoint 3, 0x00000000004005d4 in main () gdb-peda$ p main_arena.fastbinsY[6] $5 = (mfastbinptr) 0x602000 gdb-peda$ i r rax rax 0x602090 0x602090 gdb-peda$ Breakpoint 4, 0x00000000004005e2 in main () gdb-peda$ i r rax rax 0x602010 0x602010 gdb-peda$ p main_arena.fastbinsY[6] $4 = (mfastbinptr) 0x602080 gdb-peda$ |
Related information
...