다음 소스코드와 아래의 힌트가 있다
다음 코드는 autodig의 소스이다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv){
char cmd[100];
if( argc!=2 ){
printf( "Auto Digger Version 0.9\n" );
printf( "Usage : %s host\n", argv[0] );
exit(0);
}
strcpy( cmd, "dig @" );
strcat( cmd, argv[1] );
strcat( cmd, " version.bind chaos txt");
system( cmd );
}
이를 이용하여 level4의 권한을 얻어라.
more hints.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?
아 눈아프다...
일.단.은 setuid가 level4인 파일을 찾아보자.
아이 갓잇@@@@!!!
이제 저 C 소스코드를 분석해보자
만약 argv[ ]의 인자가 2개인 경우 들어온 인자를 "dig@" 뒤에 붙여준다.
예를들어 sabjilkng 라는 문자열을 넣어주면 dig@sabjilking 가 된다.
그리고 그 다음줄은 version.bind chaos txt라는 문자열을
현재 cmd 명령어 뒤에 추가한다.
우리가 autodig sabjilkng 를 입력하면
$ dig@sabjilkng version.bind chaos txt 라는 명령어를 실행하게 된다.
more hint를 참고하면 동시에 여러 명령어를 사용하려면? 이라고 힌트가 나와 있다.
리눅스에서는 ;(세미콜론)을 사용해서 여러개의 명령어를 ; 로 구분하여 여러 명령어를 입력하고 실행시킬 수 있다.
그렇다면 dig@sabjilkng version.bind chaos txt ; my-pass 명령을 이용하여 level4 의 패스워드를 알아낼 수 있지 않을까?
level3 의 패스워드가 출력되었다 ㅠㅠ
그 이유는 dig가 실행된 다음 my-pass 명령어가 실행되었기 때문이다.
여기서 more hint의 두번째 줄을 보면 문자열 형태로 명령어를 전달하려면? 이라는 힌트가 있다. 그렇다면?
인자를 따옴표로 묶어서 하나의 문자열로 넣어줌으로써 해결할 수 있다.
잇힝 나왔다!!