이번에도 어김없이 level3 디렉터리에 가서 hint를 확인합니다.
autodig의 소스 랍니다. 그렇다면 autodig라는 파일을 찾아야 겠죠?
find를 이용합니다. 전처럼 유저네임 level4를 이용하여 찾을 수도 있지만 이번에는 다르게 가볼게요.
find / -name autodig 2>/dev/null 을 입력합니다.
이번에도 level4 SetUid가 지정되어 있군요. 단순히 실행하면 버전이 출력됩니다.
그럼 어떻게 해야 될까요??? 우선 코드를 다시 한 번 살펴 볼게요
int main(int argc, char **argv)
argc = argument count, main 함수에 전달 된 인자의 개수
argv = argument vector, 가변적인 개수의 문자열
입니다. 단순히 실행했을 때 Version 0.9가 출력되는 것을 보면, if( argc ! = 2) 구문이 실행되는 것이죠.
argc 가 인자의 개수이므로, autodig 실행시에 두개의 인자를 붙여주면 된다는 겁니다. 그러면 밑의 코드인 system(cmd); 가 실행된다는 거죠.
이제 more hints를 봅시다.
1. 동시에 여러 명령어를 사용하려면?
지금까지 클리셰로 보아 /bin/bash my-pass를 사용해야한다는 느낌이 오실겁니다.
명령어를 붙여쓰려면 ; (세미콜론)을 사용하시면 됩니다.
/bin/bash;my-pass 란 결과가 나오죠.
./autodig /bin/bash;my-pass 라고 쳐볼까요?
엥? level3의 패스워드가 그대로 나오네요?
./autodig ;/bin/bash;my-pass 는요?
이건 버전이 그대로 출력되는 군요.
; (세미콜론) 다음에 있는 명령어만 실행을 하는 것 같습니다. 이 문제를 해결하기 위해서는 힌트 2번으로 가야합니다.
2. 문자열 형태로 명령어를 전달하려면?
결론부터 말하면 답은 ""(큰따옴표)로 묶는 것입니다.
./autodig "/bin/bash;my-pass" 를 입력하면,
"suck my brain" 이라는 암호를 얻을 수 있습니다.