본문으로 바로가기



위는 level3의 힌트입니다. 이힌트를 보고나서 대충 코드 해석을해보자면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
 
int main(int argc, char **argv){ // main 인자값을 받음
 
    char cmd[100]; // cmd라는 100짜리 char형 배열을 만듬
 
    if( argc!=2 ){ // 만약에 argc가 2가아니라면
        printf"Auto Digger Version 0.9\n" ); // 출력 
        printf"Usage : %s host\n", argv[0] ); // 출력
        exit(0); // 나간다
    }
 
    strcpy( cmd, "dig @" ); //문자열을 복사한다. cmd에 dig @를 넣어줌
    strcat( cmd, argv[1] ); //문자열을 추가한다. cmd에 argv[1] 값을 붙여줌
    strcat( cmd, " version.bind chaos txt"); //문자열을 추가해준다. cmd에 version~~내용을 붙여줌
 
    system( cmd ); // cmd값 실행
 
}
cs


여기서 main의 인수인 argc,argv는


argc는 프로그램을 실행할 떄 지정해 준 "명령행 옵션"의 "개수"가 저장되는곳이다.

argv는 프로그램을 실행할 때 지정해 준 "명령행 옵션의 문자열들"이 실제로 저장되는 배열이다.


argc는 옵션을 하나도 입력하지않으면 1이되며 argv의 첫번쨰요소 (argv[0])는 항상 "프로그램 자신의 파일명"이다.


이 autodig파일을 찾아서 권한을 확인해보면 SetUid인것을 알 수 있다.



그렇다면 autodig를 실행하는동안 동시에 /bin/bash나 /bin/my-pass를 실행하면 될것이다. 이것에대한 힌트는 아래에있다.

1. 동시에 여러 명령어를 사용하려면?

2. 문자열 형태로 명령어를 전달하려면?


(1번) 동시에 여러 명렁어를 사용하는것에는 명령어;명령어 혹은 명령어|명령어 이다.


(2번) 그리고 문자열 형태로 명령어를 전달하는것은 쉽다. 그냥 "명령어"이렇게 사용하면되는데 이것을 구지 이용하는이유는 그냥 명령어를 주게된다면 공백별로 끊어서 인식하는데 저렇게 명령어를 전달한다면 공백까지 하나의명령으로 인식한다. 이것을 저코드에 사용하면된다.


저코드에서 argv[1]를 그냥 cmd에 붙여넣게된다. argv[1]의값은 첫번째 우리가준 인자값이된다. (argv[0]은 프로그램파일명) 그러므로 저부분에서 asdf | /bin/my-pass 이렇게 치게된다면 최종적으로 cmd에는 dig @ asdf | bin/my-pass version.bind chaos txt이렇게 된다. 어차피 이것을 리눅스에서 치는것이나 마찬가지니까 dig @ asdf 이렇게 아무의미없는게 실행된다음 그상태에서 bin/my-pass가 실행될것이다. 그렇다면 그값이 출력되고 그것은 level4의 비밀번호일것이다.

그래서결국 우리가쳐야될 명령어는 autodig "아무말 | bin/my-pass" 이렇게된다. 근데 여기서 bin/bash를하면 안된다. 그이유는 아무래도 bin/bash가 실행된다음에 다시 SetUID권한을 돌려주면서 그냥 level3으로 바뀌어서 그런듯 싶다.

< 만약에 그냥 autodig asdf|bin/my-pass 이런식으로 쳤다면 앞의명령이 다끝나서 SetUID를 반납하고난뒤 bin/my-pass가 실행되서 그냥 level3의 비밀번호가 나온다. 공백을 사용한다면 다음값이 argv[2]에 들어가므로 실패.>




후기 // 처음과는 다르게 풀이형식으로 썻습니다. 그이유는 처음본내용이많고 혼자서 문제를 풀면서 블로그를 정리하기에는 제가 부족한것 같습니다. 그래서 이제는 다풀고나서 답이 가까운 풀이만 적으려고합니다.


참고 사이트 : http://sangchul.kr/112, http://mwultong.blogspot.com/2006/12/c-argc-argv-main-function-parameter.html, http://gday2code.tistory.com/72