Linux x86-64 Process virtual memory layout shortcut
이 글은 다른 이 관련분야를 이어준 shortcut글이다.
C
pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA
Start End Perm Size Offset File
0x555555554000 0x555555555000 r--p 1000 0 /home/pwn/prob
0x555555555000 0x555555556000 r-xp 1000 1000 /home/pwn/prob
0x555555556000 0x555555557000 r--p 1000 2000 /home/pwn/prob
0x555555557000 0x555555558000 r--p 1000 2000 /home/pwn/prob
0x555555558000 0x555555559000 rw-p 1000 3000 /home/pwn/prob
0x555555559000 0x55555557a000 rw-p 21000 0 [heap]
0x7ffff7d8f000 0x7ffff7d92000 rw-p 3000 0 [anon_7ffff7d8f]
0x7ffff7d92000 0x7ffff7dba000 r--p 28000 0 /home/pwn/libc.so.6
0x7ffff7dba000 0x7ffff7f4f000 r-xp 195000 28000 /home/pwn/libc.so.6
0x7ffff7f4f000 0x7ffff7fa7000 r--p 58000 1bd000 /home/pwn/libc.so.6
0x7ffff7fa7000 0x7ffff7fa8000 ---p 1000 215000 /home/pwn/libc.so.6
0x7ffff7fa8000 0x7ffff7fac000 r--p 4000 215000 /home/pwn/libc.so.6
0x7ffff7fac000 0x7ffff7fae000 rw-p 2000 219000 /home/pwn/libc.so.6
0x7ffff7fae000 0x7ffff7fbd000 rw-p f000 0 [anon_7ffff7fae]
0x7ffff7fbd000 0x7ffff7fc1000 r--p 4000 0 [vvar]
0x7ffff7fc1000 0x7ffff7fc3000 r-xp 2000 0 [vdso]
0x7ffff7fc3000 0x7ffff7fc5000 r--p 2000 0 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fc5000 0x7ffff7fef000 r-xp 2a000 2000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7fef000 0x7ffff7ffa000 r--p b000 2c000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffb000 0x7ffff7ffd000 r--p 2000 37000 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
0x7ffff7ffd000 0x7ffff7fff000 rw-p 2000 39000 /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]
pwndbg> 우리가 흔히 vmmap으로 프로세스의 메모리 layout을 보곤 한다
메인 elf 바이너리 , heap , mmap , libc , ld , stack이 주 구성이다.
이제 우리는 각각의 섹션이 어떤 방식으로 어떻게 저 위치에 적재되는 건지 자세히 분석해보고자 한다.
큰 틀을 나누어서 분석한다. 근데 그전에 기본적으로 각각의 섹션은 당연하겠지만, 커널로부터 메모리를 받아와야 한다. 이는 mmap으로 관리가 되며, 각각의 섹션은 모두 mmap 함수로 가져온다. 이를 생각을 하면서 글을 보기 바란다.
메인 elf 바이너리
일단 먼저, 메인 elf 바이너리 섹션이다. 이는 PIE와 밀접한 연관이 있다. 완전히 격리된 낮은 주소에 혼자 적재가 된다.
다음글들을 참고하면 된다.
heap
heap이라고 하고 요즘에는 brk섹션이라고 pwn에서는 그런다. 참고로 메인 elf 바이너리 바로 아래에 붙어서 적재된다. 자세한 부분은 다음글들 참조
mmap , libc , ld
얘내들은 한번에 묶는다. 이유는 mmap으로 순서대로 적재 되기때문인데 위에 layout을 실제로 보면,
ld 부터 적재되어서 낮은 주소를 향해 차례대로 따닥따닥 붙어서 mmap으로 할당이 된다. 따라서 얘내들은 한번에 묶는다. 다음 글들 참조
stack
스택은 역시 가장 높은 주소에 격리되어 혼자 적재가 된다. 다음글들 참조