environ
environ
- libc base를 알고 있고, 임의 주소 읽기/쓰기가 가능할 때에는 libc의
environ
을 활용할 수 있다.
environ
environ
은 glibc의 전역 변수로, 프로세스의 현재 환경 변수 목록을 가리키는 포인터이다.1 2 3 4 5 6 7 8 9 10
#include <stdio.h> #include <unistd.h> extern char **environ; int main() { printf("environ address: 0x%llx\n", environ); for (char **env=environ; *env != NULL; env++) printf("%s\n", *env); }
- 실행 결과
1 2 3 4 5 6 7
❯ ./test environ address: 0x7ffd868766e8 LC_TERMINAL_VERSION=3.5.14 LANG=C.UTF-8 LC_TERMINAL=iTerm2 USER=mckkk119 ...
- 실행 결과
프로세스의 현재 환경 변수 목록은 스택 영역에 저장되어 있으므로, glibc의
environ
변수는 스택 영역을 가리킨다.1 2 3 4 5 6 7 8 9 10 11 12 13 14
pwndbg> vmmap libc LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA Start End Perm Size Offset File 0x7ffff7d87000 0x7ffff7d8a000 rw-p 3000 0 [anon_7ffff7d87] ► 0x7ffff7d8a000 0x7ffff7db2000 r--p 28000 0 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7db2000 0x7ffff7f47000 r-xp 195000 28000 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7f47000 0x7ffff7f9f000 r--p 58000 1bd000 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7f9f000 0x7ffff7fa0000 ---p 1000 215000 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7fa0000 0x7ffff7fa4000 r--p 4000 215000 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7fa4000 0x7ffff7fa6000 rw-p 2000 219000 /usr/lib/x86_64-linux-gnu/libc.so.6 0x7ffff7fa6000 0x7ffff7fb3000 rw-p d000 0 [anon_7ffff7fa6] pwndbg> x/gx 0x7ffff7d8a000+0x222200 0x7ffff7fac200 <environ>: 0x00007fffffffe398
environ
변수는 libc 영역에 위치1 2 3 4 5 6
pwndbg> vmmap 0x7ffff7fac200 LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA Start End Perm Size Offset File 0x7ffff7fa4000 0x7ffff7fa6000 rw-p 2000 219000 /usr/lib/x86_64-linux-gnu/libc.so.6 ► 0x7ffff7fa6000 0x7ffff7fb3000 rw-p d000 0 [anon_7ffff7fa6] +0x6200 0x7ffff7fbb000 0x7ffff7fbd000 rw-p 2000 0 [anon_7ffff7fbb]
environ
변수가 가진 값은 스택 영역에 위치1 2 3 4 5
pwndbg> vmmap 0x00007fffffffe398 LEGEND: STACK | HEAP | CODE | DATA | WX | RODATA Start End Perm Size Offset File 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] +0x20398
- 임의 주소 읽기 권한을 가지고 있다면 glibc의
environ
변수를 활용해 스택의 주소를 leak할 수 있다. 또한, 스택으로부터 stack canary 등 유용한 값들을 더 얻을 수 있다. - 임의 주소 쓰기 권한을 가지고 있다면 스택에 존재하는 특정 함수의 반환 주소를 덮어쓰는 등의 행위를 할 수 있다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.