Mommy! what is PATH environment in Linux?
ssh cmd1@pwnable.kr -p2222 (pw:guest)
没搞懂这题和环境变量有什么关联,不过还是要珍惜这最后一道水题。
先看源码 cmd1.c:
#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;
printf("r= %d", r);
return r;
}
int main(int argc, char* argv[], char** envp){
putenv("PATH=/fuckyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
上述代码段意为 argv[1] 中不含 "flag","sh","tmp",就可以让系统执行 argv[1] 所含字串表示的命令。
注 1. strstr( str1, str2 ) 函数功能为判断 str2 是否为 str1 的子串,是则返回 str2 在 str1 中首次出现的地址;否则返回 NULL 。
注 2. putenv(char *envvar) 用来改变或增加环境变量的内容。参数envvar的格式为envvar=value,如果该环境变量原先存在,则变量内容会依参数envvar改变,否则此参数内容会成为新的环境变量。参数envvar指定的字符串会变成环境变量的一部分,如果修改这个字符串,环境变量也会跟着被修改。
这里调用 putenv 的作用大概只是让我们不能直接打命令而已?...(例如 'cat xxx' 要变成 '/bin/cat xxx')
我们期望执行的命令是 /bin/cat flag
,因为传递的参数中不能出现 "flag" ,所以我们可以用通配符, 构造命令:
cmd1@ubuntu:~$ ./cmd1 "/bin/cat fla?"
mommy now I get what PATH environment is for :)