본 글은 CVE-2014-6271 쉘쇼크에 대해 배우기 전 기반지식 중
환경변수에 대하여 정리하기 위한 글입니다.
환경변수 (environment Variable)
환경변수는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임,
좀 더 풀이하면 매번 변할 수 있는 동적인 값들의 모임, 시스템의 정보를 가지고 있는 변수입니다.
이는 사용자가 추가, 수정, 삭제등이 가능한 값이라고 말 할 수 있습니다.
포너블을 공부하면서 가장많이 사용하는게 리눅스인데 리눅스의 명령어인
ls, id, cat등이 /bin, /usr/bin 디렉터리에 위치해 있습니다.
하지만 리눅스 명령어를 사용하면서 디렉터리 경로를 명시하고 명령어를 사용한 적은 단 한번도 없습니다.
이는 환경 변수로 명시되어 있기 때문이며,
명시된 환경변수로 사용자가 입력한 명령어를 알아서 디렉터리에서 탐색하고 실행하기에 입력하지
않아도 되는 것입니다.
그럼 터미널에서만 사용이 가능한가?
프로그램에서도 명령어를 실행하는 경우가 있기에 이 또한 프로세스를 로드하고
환경변수를 초기화하여 사용하기에 경로 명시 필요없이 사용이 가능합니다.
이러한 환경변수를 정의하는 방법은 아래와 같습니다.
동작 | 설정 방법 | 예시 |
변수 정의 | 셸 변수 : 변수명=문자열 환경 변수 : export 변수명=문자열 export 변수명=셸변수명 (변수명과 문자열 사이에 공백이 존재해선 안 됨) |
$ data=321 $ export PS1="Linux $" |
변수 정의 해제 | unset 변수 (환경 변수 -> 셸 변수 : export -n 명령 사용) |
$unset data |
전체 변수 출력 | set, env set : 셸 변수, env : 환경 변수 |
$ set $ env |
특정 변수 출력 | echo $변수 | $ echo $HOME |
환경 변수 | 의미 | 환경 변수 | 의미 |
HISTSIZE | 히스토리 저장 크기 | PATH | 명령을 탐색할 경로 |
HOME | 사용자 홈 디렉터리의 절대 경로 | PWD | 작업 디렉터리의 절대 경로 |
LANG | 사용하는 언어 | SHELL | 로그인 셸 |
LOGNAME | 사용자 계정 이름 |
그리고 이러한 환경변수를 셸 환경 CLI에서 특수문자로도 사용이 가능합니다.
특수문자 | 기능 | 예시 |
* | 임의의 문자 또는 문자열 | $ ls t* |
? | 임의의 한 문자 | $ ls t?.txt |
[ ] | 문자의 범위 표시에 해당하는 하나의 문자 | $ ls [0-9]* |
~ | 홈 디렉터리 | $ cd ~user1 |
- | 이전 작업 디렉터리 | $ cd - |
; | 행에 여러 개의 명령 입력 (명령어와 명령어 사이를 구분) |
$ date;ls;pwd |
| | 왼쪽 명령의 결과를 오른쪽 명령의 입력으로 전달 | $ ls -al | more |
' ' | 모든 셸 문자 무시 | $ echo '$HOME' |
" " | $,`,\을 제외한 모든 셸 문자 무시 | $ echo '$HOME' |
` ` | ` `사이에 있는 셸 명령 실행 | $ echo `date` |
\ | 특수문자 기능 제거 | $ echo "\$HOME" |
environ
environ은 무엇인가?
이또한 환경변수인데 환경변수는 여러 명령어들이 배열 형태로 선언되어 있습니다.
즉 환경변수(주소) -> 환경변수 값 형태라고 볼 수 있습니다.
위에서 프로세스를 로드하고 초기화한다고 했는데 리눅스 바이너리는 스택 주소를 포함하지 않기에 주소를
저장하는 코드가 없으면 찾는 것이 불가능한 구조입니다.
이를 해결하기 위해 환경변수를 가리키는 포인터를 별도로 선언해주는 것이 필요했고 이것이 environ이라고
이해를 하였습니다.
(아직 배우는 도중이라 잘못된 부분이 있다면 댓글로 알려주시면 감사드립니다.)
이러한 구조를 갖춤으로써 환경변수를 가리키는 포인터environ은 환경변수 배열을 가르키는 포인터
이중 포인터라고 할 수 있다고 합니다.
Reference
1. https://dreamhack.io/lecture/courses/270
2. https://ko.wikipedia.org/wiki/%ED%99%98%EA%B2%BD_%EB%B3%80%EC%88%98
'Reference > Pwnable_Study' 카테고리의 다른 글
fork()와 exev() (0) | 2022.10.13 |
---|---|
Code Auditing (0) | 2022.10.13 |
NOP Sled(NOP Slide) (0) | 2022.09.30 |
Mprotect - ROP (0) | 2022.09.30 |
FSB(포맷 스트링 버그) fsb2예제 (0) | 2022.07.11 |