-
[Pwnkr] Cmd1 Write-up표튜터와 함께하는 Pwnable/Pwnable.kr Write-up 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
< 번외 >
이러한 느낌을 이용해서~
이렇게도 우회할 수 있다고 한다
반응형'표튜터와 함께하는 Pwnable > Pwnable.kr Write-up' 카테고리의 다른 글
[Pwnkr] Blukat Write-up (0) 2019.04.15 [Pwnkr] Black Jack Write-up (0) 2019.04.15 [Pwnkr] Lotto Write-up (0) 2019.04.03 [Pwnkr] Leg Write-up (0) 2019.04.02 [Pwnkr] Shellshock Write-up (0) 2019.04.01 댓글