analyze vmmap
드림핵 문제를 풀면서 pwndbg 상에서 vmmap을 유심히 보고 있다보니깐
C
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
0x400000 0x401000 r-xp 1000 0 /home/master_canary/master_canary
0x601000 0x602000 r--p 1000 1000 /home/master_canary/master_canary
0x602000 0x603000 rw-p 1000 2000 /home/master_canary/master_canary
0x603000 0x624000 rw-p 21000 0 [heap]
0x7ffff6e00000 0x7ffff6e01000 ---p 1000 0
0x7ffff6e01000 0x7ffff7601000 rw-p 800000 0
0x7ffff77f0000 0x7ffff79b0000 r-xp 1c0000 0 /lib/x86_64-linux-gnu/libc-2.23.so
0x7ffff79b0000 0x7ffff7bb0000 ---p 200000 1c0000 /lib/x86_64-linux-gnu/libc-2.23.so
0x7ffff7bb0000 0x7ffff7bb4000 r--p 4000 1c0000 /lib/x86_64-linux-gnu/libc-2.23.so
0x7ffff7bb4000 0x7ffff7bb6000 rw-p 2000 1c4000 /lib/x86_64-linux-gnu/libc-2.23.so
0x7ffff7bb6000 0x7ffff7bba000 rw-p 4000 0
0x7ffff7bba000 0x7ffff7bd2000 r-xp 18000 0 /lib/x86_64-linux-gnu/libpthread-2.23.so
0x7ffff7bd2000 0x7ffff7dd1000 ---p 1ff000 18000 /lib/x86_64-linux-gnu/libpthread-2.23.so
0x7ffff7dd1000 0x7ffff7dd2000 r--p 1000 17000 /lib/x86_64-linux-gnu/libpthread-2.23.so
0x7ffff7dd2000 0x7ffff7dd3000 rw-p 1000 18000 /lib/x86_64-linux-gnu/libpthread-2.23.so
0x7ffff7dd3000 0x7ffff7dd7000 rw-p 4000 0
0x7ffff7dd7000 0x7ffff7dfd000 r-xp 26000 0 /lib/x86_64-linux-gnu/ld-2.23.so
0x7ffff7fec000 0x7ffff7ff0000 rw-p 4000 0
0x7ffff7ff6000 0x7ffff7ffa000 r--p 4000 0 [vvar]
0x7ffff7ffa000 0x7ffff7ffc000 r-xp 2000 0 [vdso]
0x7ffff7ffc000 0x7ffff7ffd000 r--p 1000 25000 /lib/x86_64-linux-gnu/ld-2.23.so
0x7ffff7ffd000 0x7ffff7ffe000 rw-p 1000 26000 /lib/x86_64-linux-gnu/ld-2.23.so
0x7ffff7ffe000 0x7ffff7fff000 rw-p 1000 0
0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack]
0xffffffffff600000 0xffffffffff601000 --xp 1000 0 [vsyscall]
0x7ffff6e00000 0x7ffff6e01000 ---p 1000 0
0x7ffff6e01000 0x7ffff7601000 rw-p 800000 0
문득 다음과 같이 사용처가 안나와 있는 공간은 어떤 곳일까 궁금해졌다. 따라서 찾아보니 이 공간은 익명 메모리 메핑 영역이었다. → mmap() 으로 할당되었다는 소리이다. 익명으로 메핑이 되는 경우는 은근히 많다.
- 스레드의 공간 ( 스택 등등 )
- 특수 malloc
- 사용자 정의 mmap
- heap의 arena 구조
등등이 있다. 따라서 해당 공간이 어떤 구조를 띄냐에 따라 알 수도 있다. 예를 들어
0x7ffff6e00000 0x7ffff6e01000 ---p 1000 0
0x7ffff6e01000 0x7ffff7601000 rw-p 800000 0
여기서 800000 의 크기는 리눅스에서 기본으로 제공하는 8MB의 스택의 크기이다. 또한
---p 1000 이런 형태는 흔치 않는 형태로 stack guard page 의 형태이다.
따라서 저부분은 스레드의 스택이 mmap 된 곳이라고 파악 할 수 있다.
이러한 익명 메핑 페이지는 자주 나온다. 흔히 master canary가 있는 fs_base도 익명 페이지로 메핑 되는 영역 중 하나이다.
참고로 최신 우분투의 pwngdb는
C
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
Start End Perm Size Offset File
0x400000 0x401000 r-xp 1000 0 /home/amemoyoi/pwn_venv/master_canary
0x601000 0x602000 r--p 1000 1000 /home/amemoyoi/pwn_venv/master_canary
0x602000 0x603000 rw-p 1000 2000 /home/amemoyoi/pwn_venv/master_canary
0x603000 0x624000 rw-p 21000 0 [heap]
0x7ffff7200000 0x7ffff7201000 ---p 1000 0 [anon_7ffff7200]
0x7ffff7201000 0x7ffff7a01000 rw-p 800000 0 [anon_7ffff7201]
0x7ffff7c00000 0x7ffff7c28000 r--p 28000 0 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7c28000 0x7ffff7db0000 r-xp 188000 28000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7db0000 0x7ffff7dff000 r--p 4f000 1b0000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7dff000 0x7ffff7e03000 r--p 4000 1fe000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e03000 0x7ffff7e05000 rw-p 2000 202000 /usr/lib/x86_64-linux-gnu/libc.so.6
0x7ffff7e05000 0x7ffff7e12000 rw-p d000 0 [anon_7ffff7e05]
0x7ffff7fad000 0x7ffff7fb0000 rw-p 3000 0 [anon_7ffff7fad]
0x7ffff7fb0000 0x7ffff7fb1000 r--p 1000 0 /usr/lib/x86_64-linux-gnu/libpthread.so.0
0x7ffff7fb1000 0x7ffff7fb2000 r-xp 1000 1000 /usr/lib/x86_64-linux-gnu/libpthread.so.0
0x7ffff7fb2000 0x7ffff7fb3000 r--p 1000 2000 /usr/lib/x86_64-linux-gnu/libpthread.so.0
0x7ffff7fb3000 0x7ffff7fb4000 r--p 1000 2000 /usr/lib/x86_64-linux-gnu/libpthread.so.0
0x7ffff7fb4000 0x7ffff7fb5000 rw-p 1000 3000 /usr/lib/x86_64-linux-gnu/libpthread.so.0
0x7ffff7fbd000 0x7ffff7fbf000 rw-p 2000 0 [anon_7ffff7fbd]
0x7ffff7fbf000 0x7ffff7fc3000 r--p 4000 0 [vvar]
0x7ffff7fc3000 0x7ffff7fc5000 r-xp 2000 0 [vdso]
0x7ffff7fc5000 0x7ffff7fc6000 r--p 1000 0 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fc6000 0x7ffff7ff1000 r-xp 2b000 1000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ff1000 0x7ffff7ffb000 r--p a000 2c000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffb000 0x7ffff7ffd000 r--p 2000 36000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffd000 0x7ffff7fff000 rw-p 2000 38000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffffffde000 0x7ffffffff000 rw-p 21000 0 [stack]
0xffffffffff600000 0xffffffffff601000 --xp 1000 0 [vsyscall]다음과 같이 비어있는 것 대신에 anon_7ffff7200 라고 뜬다