...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
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 | ||
---|---|---|
| ||
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"으로 변경 됩니다.
- 그리고 stack_var의 주소에서 8을 뺀값을 "*buf4"에 저장합니다.
- 112를 인수로 malloc()을 2번 호출합니다.
- 첫번째 요청에서는 heap의 pointer가 반환되고, 두번째 요청에서는 stack의 pointer가 반환됩니다.
...
Code Block | ||
---|---|---|
| ||
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
...