cmd2
cmd2.c
포인트
1. echo 명령어
2. command 명령어
3. read 명령어
삽질 1
filter함수에 걸리진 않지만 /bin/cat hey3를 실행한 결과값을 출력하는 것이기 때문에 Permission denied 된다.
삽질 2
이것 또한 filter함수에 걸리진 않지만 \57bin\cat hey3 출력 후, system("57bin57cat") 실행 실패
* hey3 : flag의 심볼릭 링크
삽질 3
echo -e 를 써서 바로 입력도 가능한데 쉘이 -e옵션을 인식하지 못한다.
정답
1. echo 명령 사용해서 /bin/cat flag 실행한 결과 출력
$(echo "\57")bin$(echo "\57")cat fla* 그대로 출력된다.
"\57"가 '/'로 변경된 후, $(echo /)bin$(echo /)cat fla* 실행된 결과 출력
2. command -p 명령 사용해 디폴트 환경변수 적용해 cat flag 실행한 결과 출력
3. read 명령 사용해 /bin/cat flag 입력받고 실행한 결과 출력
read로 한 줄 읽은 후 x에 넣고 x에 있는 명령 실행
참고
1. 싱글쿼트('') 쌍쿼트("") 차이 - 문자열의 변형
싱글쿼트로 문자열을 감싸면 어떤 해석도 거치지 않고 문자열 그대로 인식
언제 사용? 특수문자 많을 때 유용
쌍쿼트로 문자열을 감싸면 문자열에서 몇 가지 특수 문자(ex. $, `, \)를 재해석함 -> filter에서 걸러지는 것
언제 사용? 변수와 함께 사용할 때, 명령어의 인수로 사용할 문자열에 공백이 포함되어 하나의 인수가 둘로 인식되는 것을 막을 때
ex1.
'$(echo "\57")' : 보내지는 문자열 - $(echo "\57")
"$(echo "\57")" : 보내지는 문자열 - /
ex2.
쌍쿼트로 감싸진 문자열 안에 특수문자('$')를 재해석해서 전달
2. $(echo /) : /을 실행한 후의 값
3. echo -e : 문자열에서 '\'와 조합되는 이스케이프 문자를 인용부호(")로 묶어 인식
4. $(echo /)bin$(echo /)cat fla* 결과
5. 명령 실행 후 오류값 확인
$로 두번 감싸면 filter로 걸러진 오류 결과 출력
6. command 함수
command -p : 명령에 디폴트 환경변수 사용해 실행
7. read 명령어 - 쉘 내부 명령어
read 명령은 한 줄 읽어들여서 x로 넣는다.
echo $x는 문자열 그대로 출력, $x은 명령 실행한 결과 출력
* 쉘 내부 명령어는 PATH 환경변수 없어도 실행 가능