0 views
1. 개요 및 정의
- 셸이나 스크립트에서 위치 매개변수 중 0번째 인덱스를 의미하며, 프로세스가 호출될 때 argv[0]에 할당된 명령어 이름 또는 경로로 확장된다.
2. 동작 원리
2.1 메모리 및 실행 모델 (argv[0])
- 프로그램이 실행될 때 execve() 시스템 콜이 호출된다.
- 이때 인자 배열 argv가 전달되는데, 그 첫번 째 값이 바로 실행 파일의 이름이다.
- 예시: 사용자가
ls -al을 입력하면:argv[0]:ls(명령어 자체)argv[1]:al(첫 번째 인자)
- 예시: 사용자가
- 이때 인자 배열 argv가 전달되는데, 그 첫번 째 값이 바로 실행 파일의 이름이다.
2.2 셸에서의 확장
- 셸은 명령어를 해석할 때 변수 확장 과정을 거친다.
- 셸은 명령어를 해석할 때 변수 확장(Variable Expansion) 과정을 거친다.
- 사용자가
$0을 입력한다. - 셸은 이를 현재 실행 중인 프로세스의 이름(예:
/bin/sh,bash,./script.sh등)으로 치환한다. - 치환된 문자열을 명령어로 실행한다.
- 사용자가
- 셸은 명령어를 해석할 때 변수 확장(Variable Expansion) 과정을 거친다.
2.3 대문자 변환 필터링 우회 (bandit 문제)
- 입력이 대문자로 강제 변환되는 환경에서 $0가 해법이 되는 이유는 다음과 같다.
- 필터 동작:
- 프로그램은 입력값의 알파벳을 대문자로 바꾼다. (예:
cat->CAT)
- 프로그램은 입력값의 알파벳을 대문자로 바꾼다. (예:
- 입력값
$0:- 특수문자
$와 숫자0은 알파벳이 아니므로 대문자 변환 함수의 영향을 받지 않고 그대로 유지된다.
- 특수문자
- 실행 단계:
- 변환된 문자열
$0가system()함수나 셸의 인자로 전달된다.
- 변환된 문자열
- 셸의 해석:
- 셸은
$0를 보고 "나 자신의 이름"으로 확장한다. 만약 현재 셸이sh라면$0는sh로 바뀐다.
- 셸은
- 결과:
sh(소문자) 명령어가 실행되어 새로운 셸을 획득하게 된다.
- 필터 동작:
'Linux'카테고리의 다른 글
Loading comments...