리눅스

 3916, 1/196 회원가입  로그인  
   ewqqw
   소스 분석 부탁드립니다.

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


이제 막 리눅스랑 코드 배워가는 새내기 입니다. ㅠㅠ
#include <stdio.h>
#include <string.h>

int filter(char *cmd) {
        if (strstr(cmd, "f")) return 1;
        if (strstr(cmd, "sh")) return 1;
        if (strstr(cmd, "tmp")) return 1;
        return 0;
}

extern char **environ;
int main(int argc, char *argv[], char *envp[]) {
        char **p;

        printf("I am king the Godzo...\n");
        printf("I will let you execute a command again.\n");
        printf("However, I am much stronger than Tracer.\n");

        for (p=environ; *p; p++)
                memset(*p, 0, strlen(*p));

        putenv("PATH=/uri_mercy_gaemotham");

        if (filter(argv[1])) {
                printf("caught by filter!\n");
                return 0;
        }

        system(argv[1]);
        return 0;
}

  Hit : 4664     Date : 2017/03/10 12:29



    
해쿨러 이 문제를 풀이하려면 직접 시스템에서 몇개 봐야하는게 있어서 풀이법은 알려드리기 어렵구요
어차피 요청하신게 소스분석이니 살펴보면
1. 환경변수를 모두 삭제합니다
2. PATH에 /uri_mercy_gaemotham 을 등록합니다. 즉 예를들어 cat flag.txt를 하면 /uri_mercy_gaemotham/cat 가 존재하는지 찾게 됩니다
3. 그 후 argv[1]을 인자로 filter를 실행하는데, filter함수를 보면 argv[1]에 f나 sh나 tmp라는 문자열이 존재하지 않아야 하는 것을 알 수 있습니다
4. 그 후 필터링을 통과한 argv[1]을 system()함수의 인자로 실행합니다
2017/03/10  
ewqqw 실행시키니깐 Segmentation fault (core dumped)
가 나오네요...
2017/03/10  
해쿨러 argv[1]을 안넣고 실행하신건 아닌지요
argv[1]이란건 프로그램 실행후에 입력하는것이 아니라 프로그램 실행과 동시에 설정해주는 것입니다
cat text.txt라는 명령에서는 argv[0] = cat, argv[1] = test.txt이고
ls -al 이라는 명령에서는 argv[0] = ls. argv[1] = -al 입니다
2017/03/11