...
Include Page 00.Notice 00.Notice
List
Table of Contents outline true exclude List
Unsafe unlink
- 할당자는 메모리를 할당하거나 해제할 때 해당 chunk의 size의 값에서 PREV_INUSE flag가 있는지 확인합니다.
- 할당자는 이전 chunk의 fd, bk값을 확인하여, list의 연결을 해제합니다.
- 할당자는 chunk를 bin list에서 연결을 해제하기 전에 해당 chunk→size의 값과 다음 chunk→prev_size의 값이 같은지 확인합니다.
- 두 값이 같다면 해당 chunk의 "fd", "bk"값을 "FD", "BK"에 저장합니다.
- FD→bk와 BK→fd의 값이 해제할 chunk의 pointer와 같은지 확인합니다.
...
Panel | ||
---|---|---|
| ||
Example
- 이 코드는 앞에서 설명한 "Unsafe unlink flow"의 코드 입니다.
- 해당 코드는 malloc()에 크기가 0x80인 메모리 할당을 2번 요청합니다.
- 처음 할당받은 메모리의 주소는 전역 변수인 *buf1에 저장합니다.
- Fake chunk를 만들기 위해 buf의 주소에서 0x18(24)을 뺀 값을 buf1[2]에 저장하고, buf의 주소에서 0x10(16)을 뺀 값을 buf1[3]에 저장합니다.
- 0x80을 두번째 할당받은 chunk(buf2)의 prev_size에 저장하고, PREV_INUSE flag를 해당 chunk의 "size"에서 제거합니다.
- 두번째 할당받은 chunk(buf2)의 해제를 free()에 요청하고, str의 주소를 buf1[3]에 저장합니다.
- read()를 이용하여 &buf1[0]에 데이터를 입력받은 후에 str에 저장된 데이터를 출력합니다.
...
Code Block | ||
---|---|---|
| ||
gdb-peda$ c Continuing. Breakpoint 7, 0x00000000004007c0 in main () gdb-peda$ x/i $rip => 0x4007c0 <main+282>: call 0x400560 <read@plt> gdb-peda$ i r rsi rsi 0x7fffffffe450 0x7fffffffe450 gdb-peda$ c Continuing. AAAABBBB Data from Str : AAAABBBB @ [Inferior 1 (process 10503) exited normally] Warning: not running gdb-peda$ |
Related information
- https://github.com/shellphish/how2heap
- https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=17f487b7afa7cd6c316040f3e6c86dc96b2eec30#l1344
- https://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/malloc.c;h=54e406bcb67478179c9d46e72b63251ad951f356;hb=HEAD#l1404
...