Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Include Page
00.Notice
00.Notice

List

Table of Contents
outlinetrue
excludeList

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
titleFast dup flow

Example

  • 다음 코드는 malloc()에게 크기가 112byte인 메모리 할당을 3번 요청합니다.
    • 이 코드는 buf1,buf2 해제를 free()에 요청하고, buf1 해제를 다시 요청합니다.
    • 그리고 다시 크기가 112byte인 메모리 할당을 malloc()에 3번 요청합니다.

...

Code Block
titlefast dup
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

...