[glibc] malloc - 3
* ASLR is disabled
application's initial heap
프로그램이 ``c malloc()`` 등 직접 heap을 할당받는 코드를 실행하지 않더라도, 기본적으로 `` 0x21000``(132KB) 크기의 initial heap을 가지고 있으며 이 heap은 main_arena에 해당한다.
```bash
00400000-00401000 r-xp 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc
00600000-00601000 r--p 00000000 08:01 1442324 /home/umbum/heap_study/no_malloc
00601000-00602000 rw-p 00001000 08:01 1442324 /home/umbum/heap_study/no_malloc
00602000-00623000 rw-p 00000000 00:00 0 [heap]
7ffff7a0d000-7ffff7bcd000 r-xp 00000000 08:01 548924 /lib/x86_64-linux-gnu/libc-2.23.so
```
너무 크지 않은 요청에 대해 main_arena에 요청을 처리할 수 있을 정도의 빈 공간이 있는 경우이면
arena의 일부분을 chunk로 반환한다.
```bash
==Heap malloc test==
Before malloc
After malloc::0x602830 (size:4096)
```
```bash
00602000-00623000 rw-p 00000000 00:00 0 [heap]
```
`` mchunkptr``은 64bit에서는 `` 0x10``이전을 가리키므로, 거기서 부터 출력해보면,
```
gdb-peda$ x/12x 0x602820
0x602820: 0x0000000000000000(prev_size) 0x0000000000001011(size|flag) => chunk의 시작지점
0x602830: 0x0000000074736574(payload) 0x0000000000000000
heap growth
할당할 heap memory가 부족한 경우 ``c malloc()``은 내부적으로 ``c brk() / mmap()`` system call 중 하나를 호출한다.
MMAP_THRESHOLD가 넘는 크기의 할당을 요청하는 경우 : mmap()
``c mmap()``을 사용해 아예 다른 곳에 메모리를 할당한다.
`` MMAP_THRESHOLD``값이 따로 설정되지 않은 경우에는 dynamic하게 결정된다.
```bash
==Heap malloc test==
Before malloc
After malloc::0x7ffff7fb7010 (size:151552)
```
```bash
00400000-00401000 r-xp 00000000 08:01 1442317 /home/umbum/heap_study/heap_test
00600000-00601000 r--p 00000000 08:01 1442317 /home/umbum/heap_study/heap_test
00601000-00602000 rw-p 00001000 08:01 1442317 /home/umbum/heap_study/heap_test
00602000-00623000 rw-p 00000000 00:00 0 [heap]
7ffff7a0d000-7ffff7bcd000 r-xp 00000000 08:01 548924 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7bcd000-7ffff7dcd000 ---p 001c0000 08:01 548924 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dcd000-7ffff7dd1000 r--p 001c0000 08:01 548924 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd1000-7ffff7dd3000 rw-p 001c4000 08:01 548924 /lib/x86_64-linux-gnu/libc-2.23.so
7ffff7dd3000-7ffff7dd7000 rw-p 00000000 00:00 0
7ffff7dd7000-7ffff7dfd000 r-xp 00000000 08:01 548898 /lib/x86_64-linux-gnu/ld-2.23.so
7ffff7fb7000-7ffff7fe0000 rw-p 00000000 00:00 0 !!!! 여기에 할당 !!!!
...
```
추가적인 메모리를 할당하기 위해 syscall ``c mmap()``을 사용하는 것을 알 수 있다.
```bash
...
mmap(NULL, 155648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffff7fb7000
write(1, "After malloc::0x7ffff7fb7010 \n", 29After malloc::0x7ffff7fb7010 ) = 29
...
```
``c free()``하면 ``c munmap()``을 호출한다.
```bash
munmap(0x7f572c15c000, 155648) = 0
write(1, "After free\n", 11After free) = 11
```
작은 크기를 요청했는데 arena에 공간이 부족한 경우 : brk()
``c brk()``는 program break 위치를 변경해서 data segment size를 조정하는 system call이다.
* program break는 uninitialized data segment의 끝 바로 다음 위치를 의미한다.
이를 이용해 top chunk의 크기를 증가시켜 여분의 공간을 확보하거나 줄일 수 있다.
* top chunk : arena의 최상단 chunk
```
==Heap malloc test==
Before malloc
After malloc::0x602830 (size:4096)
After malloc::0x603840 (size:4096)
After malloc::0x604850 (size:4096)
.......
After malloc::0x625a60 (size:4096)
After malloc::0x626a70 (size:4096)
initial heap의 size가 증가했다.
'Security > System Exploit' 카테고리의 다른 글
[glibc] malloc - checks (0) | 2017.07.22 |
---|---|
[glibc] malloc - 4 (0) | 2017.07.21 |
[glibc] malloc - 2 (0) | 2017.07.19 |
[glibc] malloc - 1 (6) | 2017.07.19 |
[메모리 보호 기법] PIE (0) | 2017.07.16 |