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 dup into stack

  • "Fastbin dup into stack"은 "Fastbin dup"을 활용하여 malloc()으로 부터 Stack 메모리를 반환 받을수 있습니다.
  • 기본적인 원리는 "Fastbin dup"와 같습니다.
    • 첫번째 메모리를 해제되고, 두번째 메모리를 해제한 후 첫번째 메모리를 다시 해제합니다.
    • fastbin에 이미 등록된 메모리와 동일한 메모리가 배치되었습니다.
    • fastbin의 상단에 배치된 chunk는 두번째 chunk를 가리키고 두번째 chunk는 상단에 배치된 chunk를 가리키게됩니다.
    • 즉 fastbin의 list는 loop가 됩니다.(Fastbin[6]의 list는 "0x602000 <--> 0x602080)
  • 이러한 list를 활용하여 malloc()으로 부터 Stack의 pointer를 반환받을 수 있도록 악용합니다.
    • 우선 공격자는 list에 배치된 chunk를 재할당 받기위해 메모리 할당을 요청합니다.
    • 그리고 공격자는 stack 주소를 할당받은 메모리의 fd에 저장합니다.
      • 이로 인해 list는 "0x602000 --> Stack"이 됩니다.
  • 해당 Stack에 가짜 chunk 정보를 입력합니다.
    • 재할당 받은 chunk의 크기를 가짜 chunk의 "size"에 입력합니다. 
    • 할당자는 stack에 생성한 가짜 chunk를 정상적인 chunk로 인식합니다.
    • fake chunk의 크기를 인수로 malloc()를 호출하면, 할당자는 fastbin에 등록된 fake chunk를 반환합니다.
  • 할당자는 fastbin에 배치된 메모리를 재할당 할때 해당 chunk의 size를 확인하고, fd를 확인해서 list를 갱신합니다.
    • 해당 주소가 힙인지 스택인지는 확인하지 않습니다.
Panel
titleFastbin dup into stack flow

Example

  • 다음 코드는 112를 인수로 malloc()을 3번 호출합니다.

    • 이 코드는 free()에게 buf1,buf2의 해제를 요청하고, buf1의 해제를 다시 요청합니다.

      • 이로 인해 fastbin의 list에는 동일한 메모리의 pointer가 배치됩니다. 
      • 그리고 이 list는 loop가 됩니다.
    • 여기까지는 "fast_dup.c"의 코드와 동일합니다.

  • 112를 인수로 malloc()을 2번 호출하여 메모리를 할당 받습니다.

    • buf4에 저장된 포인터는 buf1에 저장된 pointer와 같습니다.
    • buf4은 buf1과 같은 메모리이며, buf1은 fastbin에 배치되어있습니다.
    • buf4를 이용하여 fastbin의 정보를 변경할수 있습니다.
  • Fastbin에 가짜 chunk를 배치하기 위해 stack_var[0], [1]에 가짜 chunk정보를 입력합니다.
    • 그리고 stack_var의 주소에서 8을 뺀값을 "*buf4"에 저장합니다.
      • Fastbin의 구조는 "buf1 → buf2 → buf1"에서 "buf1 → &stack_var - 8"으로 변경 됩니다.
  • 112를 인수로 malloc()을 2번 호출합니다.
    • 첫번째 요청에서는 heap의 pointer가 반환되고, 두번째 요청에서는 stack의 pointer가 반환됩니다. 

...

Code Block
titleWrite a value to a fake chunk.
gdb-peda$ c
Continuing.

Breakpoint 7, 0x0000000000400793 in main ()
gdb-peda$ x/i $rip
=> 0x400793 <main+237>:	call   0x400560 <read@plt>
gdb-peda$ i r rsi
rsi            0x7fffffffe3f8	0x7fffffffe3f8
gdb-peda$ ni
AAAAAAAABBBBBBBBCCCCCCCCDDDDDDDD

0x0000000000400798 in main ()
gdb-peda$ x/4gx 0x7fffffffe3f8
0x7fffffffe3f8:	0x4141414141414141	0x4242424242424242
0x7fffffffe408:	0x4343434343434343	0x4444444444444444
gdb-peda$ 

Related information

...