리눅스

 3916, 1/196 회원가입  로그인  
   attainer
   level3 풀이 보다가 궁금한게 생겨서 질문합니다.

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=3966 [복사]


다음 코드는 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.
- 동시에 여러 명령어를 사용하려면?
- 문자열 형태로 명령어를 전달하려면?

이 힌트를 보고 페스워드를 얻어내는 문제였는데요.
만약 예로 autodig "/bin/bash"라고 입력해서 실행하게 되면
"dig @/bin/bash version.bind chaos txt"라는 문자열이 cmd로 입력되게 될탠데
풀이들을 보니까 몇몇 분들은 "/bin/bash;my-pass"라는 방법으로 푸셨더라고요... (저는 "|my-pass"라고 풀었는데 말입니다.)
그런데 이렇게 되면 dig명령어의 옵션으로 @/bin/bash라는 값이 들어가는게 아닌가요?
그러니까 앞의 dig명령어와 구분시켜주기 위해서 "|/bin/bash"나 ";/bin/bash"같은 형식으로 명렁어가 들어가야 되는게 아닌가요?
왜 구분 없이 바로 /bin/bash라고 입력해도 되는건지 궁금합니다.

  Hit : 3815     Date : 2011/05/01 10:00



    
attainer 그런데 여기다가 풀이방법 적으면 안될거 같은데 죄송합니다.
저 풀이 방법 안쓰고 질문을 뭐라고 드려야 될지 모르겠어서 그냥 썼습니다 ㅠㅠ;
2011/05/01  
Prox 세미콜론과 파이프를 정확히 이해하시면 해결됩니다~

"/bin/bash;my-pass"
여기에서 /bin/bash 이부분은 사실 들어갈 이유가 없죠 ㅎㅎ

위와같이 입력하면
dig @/bin/bash;my-pass version.bind chaos txt <- 이와 같이 실행될테고
그러면 (dig @/bin/bash) 와 (my-pass version.bind chaos txt) 두개를 순서대로 실행한 효과를 보게되니까요.
세미콜론이 앞부분실행-뒷부분실행 역할을 하니깐,
dig 부분이 먼저 실행되어 그 결과를 화면에 출력하고 그다음
my-pass version.bind chaos txt 를 실행하고 결과를 출력합니다.

참고로 my-pass는 argument를 받지 않는 프로그램이기 때문에
my-pass 뒤에 뭘 입력하든 정상적으로 my-pass가 실행됬을때랑 결과가 똑같을꺼에요.


cf.

"|my-pass" 이렇게 풀었을 경우
dig @|my-pass version.bind chaos txt
위와 같은 명령이 실행되고, 실행과정 역시 파이프의 역할만 아시면 되요 (화면출력을 stdin으로)
(1) (dig @) 실행
(2) dig @ 를 실행했을때 화면에 출력될 값을 stdin 으로 넘김(stdin은 키보드입력을 받는 스트림)
(3) 넘겨진 stdin을 가지고 (my-pass version.bind chaos txt) 를 실행

my-pass는 argument를 처리하지 않기 때문에, 말했다시피 명령어의 뒷부분 (version.bind chaos txt)는 무시되구요.
my-pass는 stdin도 읽지 않기 때문에(scanf 같은 함수가 stdin을 읽죠) dig @에서 넘어온 출력도 무시됩니다.

따라서.. 결과적으론 autodig "|my-pass" 를 입력함으로써,
중간에 stdin 넘어오는거랑 뒤에 version 어쩌고 인자붙는거랑은 다 무시되고
system("my-pass") 만 실행됬을 때와 같은 결과를 얻게 됩니다.
2011/05/03  
attainer 답변감사합니다! 이해가 잘 되네요! 2011/05/04