WARGAME/FTZ

FTZ level3 풀이

msh1307 2022. 2. 15. 21:47

*FTZ를 공부하면서 배운 것들을 정리했습니다. 틀린 정보가 있을 수 있습니다.

계정/비번: level3/can you fly?

 

로그인하고 힌트 확인해보겠습니다.

C언어로 짜여진 프로그램이네요. 

main함수에 argc, argv 파라미터가 있는 걸 확인할 수 있습니다. 여기서 argc는 argument counts로 파라미터의 개수를 의미합니다. argv는 arguments vector로 가변적인 개수의 문자열을 말합니다. CLI환경에서 프로그램을 실행시킬 때, 띄어쓰고 인수를 전달해주는 데, 그때 그 인수들이 문자열 형태로 argv에 전달됩니다. 전달인자가 없으면 argv[0]엔 항상 실행 경로가 들어가기 때문에 argc는 1이 되죠. 

이 부분 먼저 보면, argc가 2가 아니라면

Auto Digger Version 0.9

Usage : 실행경로 host

가 출력되고 exit으로 프로그램을 종료시키네요. 0은 정상종료를 의미합니다.

전달인자가 하나 있을 때(argc가 2개일 때)만 실행되는 부분입니다. 

stdlib.h의 strcpy와 strcat을 사용하는 걸 확인할 수 있습니다. 

strcpy는 문자열 복사, strcat은 문자열을 이어붙이는 데 사용됩니다. 

strcpy는 실질적으로 \0라는 널문자까지 포함해서 복사합니다. 예를 들어 "Hi"라는 문자열 리터럴이 있다면, Hi\0식으로 저장이 됩니다. C언어는 이 널문자 \0을 이용해 문자열의 끝을 판단합니다. 

strcat은 실질적으로 \0이라는 널문자부터 이어서 복사합니다. 예를 들어 Hi\0라는 문자열이 저장되어 있고, 뒤에 "No"를 이어붙이고 싶다면, strcat은 \0자리부터 No를 복사합니다. 결과적으로는 HiNo\0가 되는 것이죠.  

*참고 : 널문자 \0은 아스키 코드값이 0이다. 문자 형태로 출력해보면 아무런 출력이 발생하지 않아 공백 문자와 혼동하기 쉬운데, 공백 문자의 아스키 코드값은 32로 \0과 다르다. 

보면, cmd라는 배열에 "dig @"를 복사하고 전달인자를 이어붙인 뒤, "version.bind chaos txt"를 이어붙이네요. 

system함수는 명령을 실행하는 함수로 최종적으로 dig @전달인자version.bind chaos txt 라는 명령어를 실행시키겠네요. 

dig에 대해 구글링 해보았습니다. 

 dig (domain information groper)는 도메인 네임 시스템 (DNS) 네임서버에 질의하기 위한 네트워크 관리 명령 줄 인터페이스 툴이다. -위키백과

대충 저런 역할을 하나보네요. 

 

이제 autodig파일을 찾아서 퍼미션 확인해봅시다.

보면 level4로 setuid가 걸려있고, level3 그룹으로 실행권한이 있네요. 

한번 그냥 autodig를 실행시켜봅시다. 

argc가 1이라서 이렇게 출력됩니다. 

 

autodig를 이용해 level4의 비밀번호를 알아내려면, 먼저 제가 원하는 명령을 실행시킬 수 있게 만들어야 합니다. 

이때 사용되는 것이 ;입니다. ;은 명령을 여러개 실행시킬 수 있게 해줍니다. 예를 들어 ls; cd /ls 명령을 먼저 실행시키고 그 후, cd /를 실행시킵니다.

 

이제 인수를 전달해서 제가 원하는 명령을 실행시켜봅시다.

;을 앞뒤에 붙이고, ;my-pass; 를 전달하면 dig @;my-pass;version.bind chaos txt 라는 명령이 실행되겠죠. 

결과적으로 dig @ 명령이 실행되고 그다음 my-pass가 실행되고 뒤에 version.bind chaos txt 은 무시되겠죠. 

한번 ./autodig ;my-pass; 를 실행시켜볼까요? 

왜 안될까요?

전달인자는 띄어쓰기로 구분되니 ;my-pass; 띄어쓰기 없이 전달해줬는데, 왜 level3의 비밀번호가 나올까요? 

그 이유는 ; 때문에 ./autodig 명령이 실행되고 my-pass가 실행되서 그렇습니다. 

그렇다면 어떻게 ;my-pass;를 인자로 전달해 줄 수 있을까요? 

마이크로소프트 공식문서를 한번 읽어보면 답을 쉽게 알 수 있습니다.

https://docs.microsoft.com/ko-kr/cpp/c-language/parsing-c-command-line-arguments?view=msvc-170 

 

C 명령줄 인수 구문 분석

Microsoft C 런타임 시작 코드가 명령줄 인수를 해석하여 argv 및 argc 매개 변수를 만드는 방법을 알아봅니다.

docs.microsoft.com

큰 따옴표로 묶은 문자열은 공백 문자 포함 여부에 상관없이 하나의 인수로 해석됩니다.

답은 바로 ""로 묶어주는 것이죠.

./autodig ";my-pass;"를 실행시켜봅시다.

비밀번호를 얻을 수 있네요. 

'WARGAME > FTZ' 카테고리의 다른 글

FTZ level5 풀이  (0) 2022.02.24
FTZ level4 풀이  (0) 2022.02.17
FTZ level2 풀이  (0) 2022.02.12
FTZ level1 풀이  (0) 2022.02.12
FTZ training 1~10 정리  (0) 2022.02.10