Write-up

[pwnable.kr] cmd1 write-up

ch4rli3kop 2018. 1. 17. 00:14
반응형

문제는 위와 같습니당. PATH 환경변수와 관련이 있는 문제인가 봅니당.

요구하시는 대로 ssh로 접속하면 다음과 같은 코드를 볼 수 있습니당.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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=/fuckyouverymuch");
    if(filter(argv[1])) return 0;
    system( argv[1] );
    return 0;
}
 
cs

인자로 뭔가를 받아서 그러를 실행시키네요. 물론 중간에 filter라는 함수로 필터링을 시킵니당. filter라는 함수의 리턴 값이 0이어야 우리는 system 함수를 이용해서 이러쿵저러쿵 할 수 있겠습니다. 

filter 함수를 자세히 보아봅시당. strstr 이라는 함수가 핵심이겠네요. strstr 함수에 대한 설명은 다음과 같습니다. 

간단하게 설명하면 뒤에 오는 문자열이 앞에 있는 문자열에 존재할 경우에는 그에대한 인덱스 값을, 존재하지 않을 경우에는 null 값을 리턴해 준다는 겁니당.


우리의 경우는 filter 의 리턴 값인 r 이 0이어야 하므로, strstr(cmd, 'mandu') 의 값이 0이 되어야 하겠습니다. 문자열에 flag, sh, tmp 라는 문자열이 없어야합니다. 요런식으로 필터링 기능을 수행하네요.


아무튼 인자로 수행할 명령을 전달해야 하므로, 적당한 명령어를 만들어 봅시다. 권한 상승을 하던, flag 만 읽던 둘 중 하나이겠지요. sh 가 필터링 당하고 있으므로, cat 을 이용해서 flag를 읽도록 합시당. 필터링을 당하는 flag 키워드는 *(와일드 카드)라는 마법의 문자를 이용해서 해결합시다.

적당히 명령어를 만들어보면,

>> ./cmd1 '/bin/cat fla*'

정도가 되겠습니다. 그런데 이 프로그램의 putenv("PATH=/fuckyouverymuch"); 부분에서 PATH 환경변수의 초기화가 일어나서 바로 cat 을 사용할 수가 없습니다. 따라서 cat 이 /bin/cat 에 있다는 사실을 알고 계시는 분들은 /bin/cat 을 하시고, /bin을 붙이시기 싫으신 분들은 환경변수를 바꿔주실 분들은 기존에 존재하던 환경변수를 다시 설정해주는 export 를 이용해서 환경변수를 다시 설정해 주셔도 됩니당.

>> ./cmd1 'export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games; cat fla*'



반응형

'Write-up' 카테고리의 다른 글

[pwnable.kr] random write-up  (0) 2018.01.23
[pwnable.kr] blackjack write-up  (0) 2018.01.22
[angr tutorial] ais3_crackme writeup  (0) 2018.01.14
[SECCON 2017] Powerful_Shell writeup  (0) 2018.01.14
[reversing.kr] ImagePrc writeup  (0) 2018.01.09