No img


[pwnable.kr] Toddler's Bottle - cmd1 문제

Posted by bonggang | 2019. 11. 28. 13:37

문제


https://pwnable.kr/play.php

 

https://pwnable.kr/play.php

 

pwnable.kr

 

 

문제 풀이


접속

 

ssh cmd1@pwnable.kr -p2222

 

 

코드 확인

 

#include <stdio.h>
#include <string.h>

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){
        putenv("PATH=/thankyouverymuch");
        if(filter(argv[1])) return 0;
        system( argv[1] );
        return 0;
}

 

- argc(argument count): 인자의 수

- argv(argument vetor): 인자 벡터

- envp: 시스템 환경 변수

 

main() 함수

- putenv(): 환경 변수 목록 중 변수 값을 수정하거나 추가한다.(프로그램 실행 단위에서만 유효)

- if(filter(argv[1]))의 결과에 따라 system(argv[1])가 실행된다.
(if는 0일 때 거짓, 0이 아닐 때 참으로 동작하기 때문에 filter(argv[1])의 결과가 0이어야 함)

 

filter() 함수

- strstr(): 문자열 안에서 문자열로 검색하는 함수. 문자열을 발견 시 문자열 포인터 반환, 아니면 null 반환

- flag, sh, tmp 문자열이 필터링 되는 것을 확인.

 

 

실행 화면


1. 환경변수 우회

- export 변수명 = 변수 값: 해당 변수명에 변수값을 등록

 

2. 와일드카드 Bypass

- 쉘에서 실행하고자 하는 프로그램 이름의 일부를 생략 후 * 기술.

- putenv()로 경로가 선언되었기 때문에 cat이 있는 경로 /bin/cat의 절대경로를 입력해준다.

 

 


+) 와일드 카드

- *: 일치되는 모든 문자

- ?: 일치하는 하나의 문자

- [문자]*: []로 시작되는 모든 문자

 

+) 환경 변수

- export: 환경변수 리스트 출력

- export 변수명=변수값: 변수명에 변수값 등록

- echo $변수명: 변수명에 해당하는 환경변수 값 출력

- export 변수명=$변수명:변수값: 변수명에 변수 값을 추가

-> 출처: https://akaseon.tistory.com/50

 

리눅스의 환경변수 확인하기

export 명령어를 이용해서 환경변수를 확인 및 수정할수 있다. export -> 환경변수 리스트를 보여준다. export 변수명=변수값 -> 해당 변수명에 변수값을 등록한다. echo $변수명 -> 변수명에 해당하는 환경변수값..

akaseon.tistory.com