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() 으로 할당되었다는 소리이다. 익명으로 메핑이 되는 경우는 은근히 많다.

  1. 스레드의 공간 ( 스택 등등 )
  2. 특수 malloc
  3. 사용자 정의 mmap
  4. 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 라고 뜬다