#include <stdio.h>
#include <string.h>
int filter(char* cmd){
int r=0;
r += strstr(cmd, "=")!=0;
r += strstr(cmd, "PATH")!=0;
r += strstr(cmd, "export")!=0;
r += strstr(cmd, "/")!=0;
r += strstr(cmd, "`")!=0;
r += strstr(cmd, "flag")!=0;
return r;
}
extern char** environ;
void delete_env(){
char** p;
for(p=environ; *p; p++) memset(*p, 0, strlen(*p));
}
int main(int argc, char* argv[], char** envp){
delete_env();
putenv("PATH=/no_command_execution_until_you_become_a_hacker");
if(filter(argv[1])) return 0;
printf("%s\n", argv[1]);
system( argv[1] );
return 0;
}
이게 cmd1부터 그렇게 푸니까 힘들게 삽질하고 있었음.
$PATH를 이용할 게 아니라, cmd1에서 /bin/cat 형식으로 전체 경로를 주면서 문제를 푸는 풀이가 많았고
그래서 여기서 '/' filter가 추가된 상황으로 보는 게 맞을 것 같다.
어쨌든, 지금 PATH는 실제로 없는 경로로 설정되어있고,
system 함수가 명령어를 실행하려면 경로까지 포함이 되어야 하는데,
/는 필터가 되어있으므로 /를 헥스값으로 전달하던가 (echo로도 가능)
아니면 command라는 명령어의 -p옵션을 사용할 경우 default PATH 경로로 명령어를 찾게 된다.
그런 식으로 할 수 있고, flag 필터의 경우 *등의 정규표현식을 사용해서 가능하다.
한가지 이해 안 되는건, $PATH명령어가 먹지 않는다.
원래 이런 식으로 하려고 했는데, 변수값으로 바꿔서 뱉지 않음...
위의 경우 system ( $HOME ) 이 실행되고, 결과가 없으므로 안 나오는 것인데,
아래는 아예 not found가 되는 게 이해가 안 됨 ㅠ
예상하기로는, 이어져있는 문자열로 보이지만,
해석은 한 번에 못하는 것 같긴 한데...
'Pwnable.kr' 카테고리의 다른 글
Pwnable.kr [memcpy] (0) | 2019.05.08 |
---|---|
Pwnable.kr [uaf] (0) | 2019.05.03 |
Pwnable.kr [cmd1] (0) | 2019.05.02 |
Pwnable.kr [lotto] (0) | 2019.05.02 |
Pwnable.kr [blackjack] (0) | 2019.05.01 |