포스트

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 라이센스를 따릅니다.

"Linux Userland" 카테고리의 게시물

📄 _IO_FILE
📄 environ
📄 FSOP