IMyoungho 2019. 4. 4. 03:16

이번 문제는 어렵다기보다는 비교적 쉬운 문제에 속한다.

코드를 보도록 하자!!




filter 함수에 우리가 넣는 argv[1]이 인자로 넘어가는데

strstr함수를 이용하여 r을 return하고 있다.

strstr( ) 함수의 return값은 해당 문자열의 위치 포인터인데

이 문제에서는 flag , sh, tmp 중 어떠한 문자열이라도 argv[1]에 속한다면

1을 return하게 된다. 하나라도 발견된다면 참이되어서 main함수에서의

if문을 통과할 수가 없다. 통과하더라도 argv[1]이 system() 함수에서

명령을 실행할 수 있는 문자열이여야 한다.


가장 기본적으로 생각할 수 있는 것은 일단 우리는 flag를 봐야하기

때문에 argv[1]로 "/bin/cat flag"를 생각해볼 수 있다.

하지만 flag가 들어가 있으므로 if문에 걸리게 된다. 

그렇다면 이를 우회하는 방법을 찾아야할 것 같다.


그 방법은 바로 와일드 카드 " * "이다!!

와일드카드는 공동문자 또는 함께문자라고 부르는데

" * " 이후 모든 글자를 포함하여 글자 수에 상관없이

포함하기 때문에 이름을 굳이 일일이 칠 필요가 없다. 


이 문제를 예시로 들자면 f * 를 하게 되면

f로 시작하는 이름을 가진 모든 파일을 의미한다.

( ?는 *과 같은 의미이지만  글자 수 하나만을 의미한다. )


또한 이 와일드카드를 이용하여 명령문을 실행 했을 때

와일드카드 조건을 만족하는 파일들이 여러개라면

그 파일들도 전부 명령이 실행된다. 

< 예시 >


위와 같은 원리를 이용하여 우리는 " cat f* "를 인자로

넣어주게되면 flag에 대한 조건을 우회할 수가 있다!!


또잉??~~?~?~?~?

분명히 맞게 진행해보았는데 제대로 되지 않았다.

그것은 바로 main함수에서 실행된 putenv( )함수였다.



putenv함수에 있는 PATH의 역할은 선언된 경로안에서

 프로그램을 동작하게 해주는데 /thankyouverymuch 내부에

cat과 flag가 없기 때문에 제대로 실행되지 않는 것이다.

즉, 환경변수 PATH를 초기화 시켰다고 볼 수 있다.

( PATH에 /bin이 없어서 참조하지 못해 실행되지 않는 것이다) 



그러므로 우리가 직접 절대경로를 입력해서

실행하거나 환경변수 설정을 해주어야 한다.



나는 전자를 택했다~ㅎ 

이런식으로 FLAG를 볼 수 있었다.





< 후자인 환경변수를 이용한 방법 >

환경변수 PATH가 하는 일은 파일의 위치를 알려주는 역할을 한다.

예를 들어 위에서 나왔듯이 cat이나 ls 등의 명령어는 모두

bin 디렉토리에 존재하는데 환경변수 PATH에 /bin을 기록해놓으면

사용자가 굳이 /bin/cat을 입력하지 않고 cat만 입력하더라도

 환경변수 PATH를 참조하여 명령어가 실행되는것이다. 

참고 : htps://marcokhan.tistory.com/229



< 번외 >

이러한 느낌을 이용해서~


이렇게도 우회할 수 있다고 한다


반응형