푸르미르

pwnable.kr 14. cmd1 본문

SECURITY/pwnable

pwnable.kr 14. cmd1

((•_•)) 2021. 5. 18. 00:14

문제

 

접속 및 cat cmd.c

 

cmd1.c 의 코드를 잘 살펴보겠다.

 

cmd1.c

main함수부터 보면,

PATH를 /thankyouverymuch로 설정한다. 

그리고 filter함수를 argv[1]인 아이를 매개변수로 전해주며 실행한다. 이 filter함수의 결과가 true(1)이면 프로그램 종료가

되고 그렇지 않으면(false, 0) system( argv[1] ); 명령을 실행한 후 프로그램 종료가 된다. 그렇다면 filter함수는 뭐하는 함수인가?

filter함수에서,

strstr함수는 매개변수로 들어온 아이(문자열)에서 "flag", "sh", "tmp" 이 3개의 문자열이 있을 경우 인덱스의 값을 리턴하지만, 존재하지 않을 경우, null갑을 리턴해주는 함수이다. 그런데 이 strstr함수의 리턴값이 0과 다를 경우, 즉 주어진 문자열들 중  argv[1]에 존재할 경우 r에 더해지게 된다. 그리고 0이 아닌 값인 r 값은 return되게 된다.

 

우리가 원하는 flag값을 얻기 위해서는 이 r값이 0이여야 프로그램을 종료시키지 않고 flag확인 후 종료시킬 수 있다.

-> flag, sh, tmp 문자열이 있어야함.

 

여기서 섣부르게 ./cmd1 "/bin/cat flag" 라 할 경우 망한다. flag가 필터링되기 때문에 볼 수 없다. 

이럴 때 와일드카드(*)문자를 사용하면 flag가 필터링 되지 않고 볼 수 있게 된다. 

./cm1 "/bin/cat fla*" 이렇게 말이다. *(와일드카드)는 앞의 문자들로 시작하는 파일을 가리킬 수 있다. 

이 ssh로 ls를 했을 경우 fl, f, fla로 시작하는 파일은 flag 하나이기 때문에 여러 argv[1]를 생각해낼 수 있다.

 

./cm1 "/bin/cat f*"

./cm1 "/bin/cat fl*"

./cm1 "/bin/cat fla*"

 

 

flag값이 동일하게 등장하는 것을 확인할 수 있다.

'SECURITY > pwnable' 카테고리의 다른 글

WEBHACKING.KR 38  (0) 2021.11.17
pwnable.kr 15. cmd2  (0) 2021.05.18
pwnable.kr 13. lotto  (0) 2021.05.11
pwnable.kr 12. blackjack  (0) 2021.05.11
pwnable.kr 11. coin1  (0) 2021.05.05