저는 대학교 과정의 권한 승격을 위해 노력하고 있습니다. 나는 단순히 ls
비트의 출력을 복사하고 설정하는 간단한 코드를 가지고 있습니다 SUID
.
int main(void){
system("/bin/ls");
return 0;
}
또한 쉘 역할을 할 스크립트를 홈 디렉토리에 추가했습니다.
#!/bin/bash
/bin/sh
또한 첫 번째 변수인 .
변수를 추가했습니다 . $PATH
따라서 C에서 코드를 실행할 때마다 bin
홈 디렉터리의 스크립트가 호출되어야 하지만 변수가 대신 IFS
실행되기 때문에 변수가 완전히 무시됩니다 . 이유는 무엇입니까?/bin/ls
bin ls
답변1
프로그램이 실행되지 않습니다"bin
script"를 홈 디렉토리에 저장합니다. 를 실행합니다 "/bin/ls"
. 시스템 호출은 쉘을 사용하지만 절대 경로 이름도 사용합니다(실제로는POSIX수행 방식은 구현에 따라 정의됩니다.) 쉘의 선택에 PATH
영향을 미칠 수 있는 방법은 없습니다 .ls
POSIX행동에 대해 다음과 같이 IFS
말합니다.
구현이 무시할 수 있는 값
IFS
환경에 있든 없든IFS
환경에서 쉘을 호출할 때 쉘은 다음을 설정해야 합니다.IFS<space>
<tab>
<newline>
호출될 때 까지 .
구현에 대해 문의하는 경우아니요이런 식으로 행동하면 (POSIX는 이러한 관행이 눈에 띌 만큼 자주 발생한다는 것을 암시하기 때문에) 특정 구현이 관련이 있을 것입니다.
답변2
system
명령을 실행하기 위해 호출된 셸이 환경의 값을 /bin/ls
존중 하더라도 해당 명령줄의 구문 분석에는 영향을 미치지 않습니다.IFS
IFS
쉘 명령을 구문 분석하는 데 사용되지 않습니다. 명령은 행 표시 방법을 정확하게 지정하는 쉘 구문을 사용하여 단어로 분할됩니다. (메타 문자는 태그를 종료합니다. 일부 메타 문자도 태그입니다.)토큰화, 존중은 인용
IFS
되지 않은 입력에서만 수행됩니다.어떤 형태로든 대체를 경험합니다.따라서 명령이 이고$cmd
변수 값이cmd
이면/bin/ls
대체IFS
텍스트를 토큰화하는 데 사용됩니다. 하지만:/bin/ls
단어 분할에 in을 사용한/
결과IFS
는 다음과 같습니다.삼성격. 첫 번째는 비어 있습니다. 빈 단어는 명령으로 사용할 수 없으므로 실행을 시도하는 대신 일종의 오류가 발생합니다bin
.