$0 (Shell Special parameter)

Linux

0 views

1. 개요 및 정의

  • 셸이나 스크립트에서 위치 매개변수 중 0번째 인덱스를 의미하며, 프로세스가 호출될 때 argv[0]에 할당된 명령어 이름 또는 경로로 확장된다.

2. 동작 원리

2.1 메모리 및 실행 모델 (argv[0])

  • 프로그램이 실행될 때 execve() 시스템 콜이 호출된다.
    • 이때 인자 배열 argv가 전달되는데, 그 첫번 째 값이 바로 실행 파일의 이름이다.
      • 예시: 사용자가 ls -al을 입력하면:
        • argv[0]: ls (명령어 자체)
        • argv[1]: al (첫 번째 인자)

2.2 셸에서의 확장

  • 셸은 명령어를 해석할 때 변수 확장 과정을 거친다.
    • 셸은 명령어를 해석할 때 변수 확장(Variable Expansion) 과정을 거친다.
      1. 사용자가 $0을 입력한다.
      2. 셸은 이를 현재 실행 중인 프로세스의 이름(예: /bin/sh, bash, ./script.sh 등)으로 치환한다.
      3. 치환된 문자열을 명령어로 실행한다.

2.3 대문자 변환 필터링 우회 (bandit 문제)

  • 입력이 대문자로 강제 변환되는 환경에서 $0가 해법이 되는 이유는 다음과 같다.
    • 필터 동작:
      • 프로그램은 입력값의 알파벳을 대문자로 바꾼다. (예: cat -> CAT)
    • 입력값 $0:
      • 특수문자 $와 숫자 0은 알파벳이 아니므로 대문자 변환 함수의 영향을 받지 않고 그대로 유지된다.
    • 실행 단계:
      • 변환된 문자열 $0system() 함수나 셸의 인자로 전달된다.
    • 셸의 해석:
      • 셸은 $0를 보고 "나 자신의 이름"으로 확장한다. 만약 현재 셸이 sh라면 $0sh로 바뀐다.
    • 결과:
      • sh(소문자) 명령어가 실행되어 새로운 셸을 획득하게 된다.

Loading comments...